.xls Datei mit Lazarus auslesen [gelöst]

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

.xls Datei mit Lazarus auslesen [gelöst]

Beitrag von corpsman »

Hallo Miteinander,

vor lauter Bäumchen verstehe ich den Wald nicht mehr und brauche jetzt hilfe :(.

Was ich machen Möchte:
-Einlesen einer .xls Datei
-Anzeige der Tabellen (Worksheet)-Liste
-Auswahl einer einzelnen Tabelle
-Zugriff (lesend) auf diverse Zellen in dieser Tabelle

Meine Tabellen sind von Primitivster Natur (sprich nur Strings und Zahlen, keine Formeln, Bilder oder sonst weder Schnickschnack).

Das Ganze würde ich am liebsten in einer Klasse machen welches ungefähr folgendes Interface hat:

Code: Alles auswählen

Type 
  TXLS = Class()
  public
    function LoadFromFile(Filename:String):Boolean; // .slx Laden
    Function GetWorkSheetList():TStringlist; // Liste aller Tabellen
    Function SetWorkSheetByName(Name:String):Boolean; // Auswahl einer Tabelle, false wenn nicht möglich
    Function GetRowCount():Integer; // Ausgabe der Zeilenzahl, der ausgewählten Tabelle (0 falls noch nichts ausgewählt wurde)
    Function GetColCount():Integer;// Ausgabe der Spaltenzahl, der ausgewählten Tabelle (0 falls noch nichts ausgewählt wurde)
    Function GetCell(r,c:integer):String;//  Rückgabe des Zellenwertes als String
  end;
Nach einigem Googeln ist klar das Package FPSpreadsheet soll das können.

Also habe ich dieses installiert und als Requirements in mein Projekt eingetragen, einen Button gesetzt und eine .xls Datei mit 3 Arbeitsblättern erstellt (siehe Anlage).

Dann kommt folgender Test-Code:

Code: Alles auswählen

Procedure TForm1.Button2Click(Sender: TObject);
Var
  f: String;
  WB: TsWorkbook;
  s: String;
  i: Integer;
Begin
  f := 'C:\Temp\test.xls';
  wb := TsWorkbook.Create;
  Try
    wb.ReadFromFile(f);
  Except
    On av: exception Do Begin
      showmessage(av.Message);
      wb.free;
      exit;
    End;
  End;
  s := '';
  For i := 0 To wb.GetWorksheetCount - 1 Do Begin
    s := s + wb.GetWorksheetByIndex(i).Name;
  End;
  showmessage(s); 
End; 
Zu Meiner Überraschung zeigt mir die Messagebox aber nicht die 3 Tabellen namen, sondern nur den Dateinamen an.

Das Beispiel "fpsctrls" kann ich compilieren und die Widgets zeigen auch den Korrekten Inhalt des .xls Files an. Doch das muss doch auch ohne gehen, ...

Könnt ihr mir sagen was ich hier übersehen / vergessen habe, dass ich nicht mal die 3 Tabellennamen anzeigen kann ?
Dateianhänge
test.zip
Das Excel Sheet das ich einlesen möchte...
(22 Bytes) 72-mal heruntergeladen
Zuletzt geändert von corpsman am Do 30. Jul 2020, 11:13, insgesamt 1-mal geändert.
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: .xls Datei mit Lazarus auslesen

Beitrag von corpsman »

Oh mann, wie immer liegt es nur an einer Kleinigkeit.

Wer die Doku ordentlich liest, der stellt fest, dass fpspreadsheet von sich aus kein einziges Dateiformat kann, erst wenn man die entsprechende Formate 1 mal irgendwo einbindet geht es.

In meinem Fall bedeutet dies

Code: Alles auswählen

ueses fpsallformats;
und schon geht es :idea:
--
Just try it

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

Re: .xls Datei mit Lazarus auslesen

Beitrag von wp_xyz »

corpsman hat geschrieben:
Do 30. Jul 2020, 11:12
Wer die Doku ordentlich liest, der stellt fest, dass fpspreadsheet von sich aus kein einziges Dateiformat kann, erst wenn man die entsprechende Formate 1 mal irgendwo einbindet geht es.

In meinem Fall bedeutet dies

Code: Alles auswählen

ueses fpsallformats;
und schon geht es :idea:
Wenn du nur xls (wahrscheinlich die Version von Excel97) einlesen willst, bindest du dir damit zuviel unnötigen Code ins Programm. Nimm stattdessen die unit "xlsbiff8".

Ich würde mir trotzdem den geschilderten Fall anschauen, dass du den Dateinamen angezeigt kriegst statt der Tab-Namen. Ich war der Meinung, dass ohne Reader ein Fehler auftreten sollte. Könntest du bitte dein Projekt nochmals hochladen, das im ersten Beitrag schein leer zu sein.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: .xls Datei mit Lazarus auslesen [gelöst]

Beitrag von corpsman »

Im ersten Beitrag habe ich auch nur das .xls hochgeladen.

Aller Relevanter Code steht im Beitrag.

Einfach ein leeres Projekt nehmen eine der fpspreadsheet komponenten drauf ziehen und wieder löschen, ein Button2 erstellen und im onClick Event den Code rein. schon kann man es sehen.

Aktuell kämpfe ich mich durch das Auslesen der Tabelle. einfach wie ein Stringgrid geht es nicht, aber man kann über alle Zellen Iterieren das ist schon mal ein Anfang ;)
--
Just try it

PascalDragon
Beiträge: 830
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: .xls Datei mit Lazarus auslesen [gelöst]

Beitrag von PascalDragon »

Du kannst dir vielleicht auch bei dem Projekt Leu Inspiration holen. Das ist ein Spreadsheet Programm für Amiga. Es verwendet zwar nicht Lazarus, sondern Amigas MUI direkt, aber du kannst dir zumindest anschauen wie man mit fpSpreadsheet arbeitet.
FPC Compiler Entwickler

Antworten