"Einfach" neue Zeile an Exceltabelle anhängen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
GummiQ
Beiträge: 4
Registriert: Mo 17. Apr 2023, 13:45

"Einfach" neue Zeile an Exceltabelle anhängen

Beitrag von GummiQ »

Tabelle_2.JPG
Tabelle_2.JPG (109.12 KiB) 352 mal betrachtet
Tabelle_1.JPG
Tabelle_1.JPG (123.37 KiB) 352 mal betrachtet
Tabelle_3.JPG
Tabelle_3.JPG (108.19 KiB) 352 mal betrachtet
Hallo zusammen,

wie der Titel sagt, suche ich eine einfache Möglichkeit Daten (neue Zeile) an eine existierende Exeltabelle anzufügen.
Mit fpspreadsheet habe ich mich ein wenig auseinandergesetzt, scheitere aber leider.
Die Tabelle enthält Überschriften, und ansonsten nur Text. Zahlen werden (per Zellformatierung) auch auf "Text" gesetzt.
Später wird eine andere Software eine SQL-Abfrage an die Tabelle stellen.
Eigentlich braucht es keine visuelle Komponente, was die Tabelle angeht, aber ich habe trotzdem, da ich nicht sicher bin ob es auch ohne geht, einen Worksheetgrid.
Ich kann die Tabelle laden, und auch Werte eintragen.
Aber ich habe Probleme exakt die letzte, gefüllte Zeile zu identifizieren, um dann darunter eine neue Zeile anzufügen.
Ab und zu habe ich dazwischen eine Leerzeile.
Es wird auch eine Spalte mehr ausgefüllt, als eigentlich da ist.
Oder kann ich pauschal colcount -1 nehmen?
Es scheint, dass rowcount & colcount bei 1 anfangen zu zählen.

Org. Tabelle:
download/file.php?mode=view&id=7987


Ich lese die Anzahl der Zeilen & Spalten aus mit:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
   Tabelle.LoadFromSpreadsheetFile(filename);
   Spalte := Tabelle.ColCount;
   Zeile := Tabelle.RowCount;
   showmessage('Anzahl Zeilen: ' + inttostr(Zeile) +', Anzahl Spalten: ' + inttostr(Spalte));
end; 
Nach Buttonklick:
download/file.php?mode=view&id=7988


Da wird jeweils schon eine Zeile und eine Spalte mehr angezeigt, als ausgefüllt ist...

Auf "Knopfdruck" schreibe ich dann Testdaten:

Code: Alles auswählen

  for x := 1 to Spalte do
  begin
    Tabelle.Cells[X,Zeile] := ('Test' + inttostr(X));
  end; 
Ergebnis sieht so aus:
download/file.php?mode=view&id=7986


Danke im Voraus für Tips und Hinweise
Michael

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

Re: "Einfach" neue Zeile an Exceltabelle anhängen

Beitrag von wp_xyz »

Um die letzte verwendete Zeile zu bestimmen, gibt es die Worksheet-Method GetLastRowIndex, entsprechend auch für die Spalten GetlastColIndex. 1 draufaddiert, und du hast die erste komplett leere Zeile (bzw. Spalte).

Insgesamt geht das dann etwa so wie folgt (ohne Benutzeroberfläche):

Code: Alles auswählen

program project1;

uses
  FPSpreadsheet, FPSTypes, xlsxOOXML;
var
  workbook: TsWorkbook;
  worksheet: TsWorksheet;
  lastrow: Cardinal;
  newrow: Cardinal;
begin
  workbook := TsWorkbook.Create;
  try
    // Read the file
    workbook.ReadFromFile('test.xlsx');
    worksheet := workbook.GetWorkSheetByIndex(0);

    // Determine the index of the last row
    lastRow := worksheet.GetLastRowIndex;

    // Add new row
    newRow := lastRow + 1;

    // Add data to new row
    worksheet.WriteText(newRow, 0, 'new A');
    worksheet.WriteText(newRow, 1, 'new B');
    worksheet.WriteText(newRow, 2, 'new C');
    worksheet.WriteText(newRow, 5, 'new F');

    // Save to new file (keep the original)
    workbook.WriteToFile('test-new.xlsx', true);
  finally
    workbook.Free;
  end;
end.
Falls du mit dem WorksheetGrid arbeiten willst, würde ich nicht mit ColCount/RowCount arbeiten, da diese nicht unbedingt mit den Spalten-/Zeilenzahlen im drunterliegenden Arbeitsblatt zu tun haben. Du kannst mit Hilfe der Worksheet-Property direkt auf das im Grid angezeigte Worksheet zugreifen und somit das GetLastRowIndex aufrufen. Aber Achtung, da steckt der Teufel im Detail: Die Zellen im TsWorksheet sind immer mit 0 beginnend indiziert, im Grid sind aber die FixedRows vorgelagert, so dass du - wenn diese angezeigt sind - immer 1 draufaddieren musst. Auch sind die Spalten- und Zeilenindizes vertauscht: Grid.Cells[col, row], aber worksheet.WriteText(row, col, text)!

GummiQ
Beiträge: 4
Registriert: Mo 17. Apr 2023, 13:45

Re: "Einfach" neue Zeile an Exceltabelle anhängen

Beitrag von GummiQ »

Guten Morgen zusammen

Hallo wp_xyz, besten Dank für Deinen Tip.
Ich hoffe am Wochenende Zeit zu finden es so zu versuchen.

Das Hauptprogramm ist schon eine GUI-Anwendung.
Aber da für diesen Teil eigentlich kein manueller Eingriff durch den Benutzer vorgesehen/notwendig ist,
kann ich, wenn ich Deinem Beispiel folge und Dich richtig verstehe, fpspreadsheetgrid & fpspreadsheetctrls aus der USES rausschmeissen?
Der "Daten-Eintrageprozess" soll, wenn alles funktioniert, vollautomatisch über ein DirMonitor-Ereignis getriggert werden.
Eine übergeordnete Steuerung erzeugt zyklisch, zu einem undefinierten Zeitpunkt,
eine TXT-Datei, deren Daten dann (nach einigen Manipulationen & Formatierungen) in die Exceltabelle müssen.

Schönes Wochenende
Michael

Antworten