Bearbeiten von Daten aus einer Excel Datei

Für Fragen von Einsteigern und Programmieranfängern...
matzespens
Beiträge: 15
Registriert: Di 15. Feb 2022, 08:19

Bearbeiten von Daten aus einer Excel Datei

Beitrag von matzespens »

Hallo zusammen, ich arbeite gerade an einem kleinen Tool welches eine Excel-Datei einliest, die dann im Anschluss modifiziert werden soll. Es sollen bestimmte Spalten gelöscht werden und durch die Auswahl einer Referenzelle alle Zeilen gelöscht werden, in denen der Inhalt die gleiche oder geringere Anzahl an Zeichen enthält, wie die Referenzzelle. Ich hoffe das war einigermaßen verständlich.

Ich habe mir dazu die Komponente FPSpreadsheet installiert und bin soweit, dass das Einlesen der Datei klappt, man die richtige Tabelle wählen kann und vorerst Spalten einzeln löschen kann. Das Auswerten der Referenzzelle bzgl. der darin enthaltenen Anzahl von Zeichen habe ich auch. Aber jetzt weiß ich nicht wie ich die anderen Zellen der Spalte im Grid mit diesem Wert vergleichen kann und dann die entsprechenden löschen kann. Brauche ich dazu nicht irgendeine Query oder Search Komponente?

Hier noch ein Screenshot vom bisherigen Ergebnis.
FPSpreadsheet.JPG
FPSpreadsheet.JPG (138.28 KiB) 1104 mal betrachtet
Danke schon mal für die Hilfe.

Benutzeravatar
Winni
Beiträge: 1280
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Bearbeiten von Daten aus einer Excel Datei

Beitrag von Winni »



wp_xyz
Beiträge: 4262
Registriert: Fr 8. Apr 2011, 09:01

Re: Bearbeiten von Daten aus einer Excel Datei

Beitrag von wp_xyz »

