You've already forked lazarus-ccr
fpspreadsheet: Initial version of reader/writer for csv files
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3643 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
66
components/fpspreadsheet/examples/csvdemo/csvread.lpi
Normal file
66
components/fpspreadsheet/examples/csvdemo/csvread.lpi
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<CONFIG>
|
||||||
|
<ProjectOptions>
|
||||||
|
<Version Value="9"/>
|
||||||
|
<PathDelim Value="\"/>
|
||||||
|
<General>
|
||||||
|
<Flags>
|
||||||
|
<LRSInOutputDirectory Value="False"/>
|
||||||
|
</Flags>
|
||||||
|
<SessionStorage Value="InProjectDir"/>
|
||||||
|
<MainUnit Value="0"/>
|
||||||
|
<Title Value="csvread"/>
|
||||||
|
<UseAppBundle Value="False"/>
|
||||||
|
</General>
|
||||||
|
<VersionInfo>
|
||||||
|
<StringTable ProductVersion=""/>
|
||||||
|
</VersionInfo>
|
||||||
|
<BuildModes Count="1">
|
||||||
|
<Item1 Name="default" Default="True"/>
|
||||||
|
</BuildModes>
|
||||||
|
<PublishOptions>
|
||||||
|
<Version Value="2"/>
|
||||||
|
<IgnoreBinaries Value="False"/>
|
||||||
|
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
|
||||||
|
<ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
|
||||||
|
</PublishOptions>
|
||||||
|
<RunParams>
|
||||||
|
<local>
|
||||||
|
<FormatVersion Value="1"/>
|
||||||
|
<LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/>
|
||||||
|
</local>
|
||||||
|
</RunParams>
|
||||||
|
<RequiredPackages Count="1">
|
||||||
|
<Item1>
|
||||||
|
<PackageName Value="LazUtils"/>
|
||||||
|
</Item1>
|
||||||
|
</RequiredPackages>
|
||||||
|
<Units Count="1">
|
||||||
|
<Unit0>
|
||||||
|
<Filename Value="csvread.lpr"/>
|
||||||
|
<IsPartOfProject Value="True"/>
|
||||||
|
</Unit0>
|
||||||
|
</Units>
|
||||||
|
</ProjectOptions>
|
||||||
|
<CompilerOptions>
|
||||||
|
<Version Value="11"/>
|
||||||
|
<PathDelim Value="\"/>
|
||||||
|
<Target>
|
||||||
|
<Filename Value="csvread"/>
|
||||||
|
</Target>
|
||||||
|
<SearchPaths>
|
||||||
|
<OtherUnitFiles Value="..\.."/>
|
||||||
|
<UnitOutputDirectory Value="..\lib\$(TargetCPU)-$(TargetOS)"/>
|
||||||
|
</SearchPaths>
|
||||||
|
<Parsing>
|
||||||
|
<SyntaxOptions>
|
||||||
|
<UseAnsiStrings Value="False"/>
|
||||||
|
</SyntaxOptions>
|
||||||
|
</Parsing>
|
||||||
|
<Linking>
|
||||||
|
<Debugging>
|
||||||
|
<DebugInfoType Value="dsDwarf2Set"/>
|
||||||
|
</Debugging>
|
||||||
|
</Linking>
|
||||||
|
</CompilerOptions>
|
||||||
|
</CONFIG>
|
62
components/fpspreadsheet/examples/csvdemo/csvread.lpr
Normal file
62
components/fpspreadsheet/examples/csvdemo/csvread.lpr
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
{
|
||||||
|
csvread.dpr
|
||||||
|
|
||||||
|
Demonstrates how to read a CSV file using the fpspreadsheet library
|
||||||
|
}
|
||||||
|
|
||||||
|
program myexcel2read;
|
||||||
|
|
||||||
|
{$mode delphi}{$H+}
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils, fpspreadsheet, fpscsv;
|
||||||
|
|
||||||
|
var
|
||||||
|
MyWorkbook: TsWorkbook;
|
||||||
|
MyWorksheet: TsWorksheet;
|
||||||
|
InputFilename: string;
|
||||||
|
MyDir: string;
|
||||||
|
i: Integer;
|
||||||
|
CurCell: PCell;
|
||||||
|
begin
|
||||||
|
// Open the input file
|
||||||
|
MyDir := ExtractFilePath(ParamStr(0));
|
||||||
|
InputFileName := MyDir + 'test' + STR_COMMA_SEPARATED_EXTENSION;
|
||||||
|
if not FileExists(InputFileName) then begin
|
||||||
|
WriteLn('Input file ', InputFileName, ' does not exist. Please run excel2write first.');
|
||||||
|
Halt;
|
||||||
|
end;
|
||||||
|
|
||||||
|
WriteLn('Opening input file ', InputFilename);
|
||||||
|
|
||||||
|
CSVParams.ColDelimiter := #9;
|
||||||
|
|
||||||
|
// Create the spreadsheet
|
||||||
|
MyWorkbook := TsWorkbook.Create;
|
||||||
|
MyWorkbook.Options := MyWorkbook.Options + [boReadFormulas];
|
||||||
|
MyWorkbook.ReadFromFile(InputFilename, sfCSV);
|
||||||
|
|
||||||
|
MyWorksheet := MyWorkbook.GetFirstWorksheet;
|
||||||
|
|
||||||
|
// Write all cells with contents to the console
|
||||||
|
WriteLn('');
|
||||||
|
WriteLn('Contents of the first worksheet of the file:');
|
||||||
|
WriteLn('');
|
||||||
|
|
||||||
|
CurCell := MyWorkSheet.GetFirstCell();
|
||||||
|
for i := 0 to MyWorksheet.GetCellCount - 1 do
|
||||||
|
begin
|
||||||
|
if HasFormula(CurCell) then
|
||||||
|
WriteLn('Row: ', CurCell^.Row, ' Col: ', CurCell^.Col, ' Formula: ', MyWorksheet.ReadFormulaAsString(CurCell))
|
||||||
|
else
|
||||||
|
WriteLn('Row: ', CurCell^.Row,
|
||||||
|
' Col: ', CurCell^.Col,
|
||||||
|
' Value: ', UTF8ToAnsi(MyWorkSheet.ReadAsUTF8Text(CurCell^.Row, CurCell^.Col))
|
||||||
|
);
|
||||||
|
CurCell := MyWorkSheet.GetNextCell();
|
||||||
|
end;
|
||||||
|
|
||||||
|
// Finalization
|
||||||
|
MyWorkbook.Free;
|
||||||
|
end.
|
||||||
|
|
67
components/fpspreadsheet/examples/csvdemo/csvwrite.lpi
Normal file
67
components/fpspreadsheet/examples/csvdemo/csvwrite.lpi
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<CONFIG>
|
||||||
|
<ProjectOptions>
|
||||||
|
<Version Value="9"/>
|
||||||
|
<PathDelim Value="\"/>
|
||||||
|
<General>
|
||||||
|
<Flags>
|
||||||
|
<LRSInOutputDirectory Value="False"/>
|
||||||
|
</Flags>
|
||||||
|
<SessionStorage Value="InProjectDir"/>
|
||||||
|
<MainUnit Value="0"/>
|
||||||
|
<Title Value="csvwrite"/>
|
||||||
|
<UseAppBundle Value="False"/>
|
||||||
|
</General>
|
||||||
|
<VersionInfo>
|
||||||
|
<StringTable ProductVersion=""/>
|
||||||
|
</VersionInfo>
|
||||||
|
<BuildModes Count="1">
|
||||||
|
<Item1 Name="default" Default="True"/>
|
||||||
|
</BuildModes>
|
||||||
|
<PublishOptions>
|
||||||
|
<Version Value="2"/>
|
||||||
|
<IgnoreBinaries Value="False"/>
|
||||||
|
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
|
||||||
|
<ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
|
||||||
|
</PublishOptions>
|
||||||
|
<RunParams>
|
||||||
|
<local>
|
||||||
|
<FormatVersion Value="1"/>
|
||||||
|
<LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/>
|
||||||
|
</local>
|
||||||
|
</RunParams>
|
||||||
|
<RequiredPackages Count="1">
|
||||||
|
<Item1>
|
||||||
|
<PackageName Value="LazUtils"/>
|
||||||
|
</Item1>
|
||||||
|
</RequiredPackages>
|
||||||
|
<Units Count="2">
|
||||||
|
<Unit0>
|
||||||
|
<Filename Value="csvwrite.lpr"/>
|
||||||
|
<IsPartOfProject Value="True"/>
|
||||||
|
</Unit0>
|
||||||
|
<Unit1>
|
||||||
|
<Filename Value="..\..\fpscsv.pas"/>
|
||||||
|
<IsPartOfProject Value="True"/>
|
||||||
|
<UnitName Value="fpscsv"/>
|
||||||
|
</Unit1>
|
||||||
|
</Units>
|
||||||
|
</ProjectOptions>
|
||||||
|
<CompilerOptions>
|
||||||
|
<Version Value="11"/>
|
||||||
|
<PathDelim Value="\"/>
|
||||||
|
<Target>
|
||||||
|
<Filename Value="csvwrite"/>
|
||||||
|
</Target>
|
||||||
|
<SearchPaths>
|
||||||
|
<OtherUnitFiles Value="..\.."/>
|
||||||
|
<UnitOutputDirectory Value="..\lib\$(TargetCPU)-$(TargetOS)"/>
|
||||||
|
<SrcPath Value=".."/>
|
||||||
|
</SearchPaths>
|
||||||
|
<Linking>
|
||||||
|
<Debugging>
|
||||||
|
<DebugInfoType Value="dsDwarf2Set"/>
|
||||||
|
</Debugging>
|
||||||
|
</Linking>
|
||||||
|
</CompilerOptions>
|
||||||
|
</CONFIG>
|
322
components/fpspreadsheet/examples/csvdemo/csvwrite.lpr
Normal file
322
components/fpspreadsheet/examples/csvdemo/csvwrite.lpr
Normal file
@ -0,0 +1,322 @@
|
|||||||
|
{
|
||||||
|
csvwrite.dpr
|
||||||
|
|
||||||
|
Demonstrates how to write a CSV file using the fpspreadsheet library
|
||||||
|
|
||||||
|
}
|
||||||
|
program csvwrite;
|
||||||
|
|
||||||
|
{$mode delphi}{$H+}
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils, fpspreadsheet, fpscsv;
|
||||||
|
|
||||||
|
var
|
||||||
|
MyWorkbook: TsWorkbook;
|
||||||
|
MyWorksheet: TsWorksheet;
|
||||||
|
MyRPNFormula: TsRPNFormula;
|
||||||
|
MyDir: string;
|
||||||
|
number: Double;
|
||||||
|
lCol: TCol;
|
||||||
|
lRow: TRow;
|
||||||
|
r: Integer;
|
||||||
|
fmt: String;
|
||||||
|
begin
|
||||||
|
// Open the output file
|
||||||
|
MyDir := ExtractFilePath(ParamStr(0));
|
||||||
|
|
||||||
|
// Create the spreadsheet
|
||||||
|
MyWorkbook := TsWorkbook.Create;
|
||||||
|
MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet');
|
||||||
|
|
||||||
|
//MyWorksheet.WriteColWidth(0, 5);
|
||||||
|
//MyWorksheet.WriteColWidth(1, 30);
|
||||||
|
|
||||||
|
MyWorksheet.WriteRowHeight(0, 3); // 3 lines
|
||||||
|
|
||||||
|
// Turn off grid lines and hide headers
|
||||||
|
//MyWorksheet.Options := MyWorksheet.Options - [soShowGridLines, soShowHeaders];
|
||||||
|
|
||||||
|
// -- currently not working
|
||||||
|
MyWorksheet.Options := MyWorksheet.Options + [soHasFrozenPanes];
|
||||||
|
MyWorksheet.LeftPaneWidth := 1;
|
||||||
|
MyWorksheet.TopPaneHeight := 3;
|
||||||
|
|
||||||
|
// Write some number cells
|
||||||
|
MyWorksheet.WriteUsedFormatting(0, 0, [uffBold, uffNumberFormat]);
|
||||||
|
MyWorksheet.WriteNumber(0, 1, 2.0);
|
||||||
|
MyWorksheet.WriteNumber(0, 2, 3.0);
|
||||||
|
MyWorksheet.WriteNumber(0, 3, 4.0);
|
||||||
|
|
||||||
|
// Write some string cells
|
||||||
|
MyWorksheet.WriteUTF8Text(1, 0, 'First');
|
||||||
|
MyWorksheet.WriteFont (1, 0, 'Arial', 12, [fssBold, fssItalic, fssUnderline], scRed);
|
||||||
|
MyWorksheet.WriteUTF8Text(1, 1, 'Second');
|
||||||
|
MyWorksheet.WriteUTF8Text(1, 2, 'Third');
|
||||||
|
MyWorksheet.WriteUTF8Text(1, 3, 'Fourth');
|
||||||
|
|
||||||
|
// Write current date/time
|
||||||
|
MyWorksheet.WriteDateTime(2, 0, now);
|
||||||
|
|
||||||
|
// Write cell with background color
|
||||||
|
MyWorksheet.WriteUTF8Text(3, 0, 'Text');
|
||||||
|
MyWorksheet.WriteBackgroundColor(3, 0, scSilver);
|
||||||
|
|
||||||
|
// Empty cell with background color
|
||||||
|
MyWorksheet.WriteBackgroundColor(3, 1, scGrey);
|
||||||
|
|
||||||
|
// Cell2 with top and bottom borders
|
||||||
|
MyWorksheet.WriteUTF8Text(4, 0, 'Text');
|
||||||
|
MyWorksheet.WriteBorders(4, 0, [cbNorth, cbSouth]);
|
||||||
|
MyWorksheet.WriteBorders(4, 1, [cbNorth, cbSouth]);
|
||||||
|
MyWorksheet.WriteBorders(4, 2, [cbNorth, cbSouth]);
|
||||||
|
|
||||||
|
// Left, center, right aligned texts
|
||||||
|
MyWorksheet.WriteUTF8Text(5, 0, 'L');
|
||||||
|
MyWorksheet.WriteUTF8Text(5, 1, 'C');
|
||||||
|
MyWorksheet.WriteUTF8Text(5, 2, 'R');
|
||||||
|
MyWorksheet.WriteHorAlignment(5, 0, haLeft);
|
||||||
|
MyWorksheet.WriteHorAlignment(5, 1, haCenter);
|
||||||
|
MyWorksheet.WriteHorAlignment(5, 2, haRight);
|
||||||
|
|
||||||
|
// Red font, italic
|
||||||
|
MyWorksheet.WriteNumber(6, 0, 2014);
|
||||||
|
MyWorksheet.WriteFont(6, 0, 'Calibri', 15, [fssItalic], scRed);
|
||||||
|
MyWorksheet.WriteNumber(6, 1, 2015);
|
||||||
|
MyWorksheet.WriteFont(6, 1, 'Times New Roman', 9, [fssUnderline], scBlue);
|
||||||
|
MyWorksheet.WriteNumber(6, 2, 2016);
|
||||||
|
MyWorksheet.WriteFont(6, 2, 'Courier New', 8, [], scBlue);
|
||||||
|
MyWorksheet.WriteNumber(6, 3, 2017);
|
||||||
|
MyWorksheet.WriteFont(6, 3, 'Arial', 18, [fssBold], scBlue);
|
||||||
|
|
||||||
|
r:= 10;
|
||||||
|
// Write current date/time and test numbers for various formatting options
|
||||||
|
|
||||||
|
inc(r, 2);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfShortDate');
|
||||||
|
MyWorksheet.WriteDateTime(r, 1, now, nfShortDate);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfLongDate');
|
||||||
|
MyWorksheet.WriteDateTime(r, 1, now, nfLongDate);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfShortTime');
|
||||||
|
MyWorksheet.WriteDateTime(r, 1, now, nfShortTime);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfLongTime');
|
||||||
|
MyWorksheet.WriteDateTime(r, 1, now, nfLongTime);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfShortDateTime');
|
||||||
|
MyWorksheet.WriteDateTime(r, 1, now, nfShortDateTime);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, ''dd/mmm''');
|
||||||
|
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'dd/mmm''');
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, ''mmm/yy''');
|
||||||
|
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'mmm/yy');
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfShortTimeAM');
|
||||||
|
MyWorksheet.WriteDateTime(r, 1, now, nfShortTimeAM);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfLongTimeAM');
|
||||||
|
MyWorksheet.WriteDateTime(r, 1, now, nfLongTimeAM);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, nn:ss');
|
||||||
|
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'nn:ss');
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, nn:ss.z');
|
||||||
|
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'nn:ss.z');
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, mm:ss.zzz');
|
||||||
|
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'mm:ss.zzz');
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
|
||||||
|
// Write formatted numbers
|
||||||
|
number := 12345.67890123456789;
|
||||||
|
inc(r, 2);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 1, '12345.67890123456789');
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 2, '-12345.67890123456789');
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfGeneral');
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number, nfGeneral);
|
||||||
|
MyWorksheet.WriteNumber(r, 2, -number, nfGeneral);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixed, 0 decs');
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number, nfFixed, 0);
|
||||||
|
MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 0);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixed, 1 decs');
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number, nfFixed, 1);
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 1);
|
||||||
|
MyWorksheet.WriteFontColor(r, 2, scGray);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixed, 2 decs');
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number, nfFixed, 2);
|
||||||
|
MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 2);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixed, 3 decs');
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number, nfFixed, 3);
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 3);
|
||||||
|
MyWorksheet.WriteFontColor(r, 2, scGray);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixedTh, 0 decs');
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 0);
|
||||||
|
MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 0);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixedTh, 1 decs');
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 1);
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 1);
|
||||||
|
MyWorksheet.WriteFontColor(r, 2, scGray);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixedTh, 2 decs');
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 2);
|
||||||
|
MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 2);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixedTh, 3 decs');
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 3);
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 3);
|
||||||
|
MyWorksheet.WriteFontColor(r, 2, scGray);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfExp, 1 dec');
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number, nfExp, 1);
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
MyWorksheet.WriteNumber(r, 2, -number, nfExp, 1);
|
||||||
|
MyWorksheet.WriteFontColor(r, 2, scGray);
|
||||||
|
MyWorksheet.WriteNumber(r, 3, 1.0/number, nfExp, 1);
|
||||||
|
MyWorksheet.WriteFontColor(r, 3, scGray);
|
||||||
|
MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 1);
|
||||||
|
MyWorksheet.WriteFontColor(r, 4, scGray);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfExp, 2 decs');
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number, nfExp, 2);
|
||||||
|
MyWorksheet.WriteNumber(r, 2, -number, nfExp, 2);
|
||||||
|
MyWorksheet.WriteNumber(r, 3, 1.0/number, nfExp, 2);
|
||||||
|
MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 2);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfExp, 3 decs');
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number, nfExp, 3);
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
MyWorksheet.WriteNumber(r, 2, -number, nfExp, 3);
|
||||||
|
MyWorksheet.WriteFontColor(r, 2, scGray);
|
||||||
|
MyWorksheet.WriteNumber(r, 3, 1.0/number, nfExp, 3);
|
||||||
|
MyWorksheet.WriteFontColor(r, 3, scGray);
|
||||||
|
MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 3);
|
||||||
|
MyWorksheet.WriteFontColor(r, 4, scGray);
|
||||||
|
inc(r,2);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfCurrency, 0 decs');
|
||||||
|
MyWorksheet.WriteCurrency(r, 1, number, nfCurrency, 0, '$');
|
||||||
|
MyWorksheet.WriteCurrency(r, 2, -number, nfCurrency, 0, '$');
|
||||||
|
MyWorksheet.WriteCurrency(r, 3, 0.0, nfCurrency, 0, '$');
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfCurrencyRed, 0 decs');
|
||||||
|
MyWorksheet.WriteCurrency(r, 1, number, nfCurrencyRed, 0, 'USD');
|
||||||
|
MyWorksheet.WriteCurrency(r, 2, -number, nfCurrencyRed, 0, 'USD');
|
||||||
|
MyWorksheet.WriteCurrency(r, 3, 0.0, nfCurrencyRed, 0, 'USD');
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, "$"#,##0_);("$"#,##0)');
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number);
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '"$"#,##0_);("$"#,##0)');
|
||||||
|
MyWorksheet.WriteNumber(r, 2, -number);
|
||||||
|
MyWorksheet.WriteNumberFormat(r, 2, nfCustom, '"$"#,##0_);("$"#,##0)');
|
||||||
|
MyWorksheet.WriteFontColor(r, 2, scGray);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, "$"#,##0.0_);[Red]("$"#,##0.0)');
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number);
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '"$"#,##0.0_);[Red]("$"#,##0.0)');
|
||||||
|
MyWorksheet.WriteNumber(r, 2, -number);
|
||||||
|
MyWorksheet.WriteNumberFormat(r, 2, nfCustom, '"$"#,##0.0_);[Red]("$"#,##0.0)');
|
||||||
|
MyWorksheet.WriteFontColor(r, 2, scGray);
|
||||||
|
inc(r);
|
||||||
|
fmt := '"€"#,##0.0_);[Red]("€"#,##0.0)';
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, '+fmt);
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number);
|
||||||
|
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, UTF8ToAnsi(fmt));
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
MyWorksheet.WriteNumber(r, 2, -number);
|
||||||
|
MyWorksheet.WriteNumberFormat(r, 2, nfCustom, UTF8ToAnsi(fmt));
|
||||||
|
MyWorksheet.WriteFontColor(r, 2, scGray);
|
||||||
|
inc(r);
|
||||||
|
fmt := '[Green]"¥"#,##0.0_);[Red]-"¥"#,##0.0';
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, '+fmt);
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number);
|
||||||
|
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, UTF8ToAnsi(fmt));
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
MyWorksheet.WriteNumber(r, 2, -number);
|
||||||
|
MyWorksheet.WriteNumberFormat(r, 2, nfCustom, UTF8ToAnsi(fmt));
|
||||||
|
MyWorksheet.WriteFontColor(r, 2, scGray);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, _("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)');
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number);
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)');
|
||||||
|
MyWorksheet.WriteNumber(r, 2, -number);
|
||||||
|
MyWorksheet.WriteNumberFormat(r, 2, nfCustom, '_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)');
|
||||||
|
MyWorksheet.WriteFontColor(r, 2, scGray);
|
||||||
|
inc(r, 2);
|
||||||
|
number := 1.333333333;
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 0 decs');
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 0);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 1 decs');
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 1);
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 2 decs');
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 2);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 3 decs');
|
||||||
|
MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 3);
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, hh:mm:ss');
|
||||||
|
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval);
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, h:m:s');
|
||||||
|
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'H:M:s');
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, hh:mm');
|
||||||
|
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'hh:mm');
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, h:m');
|
||||||
|
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'h:m');
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
inc(r);
|
||||||
|
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, h');
|
||||||
|
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'h');
|
||||||
|
MyWorksheet.WriteFontColor(r, 1, scGray);
|
||||||
|
inc(r);
|
||||||
|
|
||||||
|
// Set width of columns 0 to 3
|
||||||
|
MyWorksheet.WriteColWidth(0, 48); // 48 characters, default is 12 --> 4x default width
|
||||||
|
lCol.Width := 24; // 24 characters, default is 12 --> 2x default width
|
||||||
|
MyWorksheet.WriteColInfo(1, lCol);
|
||||||
|
MyWorksheet.WriteColInfo(2, lCol);
|
||||||
|
MyWorksheet.WriteColInfo(3, lCol);
|
||||||
|
|
||||||
|
// Set height of rows 5 and 6
|
||||||
|
lRow.Height := 4; // 4 lines
|
||||||
|
MyWorksheet.WriteRowInfo(5, lRow);
|
||||||
|
lRow.Height := 2; // 2 lines
|
||||||
|
MyWorksheet.WriteRowInfo(6, lRow);
|
||||||
|
|
||||||
|
CSVParams.ColDelimiter := #9;
|
||||||
|
CSVParams.DecimalSeparator := '.';
|
||||||
|
CSVParams.DateTimeFormat := 'YYYYMMDD-HHNNSS';
|
||||||
|
CSVParams.NumberFormat := '%.9f';
|
||||||
|
CSVParams.QuoteChar := '''';
|
||||||
|
|
||||||
|
// Save the spreadsheet to a file
|
||||||
|
MyWorkbook.WriteToFile(MyDir + 'test' + STR_COMMA_SEPARATED_EXTENSION, sfCSV, true);
|
||||||
|
MyWorkbook.Free;
|
||||||
|
end.
|
||||||
|
|
@ -516,14 +516,14 @@ object MainFrm: TMainFrm
|
|||||||
end
|
end
|
||||||
object OpenDialog: TOpenDialog
|
object OpenDialog: TOpenDialog
|
||||||
DefaultExt = '.xls'
|
DefaultExt = '.xls'
|
||||||
Filter = 'Excel spreadsheet (*.xls)|*.xls|Excel XML spreadsheet (*.xlsx)|*.xlsx|LibreOffice/OpenOffice spreadsheet (*.ods)|*.ods|Wikitable (pipes) (.wikitable_pipes)|*.wikitable_pipes|All files (*.*)|*.*'
|
Filter = 'Excel spreadsheet (*.xls)|*.xls|Excel XML spreadsheet (*.xlsx)|*.xlsx|LibreOffice/OpenOffice spreadsheet (*.ods)|*.ods|Comma-delimited files (*.csv)|*.csv|Wikitable (pipes) (.wikitable_pipes)|*.wikitable_pipes|All files (*.*)|*.*'
|
||||||
Options = [ofExtensionDifferent, ofEnableSizing, ofViewDetail]
|
Options = [ofExtensionDifferent, ofEnableSizing, ofViewDetail]
|
||||||
left = 184
|
left = 184
|
||||||
top = 200
|
top = 200
|
||||||
end
|
end
|
||||||
object SaveDialog: TSaveDialog
|
object SaveDialog: TSaveDialog
|
||||||
DefaultExt = '.xls'
|
DefaultExt = '.xls'
|
||||||
Filter = 'Excel spreadsheet (*.xls)|*.xls|Excel XML spreadsheet (*.xlsx)|*.xlsx|LibreOffice/OpenOffice spreadsheet (*.ods)|*.ods|Wikitable (wikimedia) (.wikitable_wikimedia)|*.wikitable_wikimedia'
|
Filter = 'Excel spreadsheet (*.xls)|*.xls|Excel XML spreadsheet (*.xlsx)|*.xlsx|LibreOffice/OpenOffice spreadsheet (*.ods)|*.ods|Comma-delimited file (*.csv)|*.csv|Wikitable (wikimedia) (.wikitable_wikimedia)|*.wikitable_wikimedia'
|
||||||
Options = [ofOverwritePrompt, ofExtensionDifferent, ofEnableSizing, ofViewDetail]
|
Options = [ofOverwritePrompt, ofExtensionDifferent, ofEnableSizing, ofViewDetail]
|
||||||
left = 184
|
left = 184
|
||||||
top = 264
|
top = 264
|
||||||
|
@ -10,7 +10,7 @@ unit fpsallformats;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
xlsbiff2, xlsbiff5, xlsbiff8, fpsopendocument, xlsxooxml, wikitable;
|
xlsbiff2, xlsbiff5, xlsbiff8, fpsopendocument, xlsxooxml, wikitable, fpscsv;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
346
components/fpspreadsheet/fpscsv.pas
Normal file
346
components/fpspreadsheet/fpscsv.pas
Normal file
@ -0,0 +1,346 @@
|
|||||||
|
unit fpscsv;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils,
|
||||||
|
fpspreadsheet;
|
||||||
|
|
||||||
|
type
|
||||||
|
TsCSVReader = class(TsCustomSpreadReader)
|
||||||
|
private
|
||||||
|
FFormatSettings: TFormatSettings;
|
||||||
|
FRow, FCol: Cardinal;
|
||||||
|
FCellValue: String;
|
||||||
|
FWorksheetName: String;
|
||||||
|
protected
|
||||||
|
procedure ProcessCellValue(AStream: TStream);
|
||||||
|
procedure ReadBlank(AStream: TStream); override;
|
||||||
|
procedure ReadFormula(AStream: TStream); override;
|
||||||
|
procedure ReadLabel(AStream: TStream); override;
|
||||||
|
procedure ReadNumber(AStream: TStream); override;
|
||||||
|
public
|
||||||
|
constructor Create(AWorkbook: TsWorkbook); override;
|
||||||
|
procedure ReadFromFile(AFileName: String; AData: TsWorkbook); override;
|
||||||
|
procedure ReadFromStream(AStream: TStream; AData: TsWorkbook); override;
|
||||||
|
procedure ReadFromStrings(AStrings: TStrings; AData: TsWorkbook); override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TsCSVWriter = class(TsCustomSpreadWriter)
|
||||||
|
private
|
||||||
|
FFormatSettings: TFormatSettings;
|
||||||
|
|
||||||
|
protected
|
||||||
|
procedure WriteBlank(AStream: TStream; const ARow, ACol: Cardinal;
|
||||||
|
ACell: PCell); override;
|
||||||
|
procedure WriteDateTime(AStream: TStream; const ARow, ACol: Cardinal;
|
||||||
|
const AValue: TDateTime; ACell: PCell); override;
|
||||||
|
procedure WriteFormula(AStream: TStream; const ARow, ACol: Cardinal;
|
||||||
|
ACell: PCell); override;
|
||||||
|
procedure WriteLabel(AStream: TStream; const ARow, ACol: Cardinal;
|
||||||
|
const AValue: string; ACell: PCell); override;
|
||||||
|
procedure WriteNumber(AStream: TStream; const ARow, ACol: Cardinal;
|
||||||
|
const AValue: double; ACell: PCell); override;
|
||||||
|
|
||||||
|
procedure WriteSheet(AStream: TStream; AWorksheet: TsWorksheet);
|
||||||
|
|
||||||
|
public
|
||||||
|
constructor Create(AWorkbook: TsWorkbook); override;
|
||||||
|
procedure WriteToStream(AStream: TStream); override;
|
||||||
|
procedure WriteToStrings(AStrings: TStrings); override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TsCSVParams = record
|
||||||
|
LineDelimiter: String; // LineEnding
|
||||||
|
ColDelimiter: Char; // ';', ',', TAB (#9)
|
||||||
|
QuoteChar: Char; // use #0 if strings are not quoted
|
||||||
|
NumberFormat: String; // if empty, numbers are formatted as in sheet
|
||||||
|
DateTimeFormat: String; // if empty, date/times are formatted as in sheet
|
||||||
|
DecimalSeparator: Char; // '.', ',', #0 if using workbook's formatsetting
|
||||||
|
SheetIndex: Integer; // -1 for all sheets
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
CSVParams: TsCSVParams = (
|
||||||
|
LineDelimiter: ''; // is replaced by LineEnding at runtime
|
||||||
|
ColDelimiter: ';';
|
||||||
|
QuoteChar: '"';
|
||||||
|
NumberFormat: ''; // Use number format of worksheet
|
||||||
|
DateTimeFormat: ''; // Use DateTime format of worksheet
|
||||||
|
DecimalSeparator: '.';
|
||||||
|
SheetIndex: 0; // Store sheet #0
|
||||||
|
);
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses
|
||||||
|
StrUtils, DateUtils, fpsutils;
|
||||||
|
|
||||||
|
{ -----------------------------------------------------------------------------}
|
||||||
|
{ TsCSVReader }
|
||||||
|
{------------------------------------------------------------------------------}
|
||||||
|
constructor TsCSVReader.Create(AWorkbook: TsWorkbook);
|
||||||
|
begin
|
||||||
|
inherited Create(AWorkbook);
|
||||||
|
FFormatSettings := AWorkbook.FormatSettings;
|
||||||
|
FWorksheetName := 'Sheet1';
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TsCSVReader.ProcessCellValue(AStream: TStream);
|
||||||
|
begin
|
||||||
|
if FCellValue = '' then
|
||||||
|
ReadBlank(AStream)
|
||||||
|
else
|
||||||
|
if (Length(FCellValue) > 1) and (
|
||||||
|
((FCellValue[1] = '"') and (FCellValue[Length(FCellValue)] = '"'))
|
||||||
|
or
|
||||||
|
(not (CSVParams.QuoteChar in [#0, '"']) and (FCellValue[1] = CSVParams.QuoteChar)
|
||||||
|
and (FCellValue[Length(FCellValue)] = CSVParams.QuoteChar))
|
||||||
|
) then
|
||||||
|
begin
|
||||||
|
Delete(FCellValue, Length(FCellValue), 1);
|
||||||
|
Delete(FCellValue, 1, 1);
|
||||||
|
ReadLabel(AStream);
|
||||||
|
end else
|
||||||
|
ReadNumber(AStream);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TsCSVReader.ReadBlank(AStream: TStream);
|
||||||
|
begin
|
||||||
|
// We could write a blank cell, but since CSV does not support formatting
|
||||||
|
// this would be a waste of memory. --> Just do nothing
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TsCSVReader.ReadFormula(AStream: TStream);
|
||||||
|
begin
|
||||||
|
// Nothing to do - CSV does not support formulas
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TsCSVReader.ReadFromFile(AFileName: String; AData: TsWorkbook);
|
||||||
|
begin
|
||||||
|
FWorksheetName := ChangeFileExt(ExtractFileName(AFileName), '');
|
||||||
|
inherited;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TsCSVReader.ReadFromStream(AStream: TStream; AData: TsWorkbook);
|
||||||
|
var
|
||||||
|
n: Int64;
|
||||||
|
ch: Char;
|
||||||
|
nextch: Char;
|
||||||
|
begin
|
||||||
|
FWorkbook := AData;
|
||||||
|
FWorksheet := AData.AddWorksheet(FWorksheetName);
|
||||||
|
n := AStream.Size;
|
||||||
|
FCellValue := '';
|
||||||
|
FRow := 0;
|
||||||
|
FCol := 0;
|
||||||
|
while AStream.Position < n do begin
|
||||||
|
ch := char(AStream.ReadByte);
|
||||||
|
if ch = CSVParams.ColDelimiter then begin
|
||||||
|
// End of column reached
|
||||||
|
ProcessCellValue(AStream);
|
||||||
|
inc(FCol);
|
||||||
|
FCellValue := '';
|
||||||
|
end else
|
||||||
|
if (ch = #13) or (ch = #10) then begin
|
||||||
|
// End of row reached
|
||||||
|
ProcessCellValue(AStream);
|
||||||
|
inc(FRow);
|
||||||
|
FCol := 0;
|
||||||
|
FCellValue := '';
|
||||||
|
|
||||||
|
// look for CR+LF: if true, skip next byte
|
||||||
|
if AStream.Position+1 < n then begin
|
||||||
|
nextch := char(AStream.ReadByte);
|
||||||
|
if ((ch = #13) and (nextch <> #10)) then
|
||||||
|
AStream.Position := AStream.Position - 1; // re-read nextchar in next loop
|
||||||
|
end;
|
||||||
|
end else
|
||||||
|
FCellValue := FCellValue + ch;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TsCSVReader.ReadFromStrings(AStrings: TStrings; AData: TsWorkbook);
|
||||||
|
var
|
||||||
|
stream: TStringStream;
|
||||||
|
begin
|
||||||
|
stream := TStringStream.Create(AStrings.Text);
|
||||||
|
try
|
||||||
|
ReadFromStream(stream, AData);
|
||||||
|
finally
|
||||||
|
stream.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TsCSVReader.ReadLabel(AStream: TStream);
|
||||||
|
begin
|
||||||
|
Unused(AStream);
|
||||||
|
FWorksheet.WriteUTF8Text(FRow, FCol, FCellValue);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TsCSVReader.ReadNumber(AStream: TStream);
|
||||||
|
var
|
||||||
|
dbl: Double;
|
||||||
|
dt: TDateTime;
|
||||||
|
fs: TFormatSettings;
|
||||||
|
begin
|
||||||
|
Unused(AStream);
|
||||||
|
|
||||||
|
// Try as float
|
||||||
|
fs := FFormatSettings;
|
||||||
|
if CSVParams.DecimalSeparator <> #0 then
|
||||||
|
fs.DecimalSeparator := CSVParams.DecimalSeparator;
|
||||||
|
if TryStrToFloat(FCellValue, dbl, fs) then
|
||||||
|
begin
|
||||||
|
FWorksheet.WriteNumber(FRow, FCol, dbl);
|
||||||
|
FWorkbook.FormatSettings.DecimalSeparator := fs.DecimalSeparator;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
if fs.DecimalSeparator = '.'
|
||||||
|
then fs.DecimalSeparator := ','
|
||||||
|
else fs.DecimalSeparator := '.';
|
||||||
|
if TryStrToFloat(FCellValue, dbl, fs) then
|
||||||
|
begin
|
||||||
|
FWorksheet.WriteNumber(FRow, FCol, dbl);
|
||||||
|
FWorkbook.FormatSettings.DecimalSeparator := fs.DecimalSeparator;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// Try as date/time
|
||||||
|
fs := FFormatSettings;
|
||||||
|
if TryStrToDateTime(FCellValue, dt, fs) then
|
||||||
|
begin
|
||||||
|
FWorksheet.WriteDateTime(FRow, FCol, dt);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// Could not convert to float or date/time. Show at least as label.
|
||||||
|
FWorksheet.WriteUTF8Text(FRow, FCol, FCellValue);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{ -----------------------------------------------------------------------------}
|
||||||
|
{ TsCSVWriter }
|
||||||
|
{------------------------------------------------------------------------------}
|
||||||
|
constructor TsCSVWriter.Create(AWorkbook: TsWorkbook);
|
||||||
|
begin
|
||||||
|
inherited Create(AWorkbook);
|
||||||
|
FFormatSettings := AWorkbook.FormatSettings;
|
||||||
|
if CSVParams.DecimalSeparator <> #0 then
|
||||||
|
FFormatSettings.DecimalSeparator := CSVParams.DecimalSeparator;
|
||||||
|
if CSVParams.LineDelimiter = '' then
|
||||||
|
CSVParams.LineDelimiter := LineEnding;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TsCSVWriter.WriteBlank(AStream: TStream; const ARow, ACol: Cardinal;
|
||||||
|
ACell: PCell);
|
||||||
|
begin
|
||||||
|
Unused(AStream);
|
||||||
|
Unused(ARow, ACol, ACell);
|
||||||
|
// nothing to do
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TsCSVWriter.WriteDateTime(AStream: TStream; const ARow, ACol: Cardinal;
|
||||||
|
const AValue: TDateTime; ACell: PCell);
|
||||||
|
var
|
||||||
|
s: String;
|
||||||
|
begin
|
||||||
|
Unused(ARow, ACol);
|
||||||
|
if CSVParams.DateTimeFormat <> '' then
|
||||||
|
s := FormatDateTime(CSVParams.DateTimeFormat, AValue, FFormatSettings)
|
||||||
|
else
|
||||||
|
s := FWorksheet.ReadAsUTF8Text(ACell);
|
||||||
|
AppendToStream(AStream, s);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TsCSVWriter.WriteFormula(AStream: TStream; const ARow, ACol: Cardinal;
|
||||||
|
ACell: PCell);
|
||||||
|
begin
|
||||||
|
// no formulas in CSV
|
||||||
|
Unused(AStream);
|
||||||
|
Unused(ARow, ACol, AStream);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TsCSVWriter.WriteLabel(AStream: TStream; const ARow, ACol: Cardinal;
|
||||||
|
const AValue: string; ACell: PCell);
|
||||||
|
var
|
||||||
|
s: String;
|
||||||
|
begin
|
||||||
|
Unused(ARow, ACol);
|
||||||
|
if ACell = nil then
|
||||||
|
exit;
|
||||||
|
s := ACell^.UTF8StringValue;
|
||||||
|
if CSVParams.QuoteChar <> #0 then
|
||||||
|
s := CSVParams.QuoteChar + s + CSVParams.QuoteChar;
|
||||||
|
AppendToStream(AStream, s);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TsCSVWriter.WriteNumber(AStream: TStream; const ARow, ACol: Cardinal;
|
||||||
|
const AValue: double; ACell: PCell);
|
||||||
|
var
|
||||||
|
s: String;
|
||||||
|
mask: String;
|
||||||
|
begin
|
||||||
|
Unused(ARow, ACol);
|
||||||
|
if ACell = nil then
|
||||||
|
exit;
|
||||||
|
if CSVParams.NumberFormat <> '' then
|
||||||
|
s := Format(CSVParams.NumberFormat, [AValue], FFormatSettings)
|
||||||
|
else
|
||||||
|
s := FWorksheet.ReadAsUTF8Text(ACell);
|
||||||
|
AppendToStream(AStream, s);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TsCSVWriter.WriteSheet(AStream: TStream; AWorksheet: TsWorksheet);
|
||||||
|
var
|
||||||
|
r, c: Cardinal;
|
||||||
|
lastRow, lastCol: Cardinal;
|
||||||
|
cell: PCell;
|
||||||
|
begin
|
||||||
|
FWorksheet := AWorksheet;
|
||||||
|
lastRow := FWorksheet.GetLastOccupiedRowIndex;
|
||||||
|
lastCol := FWorksheet.GetLastOccupiedColIndex;
|
||||||
|
for r := 0 to lastRow do
|
||||||
|
for c := 0 to lastCol do begin
|
||||||
|
cell := FWorksheet.FindCell(r, c);
|
||||||
|
if cell <> nil then
|
||||||
|
WriteCellCallback(cell, AStream);
|
||||||
|
if c = lastCol then
|
||||||
|
AppendToStream(AStream, CSVParams.LineDelimiter)
|
||||||
|
else
|
||||||
|
AppendToStream(AStream, CSVParams.ColDelimiter);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TsCSVWriter.WriteToStream(AStream: TStream);
|
||||||
|
var
|
||||||
|
n: Integer;
|
||||||
|
begin
|
||||||
|
if (CSVParams.SheetIndex >= 0) and (CSVParams.SheetIndex < FWorkbook.GetWorksheetCount)
|
||||||
|
then n := CSVParams.SheetIndex
|
||||||
|
else n := 0;
|
||||||
|
WriteSheet(AStream, FWorkbook.GetWorksheetByIndex(n));
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TsCSVWriter.WriteToStrings(AStrings: TStrings);
|
||||||
|
var
|
||||||
|
stream: TStream;
|
||||||
|
begin
|
||||||
|
stream := TStringStream.Create('');
|
||||||
|
try
|
||||||
|
WriteToStream(stream);
|
||||||
|
stream.Position := 0;
|
||||||
|
AStrings.LoadFromStream(stream);
|
||||||
|
finally
|
||||||
|
stream.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
initialization
|
||||||
|
RegisterSpreadFormat(TsCSVReader, TsCSVWriter, sfCSV);
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
Reference in New Issue
Block a user