Hier ist ein Konsolen-Beispiel, in dem ein Spreadsheet mit zwei Seiten erzeugt wird: Jede Seite enthält in Zelle A1 einen Hinweis auf den Namen der Seite (Tabelle 1 oder 2). Wenn du weiter unten in den CSVParams den SheetIndex auf 1 einstellt, enthält die Datei die Seite mit dem Hinweis auf "Tabelle 2" -- CSVParams funktionieren also.
Code: Alles auswählen
program mycsvwrite;
{$mode objfpc}{$H+}
uses
Classes, SysUtils, fpstypes, fpspreadsheet, fpscsv;
var
MyWorkbook: TsWorkbook;
MyWorksheet: TsWorksheet;
MyDir: string;
begin
MyDir := ExtractFilePath(ParamStr(0));
MyWorkbook := TsWorkbook.Create;
try
// Tabelle 1
MyWorksheet := MyWorkbook.AddWorksheet('Tabelle 1');
MyWorksheet.WriteText(0, 0, 'Dieser Text steht auf "Tabelle 1"');
// Tabelle 2
MyWorksheet := MyWorkbook.AddWorksheet('Tabelle 2');
MyWorksheet.WriteNumber(0, 1, 1.0);
MyWorksheet.WriteText(0, 0, 'Und dieser Text steht auf "Tabelle 2"');
CSVParams.SheetIndex := 1;
CSVParams.Delimiter := #9;
CSVParams.FormatSettings.DecimalSeparator := '.';
CSVParams.NumberFormat := '%.2f'; // Schreibe Zahlen mit 2 Dezimalstellen
CSVParams.QuoteChar := '''';
MyWorkbook.WriteToFile(MyDir + 'test.csv', sfCSV, true);
finally
MyWorkbook.Free;
end;
end.
Möglicherweise enthält deine Test-Datei nur 1 Seite? Die test.xlsm, die du früher einmal hochgeladen hast, jedenfalls enthält nur 1 Sheet. (Übrigens, warum ist die Datei plötzlich nicht mehr im Forum? Es könnte ja sein, dass jemand mal auf diesen Thread stößt und die Datei sehen möchte...).
Der Zusammenhang zwischen Workbook/Worksheet und CSVParams ist nicht offensichtlich. Je nach Dateiformat, erzeugt das Workbook eine spezielle Writer-Klasse, um sich im entsprechenden Format in die Datei zu schreiben. Welches Format genommen wird, kann man (u.a.) durch den Formatparameter, hier sfCSV, angeben. Der spezielle Writer für CSV holt sich zusätzliche Parameter aus dem Record CSVParams.
Wegen des +1: Nein, -1 ist schon richtig. Wenn das Workbook z.B. 2 Seiten enthält, haben diese die Nummern 0 und 1, eben weil die Nummerierung mit 0 beginnt - die Nummer der letzen Seite ist also um 1 niedriger als die Anzahl der Seiten.
Woher ich das alles weiß? Weil ich es selbst geschrieben habe. Ansonsten steht das auch im wiki:
http://wiki.lazarus.freepascal.org/FPSp ... _CSV_files
Dein Code zum Speichern aller Seiten ist prinzipiell richtig, allerdings sind die Dateinamen nicht gut: Da diese sich in der Uhrzeit mit Sekundenauflösung unterscheiden, das Speichern aber wesentlich schneller abläuft als 1 Sekunde, bekommen alle Dateien in der Regel denselben Namen. Hänge doch den Seitennamen mit an den Dateinamen, dann wird es eindeutig:
Code: Alles auswählen
for i = 0 to wb.GetWorksheetCount-1 do
wb.WriteToFile('C:\TEMP\CSVFiles'+FormatDateTime('yyyymmdd_hhnnss', now)+'_Test_'+wb.GetWorksheetByIndex(i).Name+'.csv');