Es gibt noch eine "Search-Engine", die aber auch nichts anderes macht, als von Zelle zu Zelle zu gehen, und außerdem nur nach Text sucht (siehe Beispiel demo_search im Ordner examples/other/searching der FPSpreadsheet-Installation, sowie https://wiki.lazarus.freepascal.org/FPS ... _replacing).

matzespens
Beiträge: 15
Registriert: Di 15. Feb 2022, 08:19

Re: Bearbeiten von Daten aus einer Excel Datei

Beitrag von matzespens »

Ich danke Euch allen schon mal für die Links.

Ich habe es jetzt hinbekommen, dass zumindest die erste Zeile bei einer kleineren Zeichenanzahl als dem Referenzwert gelöscht wird. Aber die restlichen Zeilen läuft er dann einfach nur durch. Vielleicht habe ich etwas übersehen?

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
   i: integer;
   anzahlZeichen: integer;
begin
  anzahlZeichen:= StrToInt(Edit1.Text);
  for i:= 0 to grid.Worksheet.Rows.Count do
  begin
      //Showmessage(Grid.Worksheet.ReadAsText(i,0));
      If Length(Grid.Worksheet.ReadAsText(i,0)) <= anzahlZeichen then Grid.Worksheet.DeleteRow(i);
  end;
  grid.Row:=1;
end;

Benutzeravatar
Winni
Beiträge: 1280
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Bearbeiten von Daten aus einer Excel Datei

Beitrag von Winni »

Hi!

Erstens darfst Du die Schleife nur bis row.count -1 laufen lassen:
Count und Length sind immer um einen größer als high!

Und zweitens: Wenn Du Elemente in irgendeiner Art von array löscht, musst Du immer von oben nach unten arbeiten. Bei jedem Löschvorgang ändert sich ja sonst der Index der darüberliegenden Daten.

Also:

Code: Alles auswählen

For i := grid.Worksheet.Rows.Count -1 downto 0 do ....

Winni

matzespens
Beiträge: 15
Registriert: Di 15. Feb 2022, 08:19

Re: Bearbeiten von Daten aus einer Excel Datei

Beitrag von matzespens »

Ah, vielen Dank für die Erklärung. Das muss ich mir merken.

Jetzt funktioniert es. :D

Dann kann ich jetzt den nächsten Part in Angriff nehmen. jetzt möchte ich nämlich noch vorgeben welche Spalten gelöscht werden sollen.

Ich versuche es erst mal wieder selbst und melde mich, falls ich wieder hänge.

EDIT (17.02.2022):

So ich habe es geschafft und bin so gut wie fertig. Mein kleines Programm macht alles was es soll, bis auf einen kleinen Fehler am Ende. Ich lade meine Datei übertrage die Werte in ein Stringgrid und verarbeite sie dort dann weiter und übertrage sie anschließend zurück ins Workbook. Aber er fügt mir am Anfang immer noch eine Zeile mit den Werten "0" und "Blatt001" ein. Hier der Screenshot:
tool.JPG
tool.JPG (115.57 KiB) 909 mal betrachtet
Und hier der entsprechende Code dazu:

Code: Alles auswählen

procedure TForm1.WriteBackClick(Sender: TObject);
var
  i: Integer;
 begin
     Grid.Workbook.RemoveAllWorksheets;
     Grid.Workbook.AddWorksheet('Aufmaße');
     For i := 0 to StringGrid.RowCount -1 do
   begin
    Grid.worksheet.WriteText(i, 0, StringGrid.Cells[1,i]);
    Grid.worksheet.WriteText(i, 1, StringGrid.Cells[2,i]);
   end;
end;        
EDIT:

Hat sich erledigt.

matzespens
Beiträge: 15
Registriert: Di 15. Feb 2022, 08:19

Re: Bearbeiten von Daten aus einer Excel Datei

Beitrag von matzespens »

So, mein Programm ist nun soweit erst mal fertig und bereit für den Einsatz.

Vielen Dank nochmal an alle die mir hier weitergeholfen haben.

Eine letzte abschließende Frage habe ich aber noch. Das Öffnen und bearbeiten von ungeschützten Exceldateien klappt ja, aber was muss ich tun um auch die geschützten Dateien zumindest zu öffnen. Die Originaldatei die in meinem Programm verarbeitet werden soll ist nämlich geschützt. Im Moment muss ich also die gewünschte Tabelle in eine neue Excel Datei kopieren und dann speichern bevor ich sie mit meinem Programm bearbeiten kann.

Ich habe die Vermutung, dass es mit dem Package "laz_fpspreadsheet_crypto.lpk" zu tun hat. Das wollte ich deshalb auch schon installieren und bekomme dabei aber die Fehlermeldung, dass ein anderes Package fehlt.
package.JPG
package.JPG (38.91 KiB) 894 mal betrachtet
Ich habe dann danach gesucht und ein Package heruntergeladen, dass mir die Suche ausgespuckt hat, aber das heißt "jujiboutils".

wp_xyz
Beiträge: 4262
Registriert: Fr 8. Apr 2011, 09:01

Re: Bearbeiten von Daten aus einer Excel Datei

Beitrag von wp_xyz »

Die Meldung sagt, dass die Library dcpcrypt nicht bekannt ist. Du kannst die über den Online-Package-Manager nachladen (Menü "Package"). Am einfachsten: in der Liste DCPCrypt suchen, markieren, "Installieren". Das installiert dir allerdings auch zusätzliche nicht-visuelle Komponenten auf die Palette, die du hier zumindest gar nicht brauchst. Daher würde ich nur den Node DCPCrypt aufklappen und nur das Package dcpcrypt.lpk markieren (das sind die "reinen" Verschlüsselungsroutinen), nicht aber dcpcrypt_laz.lpk (das sind die Komponenten), dann "Install".

Wenn ich mich recht erinnere, wird in FPSpreadsheeet das Lesen von verschlüsselten Dateien nur für Excel-xlsx unterstützt, und das auch nur partiell. Ich habe gerade mit Excel 2016 eine Testdatei angelegt und versucht, mit spready einzulesen - das scheiterte an einem Minor-Version-Flag, das in der Datei den Wert 4 hat, aber in der Routine mit 2 erwartet wird...

Wie auch immer: um den xlsx-Crypto-Reader zu aktivieren, musst du, wie schon richtig vermutet, das Package laz_fpspreadsheet_crypto verfügbar machen. Da es kein Designtime-Package ist, reicht es, die Package-Datei einfach zu öffnen. Dann muss in dem aufrufenden Programm die unit xlsxooxml_crypto als letzte Unit, hinter xlsxooxml bzw. fpsallformats angegeben sein. Zum Öffnen der Datei solltest du auf die automatische Formaterkennung verzichten, die evtl das falsche Format findet.

wp_xyz
Beiträge: 4262
Registriert: Fr 8. Apr 2011, 09:01

Re: Bearbeiten von Daten aus einer Excel Datei

Beitrag von wp_xyz »

matzespens hat geschrieben:
Mi 16. Feb 2022, 10:01
Ich lade meine Datei übertrage die Werte in ein Stringgrid und verarbeite sie dort dann weiter und übertrage sie anschließend zurück ins Workbook.
Generell zu deinem Vorgehen: Ich entnehme aus deinem Code, dass du die Spreadsheet-Datei über ein WorksheetGrid lädst. Weiß du, dass du sie in diesem Grid auch direkt bearbeiten kannst? Ein Umkopieren in ein StringGrid ist somit unnötig.

matzespens
Beiträge: 15
Registriert: Di 15. Feb 2022, 08:19

Re: Bearbeiten von Daten aus einer Excel Datei

Beitrag von matzespens »

Klasse, jetzt konnte ich das Crypto package verwenden und zumindest die Datei öffnen. Leider zeigt mir das Grid dann nur unsinnige Daten und auch nur ein Sheet anstatt der 4 Stück die in der Datei enthalten sind.

Danke für den Hinweis mit dem direkten Bearbeiten im WorksheetGrid, aber ich habe mich bewusst für die Methode mit dem umkopieren entschieden, da man so nochmal das Original auf der einen Seite hat um die Werte nochmal prüfen zu können.

wp_xyz
Beiträge: 4262
Registriert: Fr 8. Apr 2011, 09:01

Re: Bearbeiten von Daten aus einer Excel Datei

Beitrag von wp_xyz »

matzespens hat geschrieben:
Fr 18. Feb 2022, 13:09
Klasse, jetzt konnte ich das Crypto package verwenden und zumindest die Datei öffnen. Leider zeigt mir das Grid dann nur unsinnige Daten und auch nur ein Sheet anstatt der 4 Stück die in der Datei enthalten sind.
Welche Excel-Version hat denn deine Dateien geschrieben? Ich habe gerade eine Testdatei gefunden, die wurde mit Excel 2007 verschlüsselt, und die kann mit FPSpreadsheet entschlüsselt werden. Sieh dir das Beispiel selbst an, du findest es in Ordner examples/read_write/ooxmldemo_crypto. Das Passwort für die verschlüsselte Datei encrypted_workboot.xlsx ist "test", falls du die Datei in Excel öffnen willst.

[EDIT]
Ich habe jetzt auch wieder den Thread im englischen Forum, in dem das Entschlüsseln von xlsx-Dateien erstmals erwähnt wurde: https://forum.lazarus.freepascal.org/in ... #msg240989

matzespens
Beiträge: 15
Registriert: Di 15. Feb 2022, 08:19

Re: Bearbeiten von Daten aus einer Excel Datei

Beitrag von matzespens »

Sorry, ich bin vorher nicht dazu gekommen mich nochmal damit auseinander zu setzen. Ich habe jetzt nochmal aus der Originaldatei das erste Sheet kopiert und in eine neue Datei kopiert. Diese lies sich erwartungsgemäß ohne Probleme öffnen. Danach habe ich diese Datei genommen und mit einem Passwort geschützt. Auch diese lies sich wieder öffnen.

Zurück in der Originaldatei habe ich dann festgestellt, dass dort Makros enthalten sind. Ich vermute mal, dass die Probleme also eher daher rühren und nicht vom Schutz der Datei durch ein Passwort.

wp_xyz
Beiträge: 4262
Registriert: Fr 8. Apr 2011, 09:01

Re: Bearbeiten von Daten aus einer Excel Datei

Beitrag von wp_xyz »

Ehrlich gesagt, weiß ich gar nicht 100%-ig, wie sich FPSpreadsheet beim Vorhandensein von Macros verhält, aber ich bin ziemlich sicher, dass die Macros überlesen werden. Daher glaube ich nicht, dass die Lese-Probleme mit den Macros zusammenhängen.

Du schreibst, du hast die Datei passwort-geschützt. Bist du sicher, dass du sie dafür auch verschlüsselt hast? Ist gibt in Excel mehrere Methoden, die Datei zu schützen. Auf jeden Fall ist die xlsx-Datei verschlüsselt, wenn sie nicht mehr im ZIP-Format gespeichert ist, d.h., wenn du die Datei in einem Editor öffnest, dürfen die ersten zwei Zeichen kein "PK" mehr sein.

matzespens
Beiträge: 15
Registriert: Di 15. Feb 2022, 08:19

Re: Bearbeiten von Daten aus einer Excel Datei

Beitrag von matzespens »

Nein verschlüsselt ist die Datei nicht. Nur ein einfacher Passwortschutz gegen Änderungen.

Auch die Originaldatei ist nicht verschlüsselt. Ich habe diese eben mit Notepad++ geöffnet und dort steht ebenfalls PK am Anfang der Datei. Ich muss dort ja auch kein Passwort beim Öffnen angeben. Erst wenn ich bestimmte Bereiche bearbeiten möchte brauche ich das Passwort.

Antworten