fpspreadsheet: Add units (mm, cm, in, pts, lines/chars) for column width and row heights. Update all demos (some issues left).

NOTE: This revision breaks existing code if the worksheet's DefaultRowHeight/DefaultColWidth is changed - value must be in millimeters now. Methods for accessing individual row heiths and column widths are fine, but are marked as deprecated, they use the old units. Optionally a unit parameter can be specified.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4568 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2016-03-18 19:50:40 +00:00
parent 08e1a619ca
commit 5b946b751f
65 changed files with 990 additions and 845 deletions

View File

@ -46,7 +46,6 @@
<ComponentName Value="Form1"/> <ComponentName Value="Form1"/>
<HasResources Value="True"/> <HasResources Value="True"/>
<ResourceBaseClass Value="Form"/> <ResourceBaseClass Value="Form"/>
<UnitName Value="main"/>
</Unit1> </Unit1>
</Units> </Units>
</ProjectOptions> </ProjectOptions>

View File

@ -8,7 +8,7 @@ object Form1: TForm1
ClientWidth = 521 ClientWidth = 521
OnCreate = FormCreate OnCreate = FormCreate
OnDestroy = FormDestroy OnDestroy = FormDestroy
LCLVersion = '1.5' LCLVersion = '1.7'
object PageControl: TPageControl object PageControl: TPageControl
Left = 4 Left = 4
Height = 302 Height = 302

View File

@ -127,6 +127,7 @@ var
i: Integer; i: Integer;
startDate: TDate; startDate: TDate;
maxAge: Integer = 80 * 365; maxAge: Integer = 80 * 365;
f: TField;
begin begin
if FExportDataset <> nil then if FExportDataset <> nil then
FExportDataset.Free; FExportDataset.Free;
@ -137,7 +138,7 @@ begin
FExportDataset := TDbf.Create(self); FExportDataset := TDbf.Create(self);
FExportDataset.FilePathFull := DATADIR + DirectorySeparator; FExportDataset.FilePathFull := DATADIR + DirectorySeparator;
FExportDataset.TableName := TABLENAME; FExportDataset.TableName := TABLENAME;
// FExportDataset.TableLevel := 4; // DBase IV: most widely used. FExportDataset.TableLevel := 4; // DBase IV: most widely used.
FExportDataset.TableLevel := 25; // FoxPro supports FieldType nfCurrency FExportDataset.TableLevel := 25; // FoxPro supports FieldType nfCurrency
FExportDataset.FieldDefs.Add('Last name', ftString); FExportDataset.FieldDefs.Add('Last name', ftString);
FExportDataset.FieldDefs.Add('First name', ftString); FExportDataset.FieldDefs.Add('First name', ftString);
@ -153,6 +154,7 @@ begin
// We generate random records by combining first names, last names and cities // We generate random records by combining first names, last names and cities
// defined in the FIRST_NAMES, LAST_NAMES and CITIES arrays. We also add a // defined in the FIRST_NAMES, LAST_NAMES and CITIES arrays. We also add a
// random birthday. // random birthday.
for i:=1 to StrToInt(EdRecordCount.Text) do begin for i:=1 to StrToInt(EdRecordCount.Text) do begin
if (i mod 1000 = 0) then if (i mod 1000 = 0) then
begin begin
@ -165,8 +167,8 @@ begin
FExportDataset.FieldByName('City').AsString := CITIES[Random(NUM_CITIES)]; FExportDataset.FieldByName('City').AsString := CITIES[Random(NUM_CITIES)];
FExportDataset.FieldByName('Birthday').AsDateTime := startDate - random(maxAge); FExportDataset.FieldByName('Birthday').AsDateTime := startDate - random(maxAge);
FExportDataset.FieldByName('Salary').AsFloat := 1000+Random(9000); FExportDataset.FieldByName('Salary').AsFloat := 1000+Random(9000);
FExportDataSet.FieldByName('Work begin').AsDateTime := EncodeTime(6+Random(4), Random(60), Random(60), 0); // FExportDataSet.FieldByName('Work begin').AsDateTime := 40000+EncodeTime(6+Random(4), Random(60), Random(60), 0);
FExportDataSet.FieldByName('Work end').AsDateTime := EncodeTime(15+Random(4), Random(60), Random(60), 0); // FExportDataSet.FieldByName('Work end').AsDateTime := EncodeTime(15+Random(4), Random(60), Random(60), 0);
FExportDataset.Post; FExportDataset.Post;
end; end;
FExportDataset.Close; FExportDataset.Close;

View File

@ -40,7 +40,6 @@
<Unit0> <Unit0>
<Filename Value="demo_expression_parser.pas"/> <Filename Value="demo_expression_parser.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="demo_expression_parser"/>
</Unit0> </Unit0>
<Unit1> <Unit1>
<Filename Value="..\..\fpsexprparser.pas"/> <Filename Value="..\..\fpsexprparser.pas"/>

View File

@ -27,23 +27,26 @@ begin
worksheet.WriteNumber(0, 0, 1); // A1 worksheet.WriteNumber(0, 0, 1); // A1
worksheet.WriteNumber(0, 1, 2.5); // B1 worksheet.WriteNumber(0, 1, 2.5); // B1
{
worksheet.WriteText(0, 0, 'Hallo'); // A1
worksheet.WriteText(0, 1, 'World'); // B1
}
worksheet.WriteUTF8Text(0, 0, 'Hallo'); // A1 { Select one of these formulas }
worksheet.WriteUTF8Text(0, 1, 'World'); // B1 //cell := worksheet.WriteFormula(1, 0, '=4+5'); // A2
cell := worksheet.WriteFormula(1, 0, '=4+5'); // A2 //cell := worksheet.WriteFormula(1, 0, 'AND(TRUE(), TRUE(), TRUE())');
cell := worksheet.WriteFormula(2, 0, 'AND(TRUE(), TRUE(), TRUE())'); cell := worksheet.WriteFormula(1, 0, 'SIN(A1+B1)');
cell := worksheet.WriteFormula(3, 0, 'SIN(A1+B1)'); //cell := worksheet.WriteFormula(1, 0, '=TRUE()');
cell := worksheet.WriteFormula(4, 0, '=TRUE()'); //cell := worksheet.WriteFormula(1, 0, '=1-(4/2)^2*2-1'); // A2
cell := worksheet.WriteFormula(5, 0, '=1-(4/2)^2*2-1'); // A2 //cell := Worksheet.WriteFormula(1, 0, 'datedif(today(),Date(2014,1,1),"D")');
cell := Worksheet.WriteFormula(6, 0, 'datedif(today(),Date(2014,1,1),"D")'); //cell := Worksheet.WriteFormula(1, 0, 'Day(Date(2014, 1, 12))');
cell := Worksheet.WriteFormula(7, 0, 'Day(Date(2014, 1, 12))'); //cell := Worksheet.WriteFormula(1, 0, 'SUM(1,2,3)');
cell := Worksheet.WriteFormula(8, 0, 'SUM(1,2,3)'); //cell := Worksheet.WriteFormula(1, 0, 'CELL("address",A1)');
cell := Worksheet.WriteFormula(9, 0, 'CELL("address",A1)'); //cell := Worksheet.WriteFormula(1, 0, 'REPT("Hallo", 3)');
cell := Worksheet.WriteFormula(10, 0, 'REPT("Hallo", 3)'); //cell := Worksheet.WriteFormula(1, 0, '#REF!');
cell := Worksheet.WriteFormula(11, 0, '#REF!');
WriteLn('A1: ', worksheet.ReadAsUTF8Text(0, 0)); WriteLn('A1: ', worksheet.ReadAsText(0, 0));
WriteLn('B1: ', worksheet.ReadAsUTF8Text(0, 1)); WriteLn('B1: ', worksheet.ReadAsText(0, 1));
parser := TsSpreadsheetParser.Create(worksheet); parser := TsSpreadsheetParser.Create(worksheet);
try try

View File

@ -40,7 +40,6 @@
<Unit0> <Unit0>
<Filename Value="demo_recursive_calc.pas"/> <Filename Value="demo_recursive_calc.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="demo_recursive_calc"/>
</Unit0> </Unit0>
</Units> </Units>
</ProjectOptions> </ProjectOptions>

View File

@ -32,24 +32,20 @@ begin
worksheet := workbook.AddWorksheet('Calc_test'); worksheet := workbook.AddWorksheet('Calc_test');
worksheet.WriteColWidth(0, 20); worksheet.WriteColWidth(0, 20);
// A1 worksheet.WriteUTF8Text(0, 0, '=B2+1'); // A1
worksheet.WriteUTF8Text(0, 0, '=B2+1'); worksheet.WriteFormula(0, 1, 'B2+1'); // B1
// B1 worksheet.WriteUTF8Text(1, 0, '=B3+1'); // A2
worksheet.WriteFormula(0, 1, 'B2+1'); worksheet.WriteFormula(1, 1, 'B3+1'); // B2
// A2 worksheet.WriteUTF8Text(2, 0, '(not dependent)'); // A3
worksheet.WriteUTF8Text(1, 0, '=B3+1'); worksheet.WriteNumber(2, 1, 1); // B3
// B2
worksheet.WriteFormula(1, 1, 'B3+1');
// A3
worksheet.WriteUTF8Text(2, 0, '(not dependent)');
// B3
worksheet.WriteNumber(2, 1, 1);
workbook.WriteToFile(OutputFile, sfExcel8, true); workbook.WriteToFile(OutputFile, sfExcel8, true);
writeln('Finished.'); writeln('Finished.');
writeln; writeln;
writeln('Please open "'+OutputFile+'" in "fpsgrid".'); writeln('Please open "'+OutputFile+'" in "fpsgrid".');
writeLn('It must show correct calculation results in cells B1 and B2.'); writeLn('It must show correct calculation results in cells B1 and B2.');
ReadLn;
finally finally
workbook.Free; workbook.Free;
end; end;

View File

@ -40,7 +40,6 @@
<Unit0> <Unit0>
<Filename Value="demo_sorting.pas"/> <Filename Value="demo_sorting.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="demo_sorting"/>
</Unit0> </Unit0>
<Unit1> <Unit1>
<Filename Value="..\..\fpsexprparser.pas"/> <Filename Value="..\..\fpsexprparser.pas"/>

View File

@ -289,16 +289,16 @@ var
try try
worksheet := workbook.AddWorksheet('Test'); worksheet := workbook.AddWorksheet('Test');
worksheet.WriteUTF8Text(0, 0, 'E'); worksheet.WriteText(0, 0, 'E');
worksheet.WriteUTF8Text(1, 0, 'E'); worksheet.WriteText(1, 0, 'E');
worksheet.WriteUTF8Text(2, 0, 'C'); worksheet.WriteText(2, 0, 'C');
worksheet.WriteUTF8Text(3, 0, 'B'); worksheet.WriteText(3, 0, 'B');
worksheet.WriteUTF8Text(4, 0, 'D'); worksheet.WriteText(4, 0, 'D');
worksheet.WriteUTF8Text(5, 0, 'D'); worksheet.WriteText(5, 0, 'D');
worksheet.WriteUTF8Text(6, 0, 'A'); worksheet.WriteText(6, 0, 'A');
worksheet.WriteUTF8Text(7, 0, 'B'); worksheet.WriteText(7, 0, 'B');
worksheet.WriteUTF8Text(8, 0, 'C'); worksheet.WriteText(8, 0, 'C');
worksheet.WriteUTF8Text(9, 0, 'A'); worksheet.WriteText(9, 0, 'A');
worksheet.WriteNumber(0, 1, 9); // A2 --> E worksheet.WriteNumber(0, 1, 9); // A2 --> E
worksheet.WriteNumber(1, 1, 8); // B2 --> E worksheet.WriteNumber(1, 1, 8); // B2 --> E
@ -322,7 +322,7 @@ var
WriteLn(#9, 'A', #9, 'B'); WriteLn(#9, 'A', #9, 'B');
for i:=0 to 9 do for i:=0 to 9 do
begin begin
s := worksheet.ReadAsUTF8Text(i, 0); s := worksheet.ReadAsText(i, 0);
n := worksheet.ReadAsNumber(i, 1); n := worksheet.ReadAsNumber(i, 1);
WriteLn(i, #9, s, #9, FloatToStr(n)); WriteLn(i, #9, s, #9, FloatToStr(n));
end; end;
@ -345,16 +345,16 @@ var
try try
worksheet := workbook.AddWorksheet('Test'); worksheet := workbook.AddWorksheet('Test');
worksheet.WriteUTF8Text(0, 0, 'E'); worksheet.WriteText(0, 0, 'E');
worksheet.WriteUTF8Text(0, 1, 'E'); worksheet.WriteText(0, 1, 'E');
worksheet.WriteUTF8Text(0, 2, 'C'); worksheet.WriteText(0, 2, 'C');
worksheet.WriteUTF8Text(0, 3, 'B'); worksheet.WriteText(0, 3, 'B');
worksheet.WriteUTF8Text(0, 4, 'D'); worksheet.WriteText(0, 4, 'D');
worksheet.WriteUTF8Text(0, 5, 'D'); worksheet.WriteText(0, 5, 'D');
worksheet.WriteUTF8Text(0, 6, 'A'); worksheet.WriteText(0, 6, 'A');
worksheet.WriteUTF8Text(0, 7, 'B'); worksheet.WriteText(0, 7, 'B');
worksheet.WriteUTF8Text(0, 8, 'C'); worksheet.WriteText(0, 8, 'C');
worksheet.WriteUTF8Text(0, 9, 'A'); worksheet.WriteText(0, 9, 'A');
worksheet.WriteNumber(1, 0, 9); // A2 --> E worksheet.WriteNumber(1, 0, 9); // A2 --> E
worksheet.WriteNumber(1, 1, 8); // B2 --> E worksheet.WriteNumber(1, 1, 8); // B2 --> E
@ -382,7 +382,7 @@ var
Write('1', #9); Write('1', #9);
for i:=0 to 9 do for i:=0 to 9 do
Write(worksheet.ReadAsUTF8Text(0, i), #9); Write(worksheet.ReadAsText(0, i), #9);
WriteLn; WriteLn;
Write('2', #9); Write('2', #9);
@ -411,5 +411,7 @@ begin
SortTwoColumns_TwoKeys_1; SortTwoColumns_TwoKeys_1;
SortTwoRows_TwoKeys_1; SortTwoRows_TwoKeys_1;
ReadLn;
end. end.

View File

@ -41,7 +41,7 @@ begin
// Write colors to worksheet // Write colors to worksheet
for row := 0 to palette.Count-1 do begin for row := 0 to palette.Count-1 do begin
Myworksheet.WriteBackgroundColor(row, 0, palette[row]); Myworksheet.WriteBackgroundColor(row, 0, palette[row]);
Myworksheet.WriteUTF8Text(row, 0, GetColorName(palette[row])); Myworksheet.WriteText(row, 0, GetColorName(palette[row]));
MyWorksheet.WriteFontColor(row, 0, HighContrastColor(palette[row])); MyWorksheet.WriteFontColor(row, 0, HighContrastColor(palette[row]));
MyWorksheet.WriteHorAlignment(row, 0, haCenter); MyWorksheet.WriteHorAlignment(row, 0, haCenter);
end; end;
@ -49,7 +49,7 @@ begin
palette.Free; palette.Free;
end; end;
MyWorksheet.WriteColWidth(0, 25); MyWorksheet.WriteColWidth(0, 5.0, suCentimeters);
// Save the spreadsheet to a file // Save the spreadsheet to a file
MyWorkbook.WriteToFile(MyDir + TestFile, sfExcel8, True); MyWorkbook.WriteToFile(MyDir + TestFile, sfExcel8, True);

View File

@ -26,69 +26,69 @@ begin
MyWorksheet := MyWorkbook.AddWorksheet('Worksheet1'); MyWorksheet := MyWorkbook.AddWorksheet('Worksheet1');
// Write some cells // Write some cells
MyWorksheet.WriteUTF8Text(1, 0, 'Border');// A2 MyWorksheet.WriteText(1, 0, 'Border'); // A2
MyWorksheet.WriteUTF8Text(1, 1, '[]'); // B2 MyWorksheet.WriteText(1, 1, '[]'); // B2
MyCell := MyWorksheet.GetCell(1, 1); MyCell := MyWorksheet.GetCell(1, 1);
MyCell^.Border := []; MyCell^.Border := [];
MyWorksheet.WriteUTF8Text(1, 3, '[N]');// D2 MyWorksheet.WriteText(1, 3, '[N]'); // D2
MyCell := MyWorksheet.GetCell(1, 3); MyCell := MyWorksheet.GetCell(1, 3);
MyCell^.Border := [cbNorth]; MyCell^.Border := [cbNorth];
MyWorksheet.WriteUTF8Text(1, 5, '[W]');// F2 MyWorksheet.WriteText(1, 5, '[W]'); // F2
MyCell := MyWorksheet.GetCell(1, 5); MyCell := MyWorksheet.GetCell(1, 5);
MyCell^.Border := [cbWest]; MyCell^.Border := [cbWest];
MyWorksheet.WriteUTF8Text(1, 7, '[E]');// H2 MyWorksheet.WriteText(1, 7, '[E]'); // H2
MyCell := MyWorksheet.GetCell(1, 7); MyCell := MyWorksheet.GetCell(1, 7);
MyCell^.Border := [cbEast]; MyCell^.Border := [cbEast];
MyWorksheet.WriteUTF8Text(1, 9, '[S]');// J2 MyWorksheet.WriteText(1, 9, '[S]'); // J2
MyCell := MyWorksheet.GetCell(1, 9); MyCell := MyWorksheet.GetCell(1, 9);
MyCell^.Border := [cbSouth]; MyCell^.Border := [cbSouth];
MyWorksheet.WriteUTF8Text(3, 1, '[N,W]');// B4 MyWorksheet.WriteText(3, 1, '[N,W]'); // B4
MyCell := MyWorksheet.GetCell(3, 1); MyCell := MyWorksheet.GetCell(3, 1);
MyCell^.Border := [cbNorth, cbWest]; MyCell^.Border := [cbNorth, cbWest];
MyWorksheet.WriteUTF8Text(3, 3, '[N,E]');// D4 MyWorksheet.WriteText(3, 3, '[N,E]'); // D4
MyCell := MyWorksheet.GetCell(3, 3); MyCell := MyWorksheet.GetCell(3, 3);
MyCell^.Border := [cbNorth, cbEast]; MyCell^.Border := [cbNorth, cbEast];
MyWorksheet.WriteUTF8Text(3, 5, '[N,S]');// F4 MyWorksheet.WriteText(3, 5, '[N,S]'); // F4
MyCell := MyWorksheet.GetCell(3, 5); MyCell := MyWorksheet.GetCell(3, 5);
MyCell^.Border := [cbNorth, cbSouth]; MyCell^.Border := [cbNorth, cbSouth];
MyWorksheet.WriteUTF8Text(3, 7, '[W,E]');// H4 MyWorksheet.WriteText(3, 7, '[W,E]'); // H4
MyCell := MyWorksheet.GetCell(3, 7); MyCell := MyWorksheet.GetCell(3, 7);
MyCell^.Border := [cbWest, cbEast]; MyCell^.Border := [cbWest, cbEast];
MyWorksheet.WriteUTF8Text(3, 9, '[W,S]');// J4 MyWorksheet.WriteText(3, 9, '[W,S]'); // J4
MyCell := MyWorksheet.GetCell(3, 9); MyCell := MyWorksheet.GetCell(3, 9);
MyCell^.Border := [cbWest, cbSouth]; MyCell^.Border := [cbWest, cbSouth];
MyWorksheet.WriteUTF8Text(3, 11, '[E,S]');// L4 MyWorksheet.WriteText(3, 11, '[E,S]'); // L4
MyCell := MyWorksheet.GetCell(3, 11); MyCell := MyWorksheet.GetCell(3, 11);
MyCell^.Border := [cbEast, cbSouth]; MyCell^.Border := [cbEast, cbSouth];
MyWorksheet.WriteUTF8Text(5, 1, '[N,W,E]');// B6 MyWorksheet.WriteText(5, 1, '[N,W,E]');// B6
MyCell := MyWorksheet.GetCell(5, 1); MyCell := MyWorksheet.GetCell(5, 1);
MyCell^.Border := [cbNorth, cbWest, cbEast]; MyCell^.Border := [cbNorth, cbWest, cbEast];
MyWorksheet.WriteUTF8Text(5, 3, '[N,W,S]');// D6 MyWorksheet.WriteText(5, 3, '[N,W,S]');// D6
MyCell := MyWorksheet.GetCell(5, 3); MyCell := MyWorksheet.GetCell(5, 3);
MyCell^.Border := [cbNorth, cbWest, cbSouth]; MyCell^.Border := [cbNorth, cbWest, cbSouth];
MyWorksheet.WriteUTF8Text(5, 5, '[N,E,S]');// F6 MyWorksheet.WriteText(5, 5, '[N,E,S]');// F6
MyCell := MyWorksheet.GetCell(5, 5); MyCell := MyWorksheet.GetCell(5, 5);
MyCell^.Border := [cbNorth, cbEast, cbSouth]; MyCell^.Border := [cbNorth, cbEast, cbSouth];
MyWorksheet.WriteUTF8Text(5, 7, '[W,E,S]');// H6 MyWorksheet.WriteText(5, 7, '[W,E,S]');// H6
MyCell := MyWorksheet.GetCell(5, 7); MyCell := MyWorksheet.GetCell(5, 7);
MyCell^.Border := [cbWest, cbEast, cbSouth]; MyCell^.Border := [cbWest, cbEast, cbSouth];
MyWorksheet.WriteUTF8Text(5, 9, '[N,W,E,S]');// J6 MyWorksheet.WriteText(5, 9, '[N,W,E,S]');// J6
MyCell := MyWorksheet.GetCell(5, 9); MyCell := MyWorksheet.GetCell(5, 9);
MyCell^.Border := [cbNorth, cbWest, cbEast, cbSouth]; MyCell^.Border := [cbNorth, cbWest, cbEast, cbSouth];
MyCell^.BackgroundColor := scGreen; MyCell^.BackgroundColor := scGreen;
@ -102,36 +102,36 @@ begin
// Line 1 // Line 1
MyWorksheet.WriteUTF8Text(1, 1, 'Relatório'); MyWorksheet.WriteText(1, 1, 'Relatório');
MyCell := MyWorksheet.GetCell(1, 1); MyCell := MyWorksheet.GetCell(1, 1);
MyCell^.Border := [cbNorth, cbWest, cbSouth]; MyCell^.Border := [cbNorth, cbWest, cbSouth];
MyCell^.BackgroundColor := scGrey20pct; MyCell^.BackgroundColor := scGrey20pct;
MyWorksheet.WriteUTF8Text(1, 2, ' '); MyWorksheet.WriteText(1, 2, ' ');
MyCell := MyWorksheet.GetCell(1, 2); MyCell := MyWorksheet.GetCell(1, 2);
MyCell^.Border := [cbNorth, cbEast, cbSouth]; MyCell^.Border := [cbNorth, cbEast, cbSouth];
MyCell^.BackgroundColor := scGrey20pct; MyCell^.BackgroundColor := scGrey20pct;
// Line 2 // Line 2
MyWorksheet.WriteUTF8Text(2, 1, 'Compras'); MyWorksheet.WriteText(2, 1, 'Compras');
MyCell := MyWorksheet.GetCell(2, 1); MyCell := MyWorksheet.GetCell(2, 1);
MyCell^.Border := [cbWest]; MyCell^.Border := [cbWest];
MyCell^.BackgroundColor := scGrey10pct; MyCell^.BackgroundColor := scGrey10pct;
MyWorksheet.WriteUTF8Text(2, 2, 'R$ 20'); MyWorksheet.WriteText(2, 2, 'R$ 20');
MyCell := MyWorksheet.GetCell(2, 2); MyCell := MyWorksheet.GetCell(2, 2);
MyCell^.Border := [cbEast]; MyCell^.Border := [cbEast];
MyCell^.BackgroundColor := scGrey10pct; MyCell^.BackgroundColor := scGrey10pct;
// Line 3 // Line 3
MyWorksheet.WriteUTF8Text(3, 1, 'Total:'); MyWorksheet.WriteText(3, 1, 'Total:');
MyCell := MyWorksheet.GetCell(3, 1); MyCell := MyWorksheet.GetCell(3, 1);
MyCell^.Border := [cbWest, cbSouth]; MyCell^.Border := [cbWest, cbSouth];
MyCell^.BackgroundColor := scGrey10pct; MyCell^.BackgroundColor := scGrey10pct;
MyWorksheet.WriteUTF8Text(3, 2, 'R$ 20'); MyWorksheet.WriteText(3, 2, 'R$ 20');
MyCell := MyWorksheet.GetCell(3, 2); MyCell := MyWorksheet.GetCell(3, 2);
MyCell^.Border := [cbEast, cbSouth]; MyCell^.Border := [cbEast, cbSouth];
MyCell^.BackgroundColor := scGrey10pct; MyCell^.BackgroundColor := scGrey10pct;

View File

@ -29,8 +29,8 @@ begin
MyWorksheet := MyWorkbook.AddWorksheet('Worksheet1'); MyWorksheet := MyWorkbook.AddWorksheet('Worksheet1');
// Write some cells // Write some cells
MyWorksheet.WriteUTF8Text(0, 1, 'Text Formula');// B1 MyWorksheet.WriteText(0, 1, 'Text Formula');// B1
MyWorksheet.WriteUTF8Text(0, 2, 'RPN');// C1 MyWorksheet.WriteText(0, 2, 'RPN'); // C1
MyWorksheet.WriteNumber(0, 4, -3.14); // E1 MyWorksheet.WriteNumber(0, 4, -3.14); // E1
MyWorksheet.WriteNumber(1, 4, 100); // E2 MyWorksheet.WriteNumber(1, 4, 100); // E2
@ -39,7 +39,7 @@ begin
MyWorksheet.WriteNumber(4, 4, 250); // E5 MyWorksheet.WriteNumber(4, 4, 250); // E5
// =Sum(E2:E5) // =Sum(E2:E5)
MyWorksheet.WriteUTF8Text(1, 0, '=Sum(E2:E5)'); // A2 MyWorksheet.WriteText(1, 0, '=Sum(E2:E5)'); // A2
MyFormula := '=Sum(E2:E5)'; MyFormula := '=Sum(E2:E5)';
MyWorksheet.WriteFormula(1, 1, MyFormula); // B2 MyWorksheet.WriteFormula(1, 1, MyFormula); // B2
MyWorksheet.WriteRPNFormula(1, 2, CreateRPNFormula( // C2 MyWorksheet.WriteRPNFormula(1, 2, CreateRPNFormula( // C2
@ -48,7 +48,7 @@ begin
nil)))); nil))));
// Write the formula =ABS(E1) // Write the formula =ABS(E1)
MyWorksheet.WriteUTF8Text(2, 0, '=ABS(E1)'); // A3 MyWorksheet.WriteText(2, 0, '=ABS(E1)'); // A3
MyWorksheet.WriteFormula(2, 1, 'ABS(E1)'); // B3 MyWorksheet.WriteFormula(2, 1, 'ABS(E1)'); // B3
MyWorksheet.WriteRPNFormula(2, 2, CreateRPNFormula( // C3 MyWorksheet.WriteRPNFormula(2, 2, CreateRPNFormula( // C3
RPNCellValue('E1', RPNCellValue('E1',
@ -56,7 +56,7 @@ begin
nil)))); nil))));
// Write the formula =4+5 // Write the formula =4+5
MyWorksheet.WriteUTF8Text(3, 0, '=4+5'); // A4 MyWorksheet.WriteText(3, 0, '=4+5'); // A4
MyWorksheet.WriteFormula(3, 1, '=4+5'); // B4 MyWorksheet.WriteFormula(3, 1, '=4+5'); // B4
MyWorksheet.WriteRPNFormula(3, 2, CreateRPNFormula( //C4 MyWorksheet.WriteRPNFormula(3, 2, CreateRPNFormula( //C4
RPNNumber(4.0, RPNNumber(4.0,
@ -73,7 +73,7 @@ begin
// Line 1 // Line 1
MyWorksheet.WriteUTF8Text(1, 1, 'Relatório'); MyWorksheet.WriteText(1, 1, 'Relatório');
MyCell := MyWorksheet.GetCell(1, 1); MyCell := MyWorksheet.GetCell(1, 1);
MyWorksheet.WriteBorders(MyCell, [cbNorth, cbWest, cbSouth]); MyWorksheet.WriteBorders(MyCell, [cbNorth, cbWest, cbSouth]);
Myworksheet.WriteBackgroundColor(MyCell, scGray20pct); Myworksheet.WriteBackgroundColor(MyCell, scGray20pct);

View File

@ -10,8 +10,7 @@ var
MyWorkbook: TsWorkbook; MyWorkbook: TsWorkbook;
MyWorksheet: TsWorksheet; MyWorksheet: TsWorksheet;
MyDir: string; MyDir: string;
cell: PCell; i: Integer;
i, r, c: Integer;
const const
image1 = '../../images/components/TSWORKBOOKSOURCE.png'; image1 = '../../images/components/TSWORKBOOKSOURCE.png';
@ -25,7 +24,11 @@ begin
MyWorkbook := TsWorkbook.Create; MyWorkbook := TsWorkbook.Create;
try try
MyWorksheet := MyWorkbook.AddWorksheet('Sheet 1'); MyWorksheet := MyWorkbook.AddWorksheet('Sheet 1');
MyWorksheet.DefaultRowHeight := 1.2;
for i:=0 to 20 do
MyWorksheet.WriteRowHeight(i, 4.5, suMillimeters);
// MyWorksheet.DefaultRowHeight := 4.5; // millimeters
MyWorksheet.WriteText(0, 0, 'There are images in cells A3 and B3'); // MyWorksheet.WriteText(0, 0, 'There are images in cells A3 and B3'); //
// These images are offset by 1mm in both directions from the top/left cell edge // These images are offset by 1mm in both directions from the top/left cell edge
MyWorksheet.WriteImage(2, 0, image1, 1.0, 1.0, 2.0, 2.0); // This image is magnified by factor 2 MyWorksheet.WriteImage(2, 0, image1, 1.0, 1.0, 2.0, 2.0); // This image is magnified by factor 2

View File

@ -54,7 +54,7 @@ begin
WriteLn( WriteLn(
'Row: ', CurCell^.Row, 'Row: ', CurCell^.Row,
' Col: ', CurCell^.Col, ' Col: ', CurCell^.Col,
' Value: ', UTF8ToConsole(MyWorkSheet.ReadAsUTF8Text(CurCell^.Row, CurCell^.Col)) ' Value: ', UTF8ToConsole(MyWorkSheet.ReadAsText(CurCell^.Row, CurCell^.Col))
); );
end; end;
@ -62,5 +62,11 @@ begin
// Finalization // Finalization
MyWorkbook.Free; MyWorkbook.Free;
end; end;
{$ifdef WINDOWS}
WriteLn;
WriteLn('Press ENTER to quit...');
ReadLn;
{$ENDIF}
end. end.

View File

@ -29,10 +29,10 @@ begin
MyWorkbook := TsWorkbook.Create; MyWorkbook := TsWorkbook.Create;
MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet'); MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet');
//MyWorksheet.WriteColWidth(0, 5); // Note: ColWidth and RowHeight is not available in CSV
//MyWorksheet.WriteColWidth(1, 30); MyWorksheet.WriteColWidth(0, 5, suChars);
MyWorksheet.WriteColWidth(1, 30, suChars);
MyWorksheet.WriteRowHeight(0, 3); // 3 lines MyWorksheet.WriteRowHeight(0, 3, suLines); // 3 lines
// Turn off grid lines and hide headers // Turn off grid lines and hide headers
//MyWorksheet.Options := MyWorksheet.Options - [soShowGridLines, soShowHeaders]; //MyWorksheet.Options := MyWorksheet.Options - [soShowGridLines, soShowHeaders];
@ -49,32 +49,32 @@ begin
MyWorksheet.WriteNumber(0, 3, 4.0); MyWorksheet.WriteNumber(0, 3, 4.0);
// Write some string cells // Write some string cells
MyWorksheet.WriteUTF8Text(1, 0, 'First'); MyWorksheet.WriteText(1, 0, 'First');
MyWorksheet.WriteFont (1, 0, 'Arial', 12, [fssBold, fssItalic, fssUnderline], scRed); MyWorksheet.WriteFont (1, 0, 'Arial', 12, [fssBold, fssItalic, fssUnderline], scRed);
MyWorksheet.WriteUTF8Text(1, 1, 'Second'); MyWorksheet.WriteText(1, 1, 'Second');
MyWorksheet.WriteUTF8Text(1, 2, 'Third'); MyWorksheet.WriteText(1, 2, 'Third');
MyWorksheet.WriteUTF8Text(1, 3, 'Fourth'); MyWorksheet.WriteText(1, 3, 'Fourth');
// Write current date/time // Write current date/time
MyWorksheet.WriteDateTime(2, 0, now); MyWorksheet.WriteDateTime(2, 0, now);
// Write cell with background color // Write cell with background color
MyWorksheet.WriteUTF8Text(3, 0, 'Text'); MyWorksheet.WriteText(3, 0, 'Text');
MyWorksheet.WriteBackgroundColor(3, 0, scSilver); MyWorksheet.WriteBackgroundColor(3, 0, scSilver);
// Empty cell with background color // Empty cell with background color
MyWorksheet.WriteBackgroundColor(3, 1, scGrey); MyWorksheet.WriteBackgroundColor(3, 1, scGrey);
// Cell2 with top and bottom borders // Cell2 with top and bottom borders
MyWorksheet.WriteUTF8Text(4, 0, 'Text'); MyWorksheet.WriteText(4, 0, 'Text');
MyWorksheet.WriteBorders(4, 0, [cbNorth, cbSouth]); MyWorksheet.WriteBorders(4, 0, [cbNorth, cbSouth]);
MyWorksheet.WriteBorders(4, 1, [cbNorth, cbSouth]); MyWorksheet.WriteBorders(4, 1, [cbNorth, cbSouth]);
MyWorksheet.WriteBorders(4, 2, [cbNorth, cbSouth]); MyWorksheet.WriteBorders(4, 2, [cbNorth, cbSouth]);
// Left, center, right aligned texts // Left, center, right aligned texts
MyWorksheet.WriteUTF8Text(5, 0, 'L'); MyWorksheet.WriteText(5, 0, 'L');
MyWorksheet.WriteUTF8Text(5, 1, 'C'); MyWorksheet.WriteText(5, 1, 'C');
MyWorksheet.WriteUTF8Text(5, 2, 'R'); MyWorksheet.WriteText(5, 2, 'R');
MyWorksheet.WriteHorAlignment(5, 0, haLeft); MyWorksheet.WriteHorAlignment(5, 0, haLeft);
MyWorksheet.WriteHorAlignment(5, 1, haCenter); MyWorksheet.WriteHorAlignment(5, 1, haCenter);
MyWorksheet.WriteHorAlignment(5, 2, haRight); MyWorksheet.WriteHorAlignment(5, 2, haRight);
@ -93,96 +93,96 @@ begin
// Write current date/time and test numbers for various formatting options // Write current date/time and test numbers for various formatting options
inc(r, 2); inc(r, 2);
MyWorksheet.WriteUTF8Text(r, 0, 'nfShortDate'); MyWorksheet.WriteText(r, 0, 'nfShortDate');
MyWorksheet.WriteDateTime(r, 1, now, nfShortDate); MyWorksheet.WriteDateTime(r, 1, now, nfShortDate);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfLongDate'); MyWorksheet.WriteUTF8Text(r, 0, 'nfLongDate');
MyWorksheet.WriteDateTime(r, 1, now, nfLongDate); MyWorksheet.WriteDateTime(r, 1, now, nfLongDate);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfShortTime'); MyWorksheet.WriteText(r, 0, 'nfShortTime');
MyWorksheet.WriteDateTime(r, 1, now, nfShortTime); MyWorksheet.WriteDateTime(r, 1, now, nfShortTime);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfLongTime'); MyWorksheet.WriteText(r, 0, 'nfLongTime');
MyWorksheet.WriteDateTime(r, 1, now, nfLongTime); MyWorksheet.WriteDateTime(r, 1, now, nfLongTime);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfShortDateTime'); MyWorksheet.WriteText(r, 0, 'nfShortDateTime');
MyWorksheet.WriteDateTime(r, 1, now, nfShortDateTime); MyWorksheet.WriteDateTime(r, 1, now, nfShortDateTime);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, ''dd/mmm'''); MyWorksheet.WriteText(r, 0, 'nfCustom, ''dd/mmm''');
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'dd/mmm'''); MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'dd/mmm''');
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, ''mmm/yy'''); MyWorksheet.WriteText(r, 0, 'nfCustom, ''mmm/yy''');
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'mmm/yy'); MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'mmm/yy');
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfShortTimeAM'); MyWorksheet.WriteText(r, 0, 'nfShortTimeAM');
MyWorksheet.WriteDateTime(r, 1, now, nfShortTimeAM); MyWorksheet.WriteDateTime(r, 1, now, nfShortTimeAM);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfLongTimeAM'); MyWorksheet.WriteText(r, 0, 'nfLongTimeAM');
MyWorksheet.WriteDateTime(r, 1, now, nfLongTimeAM); MyWorksheet.WriteDateTime(r, 1, now, nfLongTimeAM);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, nn:ss'); MyWorksheet.WriteText(r, 0, 'nfCustom, nn:ss');
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'nn:ss'); MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'nn:ss');
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, nn:ss.z'); MyWorksheet.WriteText(r, 0, 'nfCustom, nn:ss.z');
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'nn:ss.z'); MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'nn:ss.z');
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, mm:ss.zzz'); MyWorksheet.WriteText(r, 0, 'nfCustom, mm:ss.zzz');
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'mm:ss.zzz'); MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'mm:ss.zzz');
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
// Write formatted numbers // Write formatted numbers
number := 12345.67890123456789; number := 12345.67890123456789;
inc(r, 2); inc(r, 2);
MyWorksheet.WriteUTF8Text(r, 1, '12345.67890123456789'); MyWorksheet.WriteText(r, 1, '12345.67890123456789');
MyWorksheet.WriteUTF8Text(r, 2, '-12345.67890123456789'); MyWorksheet.WriteText(r, 2, '-12345.67890123456789');
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfGeneral'); MyWorksheet.WriteText(r, 0, 'nfGeneral');
MyWorksheet.WriteNumber(r, 1, number, nfGeneral); MyWorksheet.WriteNumber(r, 1, number, nfGeneral);
MyWorksheet.WriteNumber(r, 2, -number, nfGeneral); MyWorksheet.WriteNumber(r, 2, -number, nfGeneral);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixed, 0 decs'); MyWorksheet.WriteText(r, 0, 'nfFixed, 0 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixed, 0); MyWorksheet.WriteNumber(r, 1, number, nfFixed, 0);
MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 0); MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 0);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixed, 1 decs'); MyWorksheet.WriteText(r, 0, 'nfFixed, 1 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixed, 1); MyWorksheet.WriteNumber(r, 1, number, nfFixed, 1);
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 1); MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 1);
MyWorksheet.WriteFontColor(r, 2, scGray); MyWorksheet.WriteFontColor(r, 2, scGray);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixed, 2 decs'); MyWorksheet.WriteText(r, 0, 'nfFixed, 2 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixed, 2); MyWorksheet.WriteNumber(r, 1, number, nfFixed, 2);
MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 2); MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 2);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixed, 3 decs'); MyWorksheet.WriteText(r, 0, 'nfFixed, 3 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixed, 3); MyWorksheet.WriteNumber(r, 1, number, nfFixed, 3);
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 3); MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 3);
MyWorksheet.WriteFontColor(r, 2, scGray); MyWorksheet.WriteFontColor(r, 2, scGray);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixedTh, 0 decs'); MyWorksheet.WriteText(r, 0, 'nfFixedTh, 0 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 0); MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 0);
MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 0); MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 0);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixedTh, 1 decs'); MyWorksheet.WriteText(r, 0, 'nfFixedTh, 1 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 1); MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 1);
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 1); MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 1);
MyWorksheet.WriteFontColor(r, 2, scGray); MyWorksheet.WriteFontColor(r, 2, scGray);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixedTh, 2 decs'); MyWorksheet.WriteText(r, 0, 'nfFixedTh, 2 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 2); MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 2);
MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 2); MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 2);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixedTh, 3 decs'); MyWorksheet.WriteText(r, 0, 'nfFixedTh, 3 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 3); MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 3);
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 3); MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 3);
MyWorksheet.WriteFontColor(r, 2, scGray); MyWorksheet.WriteFontColor(r, 2, scGray);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfExp, 1 dec'); MyWorksheet.WriteText(r, 0, 'nfExp, 1 dec');
MyWorksheet.WriteNumber(r, 1, number, nfExp, 1); MyWorksheet.WriteNumber(r, 1, number, nfExp, 1);
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
MyWorksheet.WriteNumber(r, 2, -number, nfExp, 1); MyWorksheet.WriteNumber(r, 2, -number, nfExp, 1);
@ -192,13 +192,13 @@ begin
MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 1); MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 1);
MyWorksheet.WriteFontColor(r, 4, scGray); MyWorksheet.WriteFontColor(r, 4, scGray);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfExp, 2 decs'); MyWorksheet.WriteText(r, 0, 'nfExp, 2 decs');
MyWorksheet.WriteNumber(r, 1, number, nfExp, 2); MyWorksheet.WriteNumber(r, 1, number, nfExp, 2);
MyWorksheet.WriteNumber(r, 2, -number, nfExp, 2); MyWorksheet.WriteNumber(r, 2, -number, nfExp, 2);
MyWorksheet.WriteNumber(r, 3, 1.0/number, nfExp, 2); MyWorksheet.WriteNumber(r, 3, 1.0/number, nfExp, 2);
MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 2); MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 2);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfExp, 3 decs'); MyWorksheet.WriteText(r, 0, 'nfExp, 3 decs');
MyWorksheet.WriteNumber(r, 1, number, nfExp, 3); MyWorksheet.WriteNumber(r, 1, number, nfExp, 3);
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
MyWorksheet.WriteNumber(r, 2, -number, nfExp, 3); MyWorksheet.WriteNumber(r, 2, -number, nfExp, 3);
@ -208,17 +208,17 @@ begin
MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 3); MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 3);
MyWorksheet.WriteFontColor(r, 4, scGray); MyWorksheet.WriteFontColor(r, 4, scGray);
inc(r,2); inc(r,2);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCurrency, 0 decs'); MyWorksheet.WriteText(r, 0, 'nfCurrency, 0 decs');
MyWorksheet.WriteCurrency(r, 1, number, nfCurrency, 0, '$'); MyWorksheet.WriteCurrency(r, 1, number, nfCurrency, 0, '$');
MyWorksheet.WriteCurrency(r, 2, -number, nfCurrency, 0, '$'); MyWorksheet.WriteCurrency(r, 2, -number, nfCurrency, 0, '$');
MyWorksheet.WriteCurrency(r, 3, 0.0, nfCurrency, 0, '$'); MyWorksheet.WriteCurrency(r, 3, 0.0, nfCurrency, 0, '$');
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCurrencyRed, 0 decs'); MyWorksheet.WriteText(r, 0, 'nfCurrencyRed, 0 decs');
MyWorksheet.WriteCurrency(r, 1, number, nfCurrencyRed, 0, 'USD'); MyWorksheet.WriteCurrency(r, 1, number, nfCurrencyRed, 0, 'USD');
MyWorksheet.WriteCurrency(r, 2, -number, nfCurrencyRed, 0, 'USD'); MyWorksheet.WriteCurrency(r, 2, -number, nfCurrencyRed, 0, 'USD');
MyWorksheet.WriteCurrency(r, 3, 0.0, nfCurrencyRed, 0, 'USD'); MyWorksheet.WriteCurrency(r, 3, 0.0, nfCurrencyRed, 0, 'USD');
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, "$"#,##0_);("$"#,##0)'); MyWorksheet.WriteText(r, 0, 'nfCustom, "$"#,##0_);("$"#,##0)');
MyWorksheet.WriteNumber(r, 1, number); MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '"$"#,##0_);("$"#,##0)'); MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '"$"#,##0_);("$"#,##0)');
@ -226,7 +226,7 @@ begin
MyWorksheet.WriteNumberFormat(r, 2, nfCustom, '"$"#,##0_);("$"#,##0)'); MyWorksheet.WriteNumberFormat(r, 2, nfCustom, '"$"#,##0_);("$"#,##0)');
MyWorksheet.WriteFontColor(r, 2, scGray); MyWorksheet.WriteFontColor(r, 2, scGray);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, "$"#,##0.0_);[Red]("$"#,##0.0)'); MyWorksheet.WriteText(r, 0, 'nfCustom, "$"#,##0.0_);[Red]("$"#,##0.0)');
MyWorksheet.WriteNumber(r, 1, number); MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '"$"#,##0.0_);[Red]("$"#,##0.0)'); MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '"$"#,##0.0_);[Red]("$"#,##0.0)');
@ -235,7 +235,7 @@ begin
MyWorksheet.WriteFontColor(r, 2, scGray); MyWorksheet.WriteFontColor(r, 2, scGray);
inc(r); inc(r);
fmt := '"€"#,##0.0_);[Red]("€"#,##0.0)'; fmt := '"€"#,##0.0_);[Red]("€"#,##0.0)';
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, '+fmt); MyWorksheet.WriteText(r, 0, 'nfCustom, '+fmt);
MyWorksheet.WriteNumber(r, 1, number); MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, UTF8ToAnsi(fmt)); MyWorksheet.WriteNumberFormat(r, 1, nfCustom, UTF8ToAnsi(fmt));
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
@ -244,7 +244,7 @@ begin
MyWorksheet.WriteFontColor(r, 2, scGray); MyWorksheet.WriteFontColor(r, 2, scGray);
inc(r); inc(r);
fmt := '[Green]"¥"#,##0.0_);[Red]-"¥"#,##0.0'; fmt := '[Green]"¥"#,##0.0_);[Red]-"¥"#,##0.0';
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, '+fmt); MyWorksheet.WriteText(r, 0, 'nfCustom, '+fmt);
MyWorksheet.WriteNumber(r, 1, number); MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, UTF8ToAnsi(fmt)); MyWorksheet.WriteNumberFormat(r, 1, nfCustom, UTF8ToAnsi(fmt));
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
@ -252,7 +252,7 @@ begin
MyWorksheet.WriteNumberFormat(r, 2, nfCustom, UTF8ToAnsi(fmt)); MyWorksheet.WriteNumberFormat(r, 2, nfCustom, UTF8ToAnsi(fmt));
MyWorksheet.WriteFontColor(r, 2, scGray); MyWorksheet.WriteFontColor(r, 2, scGray);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, _("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)'); MyWorksheet.WriteText(r, 0, 'nfCustom, _("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)');
MyWorksheet.WriteNumber(r, 1, number); MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)'); MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)');
@ -264,34 +264,34 @@ begin
MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 0 decs'); MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 0 decs');
MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 0); MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 0);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 1 decs'); MyWorksheet.WriteText(r, 0, 'nfPercentage, 1 decs');
MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 1); MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 1);
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 2 decs'); MyWorksheet.WriteText(r, 0, 'nfPercentage, 2 decs');
MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 2); MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 2);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 3 decs'); MyWorksheet.WriteText(r, 0, 'nfPercentage, 3 decs');
MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 3); MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 3);
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, hh:mm:ss'); MyWorksheet.WriteText(r, 0, 'nfTimeInterval, hh:mm:ss');
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval); MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval);
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, h:m:s'); MyWorksheet.WriteText(r, 0, 'nfTimeInterval, h:m:s');
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'H:M:s'); MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'H:M:s');
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, hh:mm'); MyWorksheet.WriteText(r, 0, 'nfTimeInterval, hh:mm');
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'hh:mm'); MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'hh:mm');
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, h:m'); MyWorksheet.WriteText(r, 0, 'nfTimeInterval, h:m');
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'h:m'); MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'h:m');
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, h'); MyWorksheet.WriteText(r, 0, 'nfTimeInterval, h');
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'h'); MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'h');
MyWorksheet.WriteFontColor(r, 1, scGray); MyWorksheet.WriteFontColor(r, 1, scGray);
inc(r); inc(r);

View File

@ -47,7 +47,7 @@ begin
for CurCell in MyWorksheet.Cells do for CurCell in MyWorksheet.Cells do
begin begin
Write('Row: ', CurCell^.Row, ' Col: ', CurCell^.Col, ' Value: ', Write('Row: ', CurCell^.Row, ' Col: ', CurCell^.Col, ' Value: ',
UTF8ToConsole(MyWorkSheet.ReadAsUTF8Text(CurCell^.Row, CurCell^.Col)) UTF8ToConsole(MyWorkSheet.ReadAsText(CurCell^.Row, CurCell^.Col))
); );
if HasFormula(CurCell) then if HasFormula(CurCell) then
Write(' (Formula ', CurCell^.FormulaValue, ')'); Write(' (Formula ', CurCell^.FormulaValue, ')');
@ -58,5 +58,11 @@ begin
// Finalization // Finalization
MyWorkbook.Free; MyWorkbook.Free;
end; end;
{$ifdef Windows}
WriteLn;
WriteLn('Press ENTER to quit...');
ReadLn;
{$endif}
end. end.

View File

@ -21,10 +21,9 @@ var
MyRPNFormula: TsRPNFormula; MyRPNFormula: TsRPNFormula;
MyDir: string; MyDir: string;
number: Double; number: Double;
lCol: TCol;
lRow: TRow;
r: Integer; r: Integer;
fmt: String; fmt: String;
lCol: TCol;
begin begin
// Open the output file // Open the output file
MyDir := ExtractFilePath(ParamStr(0)); MyDir := ExtractFilePath(ParamStr(0));
@ -33,11 +32,6 @@ begin
MyWorkbook := TsWorkbook.Create; MyWorkbook := TsWorkbook.Create;
MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet'); 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 // Turn off grid lines and hide headers
//MyWorksheet.Options := MyWorksheet.Options - [soShowGridLines, soShowHeaders]; //MyWorksheet.Options := MyWorksheet.Options - [soShowGridLines, soShowHeaders];
@ -81,32 +75,32 @@ begin
MyWorksheet.WriteFormula(0, 7, '=SIN(A1+B1)'); MyWorksheet.WriteFormula(0, 7, '=SIN(A1+B1)');
// Write some string cells // Write some string cells
MyWorksheet.WriteUTF8Text(1, 0, 'First'); MyWorksheet.WriteText(1, 0, 'First');
MyWorksheet.WriteFont(1, 0, 'Arial', 12, [fssBold, fssItalic, fssUnderline], scRed); MyWorksheet.WriteFont(1, 0, 'Arial', 12, [fssBold, fssItalic, fssUnderline], scRed);
MyWorksheet.WriteUTF8Text(1, 1, 'Second'); MyWorksheet.WriteText(1, 1, 'Second');
MyWorksheet.WriteUTF8Text(1, 2, 'Third'); MyWorksheet.WriteText(1, 2, 'Third');
MyWorksheet.WriteUTF8Text(1, 3, 'Fourth'); MyWorksheet.WriteText(1, 3, 'Fourth');
// Write current date/time // Write current date/time
MyWorksheet.WriteDateTime(2, 0, now); MyWorksheet.WriteDateTime(2, 0, now);
// Write cell with background color // Write cell with background color
MyWorksheet.WriteUTF8Text(3, 0, 'Text'); MyWorksheet.WriteText(3, 0, 'Text');
MyWorksheet.WriteBackgroundColor(3, 0, NA_COLOR); MyWorksheet.WriteBackgroundColor(3, 0, NA_COLOR);
// Empty cell with background color // Empty cell with background color
MyWorksheet.WriteBackgroundColor(3, 1, NA_COLOR); MyWorksheet.WriteBackgroundColor(3, 1, NA_COLOR);
// Cell2 with top and bottom borders // Cell2 with top and bottom borders
MyWorksheet.WriteUTF8Text(4, 0, 'Text'); MyWorksheet.WriteText(4, 0, 'Text');
MyWorksheet.WriteBorders(4, 0, [cbNorth, cbSouth]); MyWorksheet.WriteBorders(4, 0, [cbNorth, cbSouth]);
MyWorksheet.WriteBorders(4, 1, [cbNorth, cbSouth]); MyWorksheet.WriteBorders(4, 1, [cbNorth, cbSouth]);
MyWorksheet.WriteBorders(4, 2, [cbNorth, cbSouth]); MyWorksheet.WriteBorders(4, 2, [cbNorth, cbSouth]);
// Left, center, right aligned texts // Left, center, right aligned texts
MyWorksheet.WriteUTF8Text(5, 0, 'L'); MyWorksheet.WriteText(5, 0, 'L');
MyWorksheet.WriteUTF8Text(5, 1, 'C'); MyWorksheet.WriteText(5, 1, 'C');
MyWorksheet.WriteUTF8Text(5, 2, 'R'); MyWorksheet.WriteText(5, 2, 'R');
MyWorksheet.WriteHorAlignment(5, 0, haLeft); MyWorksheet.WriteHorAlignment(5, 0, haLeft);
MyWorksheet.WriteHorAlignment(5, 1, haCenter); MyWorksheet.WriteHorAlignment(5, 1, haCenter);
MyWorksheet.WriteHorAlignment(5, 2, haRight); MyWorksheet.WriteHorAlignment(5, 2, haRight);
@ -124,99 +118,100 @@ begin
r:= 10; r:= 10;
// Write current date/time and test numbers for various formatting options // Write current date/time and test numbers for various formatting options
MyWorksheet.WriteUTF8Text(r, 1, 'Formats in cyan cells are not supported by BIFF2'); MyWorksheet.WriteText(r, 1, 'Formats in cyan cells are not supported by BIFF2');
inc(r, 2); inc(r, 2);
MyWorksheet.WriteUTF8Text(r, 0, 'nfShortDate'); MyWorksheet.WriteText(r, 0, 'nfShortDate');
MyWorksheet.WriteDateTime(r, 1, now, nfShortDate); MyWorksheet.WriteDateTime(r, 1, now, nfShortDate);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfLongDate'); MyWorksheet.WriteText(r, 0, 'nfLongDate');
MyWorksheet.WriteDateTime(r, 1, now, nfLongDate); MyWorksheet.WriteDateTime(r, 1, now, nfLongDate);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfShortTime'); MyWorksheet.WriteText(r, 0, 'nfShortTime');
MyWorksheet.WriteDateTime(r, 1, now, nfShortTime); MyWorksheet.WriteDateTime(r, 1, now, nfShortTime);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfLongTime'); MyWorksheet.WriteText(r, 0, 'nfLongTime');
MyWorksheet.WriteDateTime(r, 1, now, nfLongTime); MyWorksheet.WriteDateTime(r, 1, now, nfLongTime);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfShortDateTime'); MyWorksheet.WriteText(r, 0, 'nfShortDateTime');
MyWorksheet.WriteDateTime(r, 1, now, nfShortDateTime); MyWorksheet.WriteDateTime(r, 1, now, nfShortDateTime);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfDayMonth'); MyWorksheet.WriteText(r, 0, 'nfDayMonth');
MyWorksheet.WriteDateTime(r, 1, now, nfDayMonth); MyWorksheet.WriteDateTime(r, 1, now, nfDayMonth);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfMonthYear'); MyWorksheet.WriteText(r, 0, 'nfMonthYear');
MyWorksheet.WriteDateTime(r, 1, now, nfMonthYear); MyWorksheet.WriteDateTime(r, 1, now, nfMonthYear);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfShortTimeAM'); MyWorksheet.WriteText(r, 0, 'nfShortTimeAM');
MyWorksheet.WriteDateTime(r, 1, now, nfShortTimeAM); MyWorksheet.WriteDateTime(r, 1, now, nfShortTimeAM);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfLongTimeAM'); MyWorksheet.WriteText(r, 0, 'nfLongTimeAM');
MyWorksheet.WriteDateTime(r, 1, now, nfLongTimeAM); MyWorksheet.WriteDateTime(r, 1, now, nfLongTimeAM);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, nn:ss'); MyWorksheet.WriteText(r, 0, 'nfCustom, nn:ss');
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'nn:ss'); MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'nn:ss');
MyWorksheet.WriteFontColor(r, 1, NA_COLOR); MyWorksheet.WriteFontColor(r, 1, NA_COLOR);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, nn:ss.z'); (* FIXME: These millisecond formats cause an Excel format warning
MyWorksheet.WriteText(r, 0, 'nfCustom, nn:ss.z');
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'nn:ss.z'); MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'nn:ss.z');
MyWorksheet.WriteFontColor(r, 1, NA_COLOR); MyWorksheet.WriteFontColor(r, 1, NA_COLOR);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, mm:ss.zzz'); MyWorksheet.WriteText(r, 0, 'nfCustom, mm:ss.zzz');
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'mm:ss.zzz'); MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'mm:ss.zzz');
MyWorksheet.WriteFontColor(r, 1, NA_COLOR); MyWorksheet.WriteFontColor(r, 1, NA_COLOR);
*)
// Write formatted numbers // Write formatted numbers
number := 12345.67890123456789; number := 12345.67890123456789;
inc(r, 2); inc(r, 2);
MyWorksheet.WriteUTF8Text(r, 1, '12345.67890123456789'); MyWorksheet.WriteText(r, 1, '12345.67890123456789');
MyWorksheet.WriteUTF8Text(r, 2, '-12345.67890123456789'); MyWorksheet.WriteText(r, 2, '-12345.67890123456789');
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfGeneral'); MyWorksheet.WriteText(r, 0, 'nfGeneral');
MyWorksheet.WriteNumber(r, 1, number, nfGeneral); MyWorksheet.WriteNumber(r, 1, number, nfGeneral);
MyWorksheet.WriteNumber(r, 2, -number, nfGeneral); MyWorksheet.WriteNumber(r, 2, -number, nfGeneral);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixed, 0 decs'); MyWorksheet.WriteText(r, 0, 'nfFixed, 0 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixed, 0); MyWorksheet.WriteNumber(r, 1, number, nfFixed, 0);
MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 0); MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 0);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixed, 1 decs'); MyWorksheet.WriteText(r, 0, 'nfFixed, 1 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixed, 1); MyWorksheet.WriteNumber(r, 1, number, nfFixed, 1);
MyWorksheet.WriteFontColor(r, 1, NA_COLOR); MyWorksheet.WriteFontColor(r, 1, NA_COLOR);
MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 1); MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 1);
MyWorksheet.WriteFontColor(r, 2, NA_COLOR); MyWorksheet.WriteFontColor(r, 2, NA_COLOR);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixed, 2 decs'); MyWorksheet.WriteText(r, 0, 'nfFixed, 2 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixed, 2); MyWorksheet.WriteNumber(r, 1, number, nfFixed, 2);
MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 2); MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 2);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixed, 3 decs'); MyWorksheet.WriteText(r, 0, 'nfFixed, 3 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixed, 3); MyWorksheet.WriteNumber(r, 1, number, nfFixed, 3);
MyWorksheet.WriteFontColor(r, 1, NA_COLOR); MyWorksheet.WriteFontColor(r, 1, NA_COLOR);
MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 3); MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 3);
MyWorksheet.WriteFontColor(r, 2, NA_COLOR); MyWorksheet.WriteFontColor(r, 2, NA_COLOR);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixedTh, 0 decs'); MyWorksheet.WriteText(r, 0, 'nfFixedTh, 0 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 0); MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 0);
MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 0); MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 0);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixedTh, 1 decs'); MyWorksheet.WriteText(r, 0, 'nfFixedTh, 1 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 1); MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 1);
MyWorksheet.WriteFontColor(r, 1, NA_COLOR); MyWorksheet.WriteFontColor(r, 1, NA_COLOR);
MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 1); MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 1);
MyWorksheet.WriteFontColor(r, 2, NA_COLOR); MyWorksheet.WriteFontColor(r, 2, NA_COLOR);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixedTh, 2 decs'); MyWorksheet.WriteText(r, 0, 'nfFixedTh, 2 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 2); MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 2);
MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 2); MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 2);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixedTh, 3 decs'); MyWorksheet.WriteText(r, 0, 'nfFixedTh, 3 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 3); MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 3);
MyWorksheet.WriteFontColor(r, 1, NA_COLOR); MyWorksheet.WriteFontColor(r, 1, NA_COLOR);
MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 3); MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 3);
MyWorksheet.WriteFontColor(r, 2, NA_COLOR); MyWorksheet.WriteFontColor(r, 2, NA_COLOR);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfExp, 1 dec'); MyWorksheet.WriteText(r, 0, 'nfExp, 1 dec');
MyWorksheet.WriteNumber(r, 1, number, nfExp, 1); MyWorksheet.WriteNumber(r, 1, number, nfExp, 1);
MyWorksheet.WriteFontColor(r, 1, NA_COLOR); MyWorksheet.WriteFontColor(r, 1, NA_COLOR);
MyWorksheet.WriteNumber(r, 2, -number, nfExp, 1); MyWorksheet.WriteNumber(r, 2, -number, nfExp, 1);
@ -226,13 +221,13 @@ begin
MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 1); MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 1);
MyWorksheet.WriteFontColor(r, 4, NA_COLOR); MyWorksheet.WriteFontColor(r, 4, NA_COLOR);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfExp, 2 decs'); MyWorksheet.WriteText(r, 0, 'nfExp, 2 decs');
MyWorksheet.WriteNumber(r, 1, number, nfExp, 2); MyWorksheet.WriteNumber(r, 1, number, nfExp, 2);
MyWorksheet.WriteNumber(r, 2, -number, nfExp, 2); MyWorksheet.WriteNumber(r, 2, -number, nfExp, 2);
MyWorksheet.WriteNumber(r, 3, 1.0/number, nfExp, 2); MyWorksheet.WriteNumber(r, 3, 1.0/number, nfExp, 2);
MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 2); MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 2);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfExp, 3 decs'); MyWorksheet.WriteText(r, 0, 'nfExp, 3 decs');
MyWorksheet.WriteNumber(r, 1, number, nfExp, 3); MyWorksheet.WriteNumber(r, 1, number, nfExp, 3);
MyWorksheet.WriteFontColor(r, 1, NA_COLOR); MyWorksheet.WriteFontColor(r, 1, NA_COLOR);
MyWorksheet.WriteNumber(r, 2, -number, nfExp, 3); MyWorksheet.WriteNumber(r, 2, -number, nfExp, 3);
@ -242,23 +237,25 @@ begin
MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 3); MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 3);
MyWorksheet.WriteFontColor(r, 4, NA_COLOR); MyWorksheet.WriteFontColor(r, 4, NA_COLOR);
inc(r,2); inc(r,2);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCurrency, 0 decs'); MyWorksheet.WriteText(r, 0, 'nfCurrency, 0 decs');
MyWorksheet.WriteCurrency(r, 1, number, nfCurrency, 0, '$'); MyWorksheet.WriteCurrency(r, 1, number, nfCurrency, 0, '$');
MyWorksheet.WriteCurrency(r, 2, -number, nfCurrency, 0, '$'); MyWorksheet.WriteCurrency(r, 2, -number, nfCurrency, 0, '$');
MyWorksheet.WriteCurrency(r, 3, 0.0, nfCurrency, 0, '$'); MyWorksheet.WriteCurrency(r, 3, 0.0, nfCurrency, 0, '$');
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCurrencyRed, 0 decs'); (* FIXME: This format causes an Excel format warning
MyWorksheet.WriteText(r, 0, 'nfCurrencyRed, 0 decs');
MyWorksheet.WriteCurrency(r, 1, number, nfCurrencyRed, 0, 'USD'); MyWorksheet.WriteCurrency(r, 1, number, nfCurrencyRed, 0, 'USD');
MyWorksheet.WriteCurrency(r, 2, -number, nfCurrencyRed, 0, 'USD'); MyWorksheet.WriteCurrency(r, 2, -number, nfCurrencyRed, 0, 'USD');
MyWorksheet.WriteCurrency(r, 3, 0.0, nfCurrencyRed, 0, 'USD'); MyWorksheet.WriteCurrency(r, 3, 0.0, nfCurrencyRed, 0, 'USD');
inc(r); inc(r); *)
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, "$"#,##0_);("$"#,##0)'); MyWorksheet.WriteText(r, 0, 'nfCustom, "$"#,##0_);("$"#,##0)');
MyWorksheet.WriteNumber(r, 1, number); MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '"$"#,##0_);("$"#,##0)'); MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '"$"#,##0_);("$"#,##0)');
MyWorksheet.WriteNumber(r, 2, -number); MyWorksheet.WriteNumber(r, 2, -number);
MyWorksheet.WriteNumberFormat(r, 2, nfCustom, '"$"#,##0_);("$"#,##0)'); MyWorksheet.WriteNumberFormat(r, 2, nfCustom, '"$"#,##0_);("$"#,##0)');
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, "$"#,##0.0_);[Red]("$"#,##0.0)'); (* FIXME: These formats cause an Excel format warning
MyWorksheet.WriteText(r, 0, 'nfCustom, "$"#,##0.0_);[Red]("$"#,##0.0)');
MyWorksheet.WriteNumber(r, 1, number); MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteFontColor(r, 1, NA_COLOR); MyWorksheet.WriteFontColor(r, 1, NA_COLOR);
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '"$"#,##0.0_);[Red]("$"#,##0.0)'); MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '"$"#,##0.0_);[Red]("$"#,##0.0)');
@ -267,7 +264,7 @@ begin
MyWorksheet.WriteFontColor(r, 2, NA_COLOR); MyWorksheet.WriteFontColor(r, 2, NA_COLOR);
inc(r); inc(r);
fmt := '"€"#,##0.0_);[Red]("€"#,##0.0)'; fmt := '"€"#,##0.0_);[Red]("€"#,##0.0)';
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, '+fmt); MyWorksheet.WriteText(r, 0, 'nfCustom, '+fmt);
MyWorksheet.WriteNumber(r, 1, number); MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, UTF8ToAnsi(fmt)); MyWorksheet.WriteNumberFormat(r, 1, nfCustom, UTF8ToAnsi(fmt));
MyWorksheet.WriteFontColor(r, 1, NA_COLOR); MyWorksheet.WriteFontColor(r, 1, NA_COLOR);
@ -276,15 +273,16 @@ begin
MyWorksheet.WriteFontColor(r, 2, NA_COLOR); MyWorksheet.WriteFontColor(r, 2, NA_COLOR);
inc(r); inc(r);
fmt := '[Green]"¥"#,##0.0_);[Red]-"¥"#,##0.0'; fmt := '[Green]"¥"#,##0.0_);[Red]-"¥"#,##0.0';
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, '+fmt); MyWorksheet.WriteText(r, 0, 'nfCustom, '+fmt);
MyWorksheet.WriteNumber(r, 1, number); MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, UTF8ToAnsi(fmt)); MyWorksheet.WriteNumberFormat(r, 1, nfCustom, UTF8ToAnsi(fmt));
MyWorksheet.WriteFontColor(r, 1, NA_COLOR); MyWorksheet.WriteFontColor(r, 1, NA_COLOR);
MyWorksheet.WriteNumber(r, 2, -number); MyWorksheet.WriteNumber(r, 2, -number);
MyWorksheet.WriteNumberFormat(r, 2, nfCustom, UTF8ToAnsi(fmt)); MyWorksheet.WriteNumberFormat(r, 2, nfCustom, UTF8ToAnsi(fmt));
MyWorksheet.WriteFontColor(r, 2, NA_COLOR); MyWorksheet.WriteFontColor(r, 2, NA_COLOR);
*)
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, _("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)'); MyWorksheet.WriteText(r, 0, 'nfCustom, _("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)');
MyWorksheet.WriteNumber(r, 1, number); MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteFontColor(r, 1, NA_COLOR); MyWorksheet.WriteFontColor(r, 1, NA_COLOR);
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)'); MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)');
@ -293,53 +291,53 @@ begin
MyWorksheet.WriteFontColor(r, 2, NA_COLOR); MyWorksheet.WriteFontColor(r, 2, NA_COLOR);
inc(r, 2); inc(r, 2);
number := 1.333333333; number := 1.333333333;
MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 0 decs'); MyWorksheet.WriteText(r, 0, 'nfPercentage, 0 decs');
MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 0); MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 0);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 1 decs'); MyWorksheet.WriteText(r, 0, 'nfPercentage, 1 decs');
MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 1); MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 1);
MyWorksheet.WriteFontColor(r, 1, NA_COLOR); MyWorksheet.WriteFontColor(r, 1, NA_COLOR);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 2 decs'); MyWorksheet.WriteText(r, 0, 'nfPercentage, 2 decs');
MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 2); MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 2);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 3 decs'); MyWorksheet.WriteText(r, 0, 'nfPercentage, 3 decs');
MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 3); MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 3);
MyWorksheet.WriteFontColor(r, 1, NA_COLOR); MyWorksheet.WriteFontColor(r, 1, NA_COLOR);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, hh:mm:ss'); MyWorksheet.WriteText(r, 0, 'nfTimeInterval, hh:mm:ss');
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval); MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval);
MyWorksheet.WriteFontColor(r, 1, NA_COLOR); MyWorksheet.WriteFontColor(r, 1, NA_COLOR);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, h:m:s'); MyWorksheet.WriteText(r, 0, 'nfTimeInterval, h:m:s');
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'H:M:s'); MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'H:M:s');
MyWorksheet.WriteFontColor(r, 1, NA_COLOR); MyWorksheet.WriteFontColor(r, 1, NA_COLOR);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, hh:mm'); MyWorksheet.WriteText(r, 0, 'nfTimeInterval, hh:mm');
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'hh:mm'); MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'hh:mm');
MyWorksheet.WriteFontColor(r, 1, NA_COLOR); MyWorksheet.WriteFontColor(r, 1, NA_COLOR);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, h:m'); MyWorksheet.WriteText(r, 0, 'nfTimeInterval, h:m');
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'h:m'); MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'h:m');
MyWorksheet.WriteFontColor(r, 1, NA_COLOR); MyWorksheet.WriteFontColor(r, 1, NA_COLOR);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, h'); MyWorksheet.WriteText(r, 0, 'nfTimeInterval, h');
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'h'); MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'h');
MyWorksheet.WriteFontColor(r, 1, NA_COLOR); MyWorksheet.WriteFontColor(r, 1, NA_COLOR);
inc(r); inc(r);
// Set width of columns 0 to 3 // Set width of columns 0 to 3
MyWorksheet.WriteColWidth(0, 48); // 48 characters, default is 12 --> 4x default width MyWorksheet.WriteColWidth(0, 10, suCentimeters); // 10 cm
lCol.Width := 24; // 24 characters, default is 12 --> 2x default width lCol.Width := 40; // WriteColInfo uses workbook units, i.e. mm
MyWorksheet.WriteColInfo(1, lCol); MyWorksheet.WriteColInfo(1, lCol);
MyWorksheet.WriteColInfo(2, lCol); MyWorksheet.WriteColInfo(2, lCol);
MyWorksheet.WriteColInfo(3, lCol); MyWorksheet.WriteColInfo(3, lCol);
MyWorksheet.WriteColInfo(4, lCol);
MyWorksheet.WriteColWidth(5, 6); // default is characters: 6 characters
// Set height of rows 5 and 6 // Set height of rows 5 and 6
lRow.Height := 4; // 4 lines MyWorksheet.WriteRowHeight(5, 4, suLines); // Lines
MyWorksheet.WriteRowInfo(5, lRow); MyWorksheet.WriteRowHeight(6, 2); // Lines is default...
lRow.Height := 2; // 2 lines
MyWorksheet.WriteRowInfo(6, lRow);
// Save the spreadsheet to a file // Save the spreadsheet to a file
MyWorkbook.WriteToFile(MyDir + 'test' + STR_EXCEL_EXTENSION, sfExcel2, true); MyWorkbook.WriteToFile(MyDir + 'test' + STR_EXCEL_EXTENSION, sfExcel2, true);

View File

@ -46,7 +46,7 @@ begin
begin begin
Write('Row: ', CurCell^.Row, Write('Row: ', CurCell^.Row,
' Col: ', CurCell^.Col, ' Value: ', ' Col: ', CurCell^.Col, ' Value: ',
UTF8ToConsole(MyWorkSheet.ReadAsUTF8Text(CurCell^.Row, CurCell^.Col))); UTF8ToConsole(MyWorkSheet.ReadAsText(CurCell^.Row, CurCell^.Col)));
if HasFormula(CurCell) then if HasFormula(CurCell) then
Write(' - Formula: ', CurCell^.FormulaValue); Write(' - Formula: ', CurCell^.FormulaValue);
WriteLn; WriteLn;
@ -56,5 +56,11 @@ begin
// Finalization // Finalization
MyWorkbook.Free; MyWorkbook.Free;
end; end;
{$ifdef Windows}
WriteLn;
WriteLn('Press ENTER to quit...');
Readln;
{$endif}
end. end.

View File

@ -48,10 +48,10 @@ begin
MyWorkbook.AddFont('Calibri', 20, [], scRed); MyWorkbook.AddFont('Calibri', 20, [], scRed);
// Change row height // Change row height
MyWorksheet.WriteRowHeight(0, 1.1); // modify height of row 0 to 3 lines MyWorksheet.WriteRowHeight(0, 3); // modify height of row 0 to 3 lines
// Change colum widths // Change colum widths
MyWorksheet.WriteColWidth(0, 40); MyWorksheet.WriteColWidth(0, 40); // characters
MyWorksheet.WriteColWidth(1, 20); MyWorksheet.WriteColWidth(1, 20);
MyWorksheet.WriteColWidth(2, 20); MyWorksheet.WriteColWidth(2, 20);
MyWorksheet.WriteColWidth(3, 15); MyWorksheet.WriteColWidth(3, 15);
@ -61,12 +61,11 @@ begin
MyWorksheet.WriteNumber(0, 0, 1.0);// A1 MyWorksheet.WriteNumber(0, 0, 1.0);// A1
MyWorksheet.WriteVertAlignment(0, 0, vaCenter); MyWorksheet.WriteVertAlignment(0, 0, vaCenter);
MyWorksheet.WriteNumber(0, 1, 2.0);// B1 MyWorksheet.WriteNumber(0, 1, 2.0);// B1
MyWorksheet.WriteNumber(0, 2, 3.0);// C1 MyWorksheet.WriteNumber(0, 2, 3.0);// C1
MyWorksheet.WriteNumber(0, 3, 4.0);// D1 MyWorksheet.WriteNumber(0, 3, 4.0);// D1
MyWorksheet.WriteUTF8Text(4, 2, Str_Total);// C5 MyWorksheet.WriteText(4, 2, Str_Total);// C5
MyWorksheet.WriteBorders(4, 2, [cbEast, cbNorth, cbWest, cbSouth]); MyWorksheet.WriteBorders(4, 2, [cbEast, cbNorth, cbWest, cbSouth]);
myWorksheet.WriteFontColor(4, 2, scRed); myWorksheet.WriteFontColor(4, 2, scRed);
MyWorksheet.WriteBackgroundColor(4, 2, scSilver); MyWorksheet.WriteBackgroundColor(4, 2, scSilver);
@ -74,35 +73,35 @@ begin
MyWorksheet.WriteNumber(4, 3, 10); // D5 MyWorksheet.WriteNumber(4, 3, 10); // D5
MyWorksheet.WriteUTF8Text(4, 4, 'This is a long wrapped text.'); MyWorksheet.WriteText(4, 4, 'This is a long wrapped text.');
MyWorksheet.WriteUsedFormatting(4, 4, [uffWordWrap]); MyWorksheet.WriteUsedFormatting(4, 4, [uffWordWrap]);
MyWorksheet.WriteHorAlignment(4, 4, haCenter); MyWorksheet.WriteHorAlignment(4, 4, haCenter);
MyWorksheet.WriteUTF8Text(4, 5, 'Stacked text'); MyWorksheet.WriteText(4, 5, 'Stacked text');
MyWorksheet.WriteTextRotation(4, 5, rtStacked); MyWorksheet.WriteTextRotation(4, 5, rtStacked);
MyWorksheet.WriteHorAlignment(4, 5, haCenter); MyWorksheet.WriteHorAlignment(4, 5, haCenter);
MyWorksheet.WriteUTF8Text(4, 6, 'CW-rotated text'); MyWorksheet.WriteText(4, 6, 'CW-rotated text');
MyWorksheet.WriteTextRotation(4, 6, rt90DegreeClockwiseRotation); MyWorksheet.WriteTextRotation(4, 6, rt90DegreeClockwiseRotation);
MyWorksheet.WriteUTF8Text(4, 7, 'CCW-rotated text'); MyWorksheet.WriteText(4, 7, 'CCW-rotated text');
MyWorksheet.WriteTextRotation(4, 7, rt90DegreeCounterClockwiseRotation); MyWorksheet.WriteTextRotation(4, 7, rt90DegreeCounterClockwiseRotation);
MyWorksheet.WriteUTF8Text(4, 8, 'CW-rotated text'); MyWorksheet.WriteText(4, 8, 'CW-rotated text');
MyWorksheet.WriteTextRotation(4, 8, rt90DegreeClockwiseRotation); MyWorksheet.WriteTextRotation(4, 8, rt90DegreeClockwiseRotation);
MyWorksheet.WriteVertAlignment(4, 8, vaTop); MyWorksheet.WriteVertAlignment(4, 8, vaTop);
MyWorksheet.WriteHorAlignment(4, 8, haLeft); MyWorksheet.WriteHorAlignment(4, 8, haLeft);
MyWorksheet.WriteUTF8Text(4, 9, 'CCW-rotated text'); MyWorksheet.WriteText(4, 9, 'CCW-rotated text');
MyWorksheet.WriteTextRotation(4, 9, rt90DegreeCounterClockwiseRotation); MyWorksheet.WriteTextRotation(4, 9, rt90DegreeCounterClockwiseRotation);
MyWorksheet.WriteVertAlignment(4, 9, vaTop); MyWorksheet.WriteVertAlignment(4, 9, vaTop);
Myworksheet.WriteHorAlignment(4, 9, haRight); Myworksheet.WriteHorAlignment(4, 9, haRight);
MyWorksheet.WriteUTF8Text(4, 10, 'CW-rotated text'); MyWorksheet.WriteText(4, 10, 'CW-rotated text');
MyWorksheet.WriteTextRotation(4, 10, rt90DegreeClockwiseRotation); MyWorksheet.WriteTextRotation(4, 10, rt90DegreeClockwiseRotation);
MyWorksheet.WriteVertAlignment(4, 10, vaCenter); MyWorksheet.WriteVertAlignment(4, 10, vaCenter);
MyWorksheet.WriteUTF8Text(4, 11, 'CCW-rotated text'); MyWorksheet.WriteText(4, 11, 'CCW-rotated text');
MyWorksheet.WriteTextRotation(4, 11, rt90DegreeCounterClockwiseRotation); MyWorksheet.WriteTextRotation(4, 11, rt90DegreeCounterClockwiseRotation);
MyWorksheet.WriteVertAlignment(4, 11, vaCenter); MyWorksheet.WriteVertAlignment(4, 11, vaCenter);
@ -170,133 +169,134 @@ begin
r := 10; r := 10;
// Write current date/time to cells B11:B16 // Write current date/time to cells B11:B16
MyWorksheet.WriteUTF8Text(r, 0, 'nfShortDate'); MyWorksheet.WriteText(r, 0, 'nfShortDate');
MyWorksheet.WriteDateTime(r, 1, now, nfShortDate); MyWorksheet.WriteDateTime(r, 1, now, nfShortDate);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfLongDate'); MyWorksheet.WriteText(r, 0, 'nfLongDate');
MyWorksheet.WriteDateTime(r, 1, now, nfLongDate); MyWorksheet.WriteDateTime(r, 1, now, nfLongDate);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfShortTime'); MyWorksheet.WriteText(r, 0, 'nfShortTime');
MyWorksheet.WriteDateTime(r, 1, now, nfShortTime); MyWorksheet.WriteDateTime(r, 1, now, nfShortTime);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfLongTime'); MyWorksheet.WriteText(r, 0, 'nfLongTime');
MyWorksheet.WriteDateTime(r, 1, now, nfLongTime); MyWorksheet.WriteDateTime(r, 1, now, nfLongTime);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfShortDateTime'); MyWorksheet.WriteText(r, 0, 'nfShortDateTime');
MyWorksheet.WriteDateTime(r, 1, now, nfShortDateTime); MyWorksheet.WriteDateTime(r, 1, now, nfShortDateTime);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, dd/mmm'); MyWorksheet.WriteText(r, 0, 'nfCustom, dd/mmm');
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'dd/mmm'); MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'dd/mmm');
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, mmm/yy'); MyWorksheet.WriteText(r, 0, 'nfCustom, mmm/yy');
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'mmm/yy'); MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'mmm/yy');
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfShortTimeAM'); MyWorksheet.WriteText(r, 0, 'nfShortTimeAM');
MyWorksheet.WriteDateTime(r, 1, now, nfShortTimeAM); MyWorksheet.WriteDateTime(r, 1, now, nfShortTimeAM);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfLongTimeAM'); MyWorksheet.WriteText(r, 0, 'nfLongTimeAM');
MyWorksheet.WriteDateTime(r, 1, now, nfLongTimeAM); MyWorksheet.WriteDateTime(r, 1, now, nfLongTimeAM);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, nn:ss'); MyWorksheet.WriteText(r, 0, 'nfCustom, nn:ss');
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'nn:ss'); MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'nn:ss');
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, nn:ss.z'); MyWorksheet.WriteText(r, 0, 'nfCustom, nn:ss.z');
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'nn:ss.z'); MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'nn:ss.z');
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, nn:ss.zzz'); MyWorksheet.WriteText(r, 0, 'nfCustom, nn:ss.zzz');
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'nn:ss.zzz'); MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'nn:ss.zzz');
// Write formatted numbers // Write formatted numbers
number := 12345.67890123456789; number := 12345.67890123456789;
inc(r, 2); inc(r, 2);
MyWorksheet.WriteUTF8Text(r, 1, '12345.67890123456789'); MyWorksheet.WriteText(r, 1, '12345.67890123456789');
MyWorksheet.WriteUTF8Text(r, 2, '-12345.67890123456789'); MyWorksheet.WriteText(r, 2, '-12345.67890123456789');
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfGeneral'); MyWorksheet.WriteText(r, 0, 'nfGeneral');
MyWorksheet.WriteNumber(r, 1, number, nfGeneral); MyWorksheet.WriteNumber(r, 1, number, nfGeneral);
MyWorksheet.WriteNumber(r, 2, -number, nfGeneral); MyWorksheet.WriteNumber(r, 2, -number, nfGeneral);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixed, 0 decs'); MyWorksheet.WriteText(r, 0, 'nfFixed, 0 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixed, 0); MyWorksheet.WriteNumber(r, 1, number, nfFixed, 0);
MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 0); MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 0);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixed, 1 decs'); MyWorksheet.WriteText(r, 0, 'nfFixed, 1 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixed, 1); MyWorksheet.WriteNumber(r, 1, number, nfFixed, 1);
MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 1); MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 1);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixed, 2 decs'); MyWorksheet.WriteText(r, 0, 'nfFixed, 2 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixed, 2); MyWorksheet.WriteNumber(r, 1, number, nfFixed, 2);
MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 2); MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 2);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixed, 3 decs'); MyWorksheet.WriteText(r, 0, 'nfFixed, 3 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixed, 3); MyWorksheet.WriteNumber(r, 1, number, nfFixed, 3);
MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 3); MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 3);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixedTh, 0 decs'); MyWorksheet.WriteText(r, 0, 'nfFixedTh, 0 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 0); MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 0);
MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 0); MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 0);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixedTh, 1 decs'); MyWorksheet.WriteText(r, 0, 'nfFixedTh, 1 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 1); MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 1);
MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 1); MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 1);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixedTh, 2 decs'); MyWorksheet.WriteText(r, 0, 'nfFixedTh, 2 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 2); MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 2);
MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 2); MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 2);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixedTh, 3 decs'); MyWorksheet.WriteText(r, 0, 'nfFixedTh, 3 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 3); MyWorksheet.WriteNumber(r, 1, number, nfFixedTh, 3);
MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 3); MyWorksheet.WriteNumber(r, 2, -number, nfFixedTh, 3);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfExp, 1 dec'); MyWorksheet.WriteText(r, 0, 'nfExp, 1 dec');
MyWorksheet.WriteNumber(r, 1, number, nfExp, 1); MyWorksheet.WriteNumber(r, 1, number, nfExp, 1);
MyWorksheet.WriteNumber(r, 2, -number, nfExp, 1); MyWorksheet.WriteNumber(r, 2, -number, nfExp, 1);
MyWorksheet.WriteNumber(r, 3, 1.0/number, nfExp, 1); MyWorksheet.WriteNumber(r, 3, 1.0/number, nfExp, 1);
MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 1); MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 1);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfExp, 2 decs'); MyWorksheet.WriteText(r, 0, 'nfExp, 2 decs');
MyWorksheet.WriteNumber(r, 1, number, nfExp, 2); MyWorksheet.WriteNumber(r, 1, number, nfExp, 2);
MyWorksheet.WriteNumber(r, 2, -number, nfExp, 2); MyWorksheet.WriteNumber(r, 2, -number, nfExp, 2);
MyWorksheet.WriteNumber(r, 3, 1.0/number, nfExp, 2); MyWorksheet.WriteNumber(r, 3, 1.0/number, nfExp, 2);
MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 2); MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 2);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfExp, 3 decs'); MyWorksheet.WriteText(r, 0, 'nfExp, 3 decs');
MyWorksheet.WriteNumber(r, 1, number, nfExp, 3); MyWorksheet.WriteNumber(r, 1, number, nfExp, 3);
MyWorksheet.WriteNumber(r, 2, -number, nfExp, 3); MyWorksheet.WriteNumber(r, 2, -number, nfExp, 3);
MyWorksheet.WriteNumber(r, 3, 1.0/number, nfExp, 3); MyWorksheet.WriteNumber(r, 3, 1.0/number, nfExp, 3);
MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 3); MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 3);
inc(r,2); inc(r,2);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCurrency, 0 decs'); MyWorksheet.WriteText(r, 0, 'nfCurrency, 0 decs');
MyWorksheet.WriteCurrency(r, 1, number, nfCurrency, 0, 'USD'); MyWorksheet.WriteCurrency(r, 1, number, nfCurrency, 0, 'USD');
MyWorksheet.WriteCurrency(r, 2, -number, nfCurrency, 0, 'USD'); MyWorksheet.WriteCurrency(r, 2, -number, nfCurrency, 0, 'USD');
MyWorksheet.WriteCurrency(r, 3, 0.0, nfCurrency, 0, 'USD'); MyWorksheet.WriteCurrency(r, 3, 0.0, nfCurrency, 0, 'USD');
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCurrencyRed, 0 decs'); MyWorksheet.WriteText(r, 0, 'nfCurrencyRed, 0 decs');
MyWorksheet.WriteCurrency(r, 1, number, nfCurrencyRed, 0, 'USD'); MyWorksheet.WriteCurrency(r, 1, number, nfCurrencyRed, 0, 'USD');
MyWorksheet.WriteCurrency(r, 2, -number, nfCurrencyRed, 0, 'USD'); MyWorksheet.WriteCurrency(r, 2, -number, nfCurrencyRed, 0, 'USD');
MyWorksheet.WriteCurrency(r, 3, 0.0, nfCurrencyRed, 0, 'USD'); MyWorksheet.WriteCurrency(r, 3, 0.0, nfCurrencyRed, 0, 'USD');
inc(r, 2); inc(r, 2);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, "$"#,##0_);("$"#,##0)'); MyWorksheet.WriteText(r, 0, 'nfCustom, "$"#,##0_);("$"#,##0)');
MyWorksheet.WriteNumber(r, 1, number); MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '"$"#,##0_);("$"#,##0)'); MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '"$"#,##0_);("$"#,##0)');
MyWorksheet.WriteNumber(r, 2, -number); MyWorksheet.WriteNumber(r, 2, -number);
MyWorksheet.WriteNumberFormat(r, 2, nfCustom, '"$"#,##0_);("$"#,##0)'); MyWorksheet.WriteNumberFormat(r, 2, nfCustom, '"$"#,##0_);("$"#,##0)');
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, "$"#,##0.0_);[Red]("$"#,##0.0)'); MyWorksheet.WriteText(r, 0, 'nfCustom, "$"#,##0.0_);[Red]("$"#,##0.0)');
MyWorksheet.WriteNumber(r, 1, number); MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '"$"#,##0.0_);[Red]("$"#,##0.0)'); MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '"$"#,##0.0_);[Red]("$"#,##0.0)');
MyWorksheet.WriteNumber(r, 2, -number); MyWorksheet.WriteNumber(r, 2, -number);
MyWorksheet.WriteNumberFormat(r, 2, nfCustom, '"$"#,##0.0_);[Red]("$"#,##0.0)'); MyWorksheet.WriteNumberFormat(r, 2, nfCustom, '"$"#,##0.0_);[Red]("$"#,##0.0)');
inc(r); inc(r);
fmt := '"€"#,##0.0_);[Red]("€"#,##0.0)'; fmt := '"€"#,##0.0_);[Red]("€"#,##0.0)';
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, '+fmt); MyWorksheet.WriteText(r, 0, 'nfCustom, '+fmt);
MyWorksheet.WriteNumber(r, 1, number); MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, UTF8ToAnsi(fmt)); MyWorksheet.WriteNumberFormat(r, 1, nfCustom, UTF8ToAnsi(fmt));
MyWorksheet.WriteNumber(r, 2, -number); MyWorksheet.WriteNumber(r, 2, -number);
MyWorksheet.WriteNumberFormat(r, 2, nfCustom, UTF8ToAnsi(fmt)); MyWorksheet.WriteNumberFormat(r, 2, nfCustom, UTF8ToAnsi(fmt));
inc(r); { --- not working correctly: Except reports an error inc(r);
{ --- not working correctly: Excel reports an error
fmt := '[Green]"¥"#,##0.0_);[Red]-"¥"#,##0.0'; fmt := '[Green]"¥"#,##0.0_);[Red]-"¥"#,##0.0';
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, '+fmt); MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, '+fmt);
MyWorksheet.WriteNumber(r, 1, number); MyWorksheet.WriteNumber(r, 1, number);
@ -304,46 +304,46 @@ begin
MyWorksheet.WriteNumber(r, 2, -number); MyWorksheet.WriteNumber(r, 2, -number);
MyWorksheet.WriteNumberFormat(r, 2, nfCustom, UTF8ToAnsi(fmt)); MyWorksheet.WriteNumberFormat(r, 2, nfCustom, UTF8ToAnsi(fmt));
inc(r); } inc(r); }
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, _("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)'); MyWorksheet.WriteText(r, 0, 'nfCustom, _("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)');
MyWorksheet.WriteNumber(r, 1, number); MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)'); MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)');
MyWorksheet.WriteNumber(r, 2, -number); MyWorksheet.WriteNumber(r, 2, -number);
MyWorksheet.WriteNumberFormat(r, 2, nfCustom, '_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)'); MyWorksheet.WriteNumberFormat(r, 2, nfCustom, '_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)');
inc(r, 2); inc(r, 2);
number := 1.333333333; number := 1.333333333;
MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 0 decs'); MyWorksheet.WriteText(r, 0, 'nfPercentage, 0 decs');
MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 0); MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 0);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 1 decs'); MyWorksheet.WriteText(r, 0, 'nfPercentage, 1 decs');
MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 1); MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 1);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 2 decs'); MyWorksheet.WriteText(r, 0, 'nfPercentage, 2 decs');
MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 2); MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 2);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 3 decs'); MyWorksheet.WriteText(r, 0, 'nfPercentage, 3 decs');
MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 3); MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 3);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, hh:mm:ss'); MyWorksheet.WriteText(r, 0, 'nfTimeInterval, hh:mm:ss');
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval); MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, h:m:s'); MyWorksheet.WriteText(r, 0, 'nfTimeInterval, h:m:s');
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'H:M:s'); MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'H:M:s');
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, hh:mm'); MyWorksheet.WriteText(r, 0, 'nfTimeInterval, hh:mm');
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'hh:mm'); MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'hh:mm');
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, h:m'); MyWorksheet.WriteText(r, 0, 'nfTimeInterval, h:m');
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'h:m'); MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'h:m');
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, h'); MyWorksheet.WriteText(r, 0, 'nfTimeInterval, h');
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'h'); MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'h');
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFraction, ??/??'); MyWorksheet.WriteText(r, 0, 'nfFraction, ??/??');
MyWorksheet.WriteNumber(r, 1, number); MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteFractionFormat(r, 1, false, 2, 2); MyWorksheet.WriteFractionFormat(r, 1, false, 2, 2);
inc(r); inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFraction, # ??/??'); MyWorksheet.WriteText(r, 0, 'nfFraction, # ??/??');
MyWorksheet.WriteNumber(r, 1, number); MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteFractionFormat(r, 1, true, 2, 2); MyWorksheet.WriteFractionFormat(r, 1, true, 2, 2);
@ -353,10 +353,10 @@ begin
MyWorksheet := MyWorkbook.AddWorksheet(Str_Worksheet2); MyWorksheet := MyWorkbook.AddWorksheet(Str_Worksheet2);
// Write some string cells // Write some string cells
MyWorksheet.WriteUTF8Text(0, 0, Str_First); MyWorksheet.WriteText(0, 0, Str_First);
MyWorksheet.WriteUTF8Text(0, 1, Str_Second); MyWorksheet.WriteText(0, 1, Str_Second);
MyWorksheet.WriteUTF8Text(0, 2, Str_Third); MyWorksheet.WriteText(0, 2, Str_Third);
MyWorksheet.WriteUTF8Text(0, 3, Str_Fourth); MyWorksheet.WriteText(0, 3, Str_Fourth);
// Creates a new worksheet // Creates a new worksheet
MyWorksheet := MyWorkbook.AddWorksheet('Colors'); MyWorksheet := MyWorkbook.AddWorksheet('Colors');
@ -366,7 +366,7 @@ begin
for i:=0 to palette.Count-1 do begin for i:=0 to palette.Count-1 do begin
MyWorksheet.WriteBlank(i, 0); MyWorksheet.WriteBlank(i, 0);
Myworksheet.WriteBackgroundColor(i, 0, palette[i]); Myworksheet.WriteBackgroundColor(i, 0, palette[i]);
MyWorksheet.WriteUTF8Text(i, 1, GetColorName(palette[i])); MyWorksheet.WriteText(i, 1, GetColorName(palette[i]));
end; end;
finally finally
palette.Free; palette.Free;

View File

@ -63,5 +63,11 @@ begin
// Finalization // Finalization
MyWorkbook.Free; MyWorkbook.Free;
end; end;
{$IFDEF WINDOWS}
WriteLn;
WriteLn('Press ENTER to quit...');
ReadLn;
{$ENDIF}
end. end.

View File

@ -365,17 +365,17 @@ begin
Myworksheet.WriteNumber(r, 1, number, nfFraction, '# ??/??'); Myworksheet.WriteNumber(r, 1, number, nfFraction, '# ??/??');
// Set width of columns 0, 1 and 5 // Set width of columns 0, 1 and 5
MyWorksheet.WriteColWidth(0, 30); MyWorksheet.WriteColWidth(0, 30, suChars);
lCol.Width := 25; lCol.Width := 60;
MyWorksheet.WriteColInfo(1, lCol); MyWorksheet.WriteColInfo(1, lCol); // ColInfo uses by default workbook units --> mm
MyWorksheet.WriteColWidth(2, 15); MyWorksheet.WriteColWidth(2, 15, suChars);
MyWorksheet.WriteColWidth(3, 15); MyWorksheet.WriteColWidth(3, 15, suChars);
MyWorksheet.WriteColWidth(4, 15); MyWorksheet.WriteColWidth(4, 15, suChars);
lCol.Width := 5; lCol.Width := 12; // mm
MyWorksheet.WriteColInfo(5, lCol); MyWorksheet.WriteColInfo(5, lCol);
// Set height of rows 0 // Set height of rows 0
MyWorksheet.WriteRowHeight(0, 5); // 5 lines MyWorksheet.WriteRowHeight(0, 5, suLines); // 5 lines
// Creates a new worksheet // Creates a new worksheet
MyWorksheet := MyWorkbook.AddWorksheet(Str_Worksheet2); MyWorksheet := MyWorkbook.AddWorksheet(Str_Worksheet2);

View File

@ -61,9 +61,9 @@ begin
MyWorkbook.Free; MyWorkbook.Free;
end; end;
{$IFDEF MSWINDOWS} {$IFDEF WINDOWS}
WriteLn; WriteLn;
WriteLn('Press ENTER to exit.'); WriteLn('Press ENTER to quit...');
ReadLn; ReadLn;
{$ENDIF} {$ENDIF}
end. end.

View File

@ -54,7 +54,7 @@ begin
Write( Write(
'Row: ', CurCell^.Row, 'Row: ', CurCell^.Row,
' Col: ', CurCell^.Col, ' Col: ', CurCell^.Col,
' Value: ', UTF8ToConsole(MyWorkSheet.ReadAsUTF8Text(CurCell^.Row, CurCell^.Col)) ' Value: ', UTF8ToConsole(MyWorkSheet.ReadAsText(CurCell^.Row, CurCell^.Col))
); );
if MyWorksheet.HasHyperlink(CurCell) then if MyWorksheet.HasHyperlink(CurCell) then
Write(' Hyperlink: ', MyWorksheet.ReadHyperlink(CurCell).Target); Write(' Hyperlink: ', MyWorksheet.ReadHyperlink(CurCell).Target);
@ -69,9 +69,9 @@ begin
stream.Free; stream.Free;
end; end;
{$IFDEF MSWINDOWS} {$IFDEF WINDOWS}
WriteLn; WriteLn;
WriteLn('Press ENTER to exit.'); WriteLn('Press ENTER to quit...');
ReadLn; ReadLn;
{$ENDIF} {$ENDIF}
end. end.

View File

@ -31,136 +31,136 @@ begin
Myworksheet.LeftPaneWidth := 1; Myworksheet.LeftPaneWidth := 1;
// Write colwidth // Write colwidth
Myworksheet.WriteColWidth(1, 25); // 25 characters Myworksheet.WriteColWidth(1, 25, suChars); // approx 25 characters
// Write some cells // Write some cells
row := 0; row := 0;
MyWorksheet.WriteBlank(row, 0); MyWorksheet.WriteBlank(row, 0);
MyWorksheet.WriteUTF8Text(row, 1, 'Description'); MyWorksheet.WriteText(row, 1, 'Description');
MyWorksheet.WriteUTF8Text(row, 2, 'Example'); MyWorksheet.WriteText(row, 2, 'Example');
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'This is a text:'); MyWorksheet.WriteText(row, 1, 'This is a text:');
MyWorksheet.WriteUTF8Text(row, 2, 'Hello world!'); MyWorksheet.WriteText(row, 2, 'Hello world!');
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'This is bold text:'); MyWorksheet.WriteText(row, 1, 'This is bold text:');
Myworksheet.WriteUTF8Text(row, 2, 'Hello world!'); Myworksheet.WriteText(row, 2, 'Hello world!');
Myworksheet.WriteFontStyle(row, 2, [fssBold]); Myworksheet.WriteFontStyle(row, 2, [fssBold]);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'This is a number:'); MyWorksheet.WriteText(row, 1, 'This is a number:');
MyWorksheet.WriteNumber(row, 2, 3.141592); MyWorksheet.WriteNumber(row, 2, 3.141592);
Myworksheet.WriteHorAlignment(row, 2, haRight); Myworksheet.WriteHorAlignment(row, 2, haRight);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'This is a date:'); MyWorksheet.WriteText(row, 1, 'This is a date:');
Myworksheet.WriteDateTime(row, 2, date()); Myworksheet.WriteDateTime(row, 2, date());
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'This is a long text:'); MyWorksheet.WriteText(row, 1, 'This is a long text:');
MyWorksheet.WriteUTF8Text(row, 2, 'A very, very, very, very long text, indeed'); MyWorksheet.WriteText(row, 2, 'A very, very, very, very long text, indeed');
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Centered text:'); MyWorksheet.WriteText(row, 1, 'Centered text:');
MyWorksheet.WriteUTF8Text(row, 2, 'I am in the center.'); MyWorksheet.WriteText(row, 2, 'I am in the center.');
MyWorksheet.WriteHorAlignment(row, 2, haCenter); MyWorksheet.WriteHorAlignment(row, 2, haCenter);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'This is a long text with line break:'); MyWorksheet.WriteText(row, 1, 'This is a long text with line break:');
Myworksheet.WriteVertAlignment(row, 1, vaTop); Myworksheet.WriteVertAlignment(row, 1, vaTop);
MyWorksheet.WriteUTF8Text(row, 2, 'A very, very, very, very long text,<br /> indeed'); MyWorksheet.WriteText(row, 2, 'A very, very, very, very long text,<br /> indeed');
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Merged rows'); MyWorksheet.WriteText(row, 1, 'Merged rows');
Myworksheet.MergeCells(row, 1, row+1, 1); Myworksheet.MergeCells(row, 1, row+1, 1);
MyWorksheet.WriteUTF8Text(row, 2, 'A'); MyWorksheet.WriteText(row, 2, 'A');
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 2, 'B'); MyWorksheet.WriteText(row, 2, 'B');
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Merged columns'); MyWorksheet.WriteText(row, 1, 'Merged columns');
MyWorksheet.WriteHorAlignment(row, 1, haCenter); MyWorksheet.WriteHorAlignment(row, 1, haCenter);
MyWorksheet.MergeCells(row, 1, row, 2); MyWorksheet.MergeCells(row, 1, row, 2);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Right border:'); MyWorksheet.WriteText(row, 1, 'Right border:');
MyWorksheet.WriteUTF8Text(row, 2, 'medium / red'); MyWorksheet.WriteText(row, 2, 'medium / red');
MyWorksheet.WriteBorders(row, 2, [cbEast]); MyWorksheet.WriteBorders(row, 2, [cbEast]);
MyWorksheet.WriteBorderStyle(row, 2, cbEast, lsMedium, scRed); MyWorksheet.WriteBorderStyle(row, 2, cbEast, lsMedium, scRed);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Top border:'); MyWorksheet.WriteText(row, 1, 'Top border:');
MyWorksheet.WriteUTF8Text(row, 2, 'top / dashed'); MyWorksheet.WriteText(row, 2, 'top / dashed');
MyWorksheet.WriteBorders(row, 2, [cbNorth]); MyWorksheet.WriteBorders(row, 2, [cbNorth]);
MyWorksheet.WriteBorderLineStyle(row, 2, cbNorth, lsDashed); MyWorksheet.WriteBorderLineStyle(row, 2, cbNorth, lsDashed);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Left border:'); MyWorksheet.WriteText(row, 1, 'Left border:');
MyWorksheet.WriteUTF8Text(row, 2, 'left / dotted'); MyWorksheet.WriteText(row, 2, 'left / dotted');
MyWorksheet.WriteBorders(row, 2, [cbWest]); MyWorksheet.WriteBorders(row, 2, [cbWest]);
MyWorksheet.WriteBorderLineStyle(row, 2, cbWest, lsDotted); MyWorksheet.WriteBorderLineStyle(row, 2, cbWest, lsDotted);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Bottom border:'); MyWorksheet.WriteText(row, 1, 'Bottom border:');
MyWorksheet.WriteUTF8Text(row, 2, 'bottom / double'); MyWorksheet.WriteText(row, 2, 'bottom / double');
MyWorksheet.WriteBorders(row, 2, [cbSouth]); MyWorksheet.WriteBorders(row, 2, [cbSouth]);
MyWorksheet.WriteBorderLineStyle(row, 2, cbSouth, lsDouble); MyWorksheet.WriteBorderLineStyle(row, 2, cbSouth, lsDouble);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'This row is high'); MyWorksheet.WriteText(row, 1, 'This row is high');
MyWorksheet.WriteRowHeight(row, 5); MyWorksheet.WriteRowHeight(row, 5);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Colors:'); MyWorksheet.WriteText(row, 1, 'Colors:');
MyWorksheet.WriteUTF8Text(row, 2, 'yellow on blue'); MyWorksheet.WriteText(row, 2, 'yellow on blue');
MyWorksheet.WriteFontColor(row, 2, scYellow); MyWorksheet.WriteFontColor(row, 2, scYellow);
MyWorksheet.WriteBackgroundColor(row, 2, scBlue); MyWorksheet.WriteBackgroundColor(row, 2, scBlue);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'RGB background color:'); MyWorksheet.WriteText(row, 1, 'RGB background color:');
MyWorksheet.WriteUTF8Text(row, 2, 'color #FF77C3'); // HTML colors are big-endian MyWorksheet.WriteText(row, 2, 'color #FF77C3'); // HTML colors are big-endian
MyWorksheet.WriteBackgroundColor(row, 2, $C377FF); // fps colors are little-endian MyWorksheet.WriteBackgroundColor(row, 2, $C377FF); // fps colors are little-endian
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Bold text:'); MyWorksheet.WriteText(row, 1, 'Bold text:');
MyWorksheet.WriteUTF8Text(row, 2, 'Bold text'); MyWorksheet.WriteText(row, 2, 'Bold text');
MyWorksheet.WriteFontStyle(row, 2, [fssBold]); MyWorksheet.WriteFontStyle(row, 2, [fssBold]);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Italic text:'); MyWorksheet.WriteText(row, 1, 'Italic text:');
MyWorksheet.WriteUTF8Text(row, 2, 'Italic text'); MyWorksheet.WriteText(row, 2, 'Italic text');
MyWorksheet.WriteFontStyle(row, 2, [fssItalic]); MyWorksheet.WriteFontStyle(row, 2, [fssItalic]);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Underlined text:'); MyWorksheet.WriteText(row, 1, 'Underlined text:');
MyWorksheet.WriteUTF8Text(row, 2, 'Underlined text'); MyWorksheet.WriteText(row, 2, 'Underlined text');
MyWorksheet.WriteFontStyle(row, 2, [fssUnderline]); MyWorksheet.WriteFontStyle(row, 2, [fssUnderline]);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Strike-through text:'); MyWorksheet.WriteText(row, 1, 'Strike-through text:');
MyWorksheet.WriteUTF8Text(row, 2, 'Strike-through text'); MyWorksheet.WriteText(row, 2, 'Strike-through text');
MyWorksheet.WriteFontStyle(row, 2, [fssStrikeout]); MyWorksheet.WriteFontStyle(row, 2, [fssStrikeout]);
inc(row); inc(row);

View File

@ -37,28 +37,28 @@ begin
try try
sheet := srcWorkbook.AddWorksheet('Sheet'); sheet := srcWorkbook.AddWorksheet('Sheet');
sheet.WriteUTF8Text(0, 0, 'Link to biff8 test file'); sheet.WriteText(0, 0, 'Link to biff8 test file');
sheet.WriteHyperlink(0, 0, '../excel8demo/test.xls#''My Worksheet 2''!A1'); sheet.WriteHyperlink(0, 0, '../excel8demo/test.xls#''My Worksheet 2''!A1');
//sheet.WriteHyperlink(0, 0, '../excel8demo/test.xls#''Meu Relatório''!A1'); //sheet.WriteHyperlink(0, 0, '../excel8demo/test.xls#''Meu Relatório''!A1');
sheet.WriteUTF8Text(1, 0, 'Link to ods test file'); sheet.WriteText(1, 0, 'Link to ods test file');
sheet.WriteHyperlink(1, 0, '..\opendocdemo\test.ods'); sheet.WriteHyperlink(1, 0, '..\opendocdemo\test.ods');
sheet.WriteUTF8Text(2, 0, 'E-Mail Link'); sheet.WriteText(2, 0, 'E-Mail Link');
sheet.WriteHyperlink(2, 0, 'mailto:someone@mail.com;someoneelse@mail.com?Subject=This is a test'); sheet.WriteHyperlink(2, 0, 'mailto:someone@mail.com;someoneelse@mail.com?Subject=This is a test');
sheet.WriteUTF8Text(3, 0, 'Web-Hyperlink'); sheet.WriteText(3, 0, 'Web-Hyperlink');
sheet.WriteHyperlink(3, 0, 'http://www.lazarus-ide.org/'); sheet.WriteHyperlink(3, 0, 'http://www.lazarus-ide.org/');
sheet.WriteUTF8Text(4, 0, 'File-Link (absolute path)'); sheet.WriteText(4, 0, 'File-Link (absolute path)');
sheet.WriteHyperlink(4, 0, 'file:///'+ExpandFilename('..\..\..\tests\testooxml_1899.xlsx')); sheet.WriteHyperlink(4, 0, 'file:///'+ExpandFilename('..\..\..\tests\testooxml_1899.xlsx'));
// This creates the URI such as "file:///D:\Prog_Lazarus\svn\lazarus-ccr\components\fpspreadsheet\tests\testooxml_1899.xlsx" // This creates the URI such as "file:///D:\Prog_Lazarus\svn\lazarus-ccr\components\fpspreadsheet\tests\testooxml_1899.xlsx"
// but makes sure that the file exists on your system. // but makes sure that the file exists on your system.
sheet.WriteUTF8Text(5, 0, 'Jump to A10'); sheet.WriteText(5, 0, 'Jump to A10');
sheet.WriteHyperlink(5, 0, '#A10'); sheet.WriteHyperlink(5, 0, '#A10');
sheet.WriteColWidth(0, 40); sheet.WriteColWidth(0, 40, suChars);
srcWorkbook.WriteToFile(srcFile, true); srcWorkbook.WriteToFile(srcFile, true);
finally finally
@ -124,7 +124,6 @@ begin
WriteLn('Failure finding linked worksheet.'); WriteLn('Failure finding linked worksheet.');
continue; continue;
end; end;
// linkedSheet := linkedWorkbook.GetWorksheetByName(bookmark);
// Copy linked worksheet to new sheet in destination workbook // Copy linked worksheet to new sheet in destination workbook
destSheet := destWorkbook.CopyWorksheetFrom(linkedSheet); destSheet := destWorkbook.CopyWorksheetFrom(linkedSheet);
// Create sheet name // Create sheet name
@ -152,8 +151,11 @@ begin
end else end else
WriteLn('No hyperlinks found.'); WriteLn('No hyperlinks found.');
{$IFDEF Windows}
WriteLn;
WriteLn('Press ENTER to close...'); WriteLn('Press ENTER to close...');
ReadLn; ReadLn;
{$ENDIF}
finally finally
// Clean up // Clean up

View File

@ -25,7 +25,7 @@ begin
// Open the input file // Open the input file
MyDir := ExtractFilePath(ParamStr(0)); MyDir := ExtractFilePath(ParamStr(0));
InputFileName := MyDir + 'a.xlsx'; InputFileName := MyDir + 'test.xlsx';
if not FileExists(InputFileName) then begin if not FileExists(InputFileName) then begin
WriteLn('Input file ', InputFileName, ' does not exist. Please run opendocwrite first.'); WriteLn('Input file ', InputFileName, ' does not exist. Please run opendocwrite first.');
Halt; Halt;
@ -49,10 +49,16 @@ begin
WriteLn( WriteLn(
'Row: ', cell^.Row, 'Row: ', cell^.Row,
' Col: ', cell^.Col, ' Col: ', cell^.Col,
' Value: ', UTF8ToConsole(MyWorkSheet.ReadAsUTF8Text(cell^.Row, cell^.Col)) ' Value: ', UTF8ToConsole(MyWorkSheet.ReadAsText(cell^.Row, cell^.Col))
); );
// Finalization // Finalization
MyWorkbook.Free; MyWorkbook.Free;
{$ifdef WINDOWS}
WriteLn;
WriteLn('Press ENTER to quit...');
ReadLn;
{$ENDIF}
end. end.

View File

@ -34,10 +34,10 @@ begin
MyWorksheet.WriteNumber(0, 3, 4.0); MyWorksheet.WriteNumber(0, 3, 4.0);
MyWorksheet.WriteUTF8Text(0, 4, '& " '' < >'); MyWorksheet.WriteUTF8Text(0, 4, '& " '' < >');
MyWorksheet.WriteUTF8Text(0, 26, 'AA'); // Test for column name MyWorksheet.WriteText(0, 26, 'AA'); // Test for column name
MyWorksheet.WriteColWidth(0, 20); MyWorksheet.WriteColWidth(0, 20, suChars);
MyWorksheet.WriteRowHeight(0, 4); MyWorksheet.WriteRowHeight(0, 4, suLines);
// Write some formulas // Write some formulas
Myworksheet.WriteFormula(0, 5, '=A1-B1'); Myworksheet.WriteFormula(0, 5, '=A1-B1');
@ -47,10 +47,10 @@ begin
// Uncomment this to test large XLS files // Uncomment this to test large XLS files
for i := 2 to 2{20} do for i := 2 to 2{20} do
begin begin
MyWorksheet.WriteUTF8Text(i, 0, ParamStr(0)); MyWorksheet.WriteText(i, 0, ParamStr(0));
MyWorksheet.WriteUTF8Text(i, 1, ParamStr(0)); MyWorksheet.WriteText(i, 1, ParamStr(0));
MyWorksheet.WriteUTF8Text(i, 2, ParamStr(0)); MyWorksheet.WriteText(i, 2, ParamStr(0));
MyWorksheet.WriteUTF8Text(i, 3, ParamStr(0)); MyWorksheet.WriteText(i, 3, ParamStr(0));
end; end;
// Test for Bold // Test for Bold
@ -64,32 +64,32 @@ begin
MyCell^.FontIndex := BOLD_FONTINDEX; MyCell^.FontIndex := BOLD_FONTINDEX;
// Background and text color // Background and text color
MyWorksheet.WriteUTF8Text(4, 0, 'white on red'); MyWorksheet.WriteText(4, 0, 'white on red');
Myworksheet.WriteBackgroundColor(4, 0, scRed); Myworksheet.WriteBackgroundColor(4, 0, scRed);
MyWorksheet.WriteFontColor(4, 0, scWhite); MyWorksheet.WriteFontColor(4, 0, scWhite);
// Border // Border
MyWorksheet.WriteUTF8Text(4, 2, 'left/right'); MyWorksheet.WriteText(4, 2, 'left/right');
Myworksheet.WriteBorders(4, 2, [cbWest, cbEast]); Myworksheet.WriteBorders(4, 2, [cbWest, cbEast]);
MyWorksheet.WriteHorAlignment(4, 2, haCenter); MyWorksheet.WriteHorAlignment(4, 2, haCenter);
Myworksheet.WriteUTF8Text(4, 4, 'top/bottom'); Myworksheet.WriteText(4, 4, 'top/bottom');
Myworksheet.WriteBorders(4, 4, [cbNorth, cbSouth]); Myworksheet.WriteBorders(4, 4, [cbNorth, cbSouth]);
MyWorksheet.WriteBorderStyle(4, 4, cbSouth, lsThick, scBlue); MyWorksheet.WriteBorderStyle(4, 4, cbSouth, lsThick, scBlue);
Myworksheet.WriteHorAlignment(4, 4, haRight); Myworksheet.WriteHorAlignment(4, 4, haRight);
// Wordwrap // Wordwrap
MyWorksheet.WriteUTF8Text(4, 6, 'This is a long, long, long, wrapped text.'); MyWorksheet.WriteText(4, 6, 'This is a long, long, long, wrapped text.');
MyWorksheet.WriteWordwrap(4, 6, true); MyWorksheet.WriteWordwrap(4, 6, true);
// Creates a new worksheet // Creates a new worksheet
MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet 2'); MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet 2');
// Write some string cells // Write some string cells
MyWorksheet.WriteUTF8Text(0, 0, 'First'); MyWorksheet.WriteText(0, 0, 'First');
MyWorksheet.WriteUTF8Text(0, 1, 'Second'); MyWorksheet.WriteText(0, 1, 'Second');
MyWorksheet.WriteUTF8Text(0, 2, 'Third'); MyWorksheet.WriteText(0, 2, 'Third');
MyWorksheet.WriteUTF8Text(0, 3, 'Fourth'); MyWorksheet.WriteText(0, 3, 'Fourth');
// Write current date/time // Write current date/time
MyWorksheet.WriteDateTime(0, 5, now, nfShortDate); MyWorksheet.WriteDateTime(0, 5, now, nfShortDate);

View File

@ -49,10 +49,16 @@ begin
WriteLn( WriteLn(
'Row: ', cell^.Row, 'Row: ', cell^.Row,
' Col: ', cell^.Col, ' Col: ', cell^.Col,
' Value: ', UTF8ToConsole(MyWorkSheet.ReadAsUTF8Text(cell^.Row, cell^.Col)) ' Value: ', UTF8ToConsole(MyWorkSheet.ReadAsText(cell^.Row, cell^.Col))
); );
// Finalization // Finalization
MyWorkbook.Free; MyWorkbook.Free;
{$IFDEF WINDOWS}
WriteLn;
Writeln('Press ENTER to quit...');
ReadLn;
{$ENDIF}
end. end.

View File

@ -43,7 +43,7 @@ begin
MyWorksheet.WriteNumber(0, 1, 2.0); // B1 MyWorksheet.WriteNumber(0, 1, 2.0); // B1
MyWorksheet.WriteNumber(0, 2, 3.0); // C1 MyWorksheet.WriteNumber(0, 2, 3.0); // C1
MyWorksheet.WriteNumber(0, 3, 4.0); // D1 MyWorksheet.WriteNumber(0, 3, 4.0); // D1
MyWorksheet.WriteUTF8Text(4, 2, 'Total:');// C5 MyWorksheet.WriteText(4, 2, 'Total:'); // C5
MyWorksheet.WriteNumber(4, 3, 10); // D5 MyWorksheet.WriteNumber(4, 3, 10); // D5
MyWorksheet.WriteDateTime(5, 0, now); MyWorksheet.WriteDateTime(5, 0, now);
@ -52,9 +52,9 @@ begin
MyWorksheet.WriteFont(0, 1, 'Times New Roman', 16, [], scRed); MyWorksheet.WriteFont(0, 1, 'Times New Roman', 16, [], scRed);
// Show number formats // Show number formats
MyWorksheet.WriteUTF8Text(row, 0, 'Number formats:'); MyWorksheet.WriteText(row, 0, 'Number formats:');
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfGeneral'); MyWorksheet.WriteText(row, 0, 'nfGeneral');
MyWorksheet.WriteNumber(row, 1, number1, nfGeneral); MyWorksheet.WriteNumber(row, 1, number1, nfGeneral);
MyWorksheet.WriteNumber(row, 2, number2, nfGeneral); MyWorksheet.WriteNumber(row, 2, number2, nfGeneral);
MyWorksheet.WriteNumber(row, 3, number3, nfGeneral); MyWorksheet.WriteNumber(row, 3, number3, nfGeneral);
@ -64,7 +64,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfGeneral); MyWorksheet.WriteNumber(row, 7, number7, nfGeneral);
MyWorksheet.WriteNumber(row, 8, number8, nfGeneral); MyWorksheet.WriteNumber(row, 8, number8, nfGeneral);
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfFixed, 0 decimals'); MyWorksheet.WriteText(row, 0, 'nfFixed, 0 decimals');
MyWorksheet.WriteNumber(row, 1, number1, nfFixed, 0); MyWorksheet.WriteNumber(row, 1, number1, nfFixed, 0);
MyWorksheet.WriteNumber(row, 2, number2, nfFixed, 0); MyWorksheet.WriteNumber(row, 2, number2, nfFixed, 0);
MyWorksheet.WriteNumber(row, 3, number3, nfFixed, 0); MyWorksheet.WriteNumber(row, 3, number3, nfFixed, 0);
@ -74,7 +74,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfFixed, 0); MyWorksheet.WriteNumber(row, 7, number7, nfFixed, 0);
MyWorksheet.WriteNumber(row, 8, number8, nfFixed, 0); MyWorksheet.WriteNumber(row, 8, number8, nfFixed, 0);
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfFixed, 2 decimals'); MyWorksheet.WriteText(row, 0, 'nfFixed, 2 decimals');
MyWorksheet.WriteNumber(row, 1, number1, nfFixed, 2); MyWorksheet.WriteNumber(row, 1, number1, nfFixed, 2);
MyWorksheet.WriteNumber(row, 2, number2, nfFixed, 2); MyWorksheet.WriteNumber(row, 2, number2, nfFixed, 2);
MyWorksheet.WriteNumber(row, 3, number3, nfFixed, 2); MyWorksheet.WriteNumber(row, 3, number3, nfFixed, 2);
@ -84,7 +84,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfFixed, 2); MyWorksheet.WriteNumber(row, 7, number7, nfFixed, 2);
MyWorksheet.WriteNumber(row, 8, number8, nfFixed, 2); MyWorksheet.WriteNumber(row, 8, number8, nfFixed, 2);
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfFixed, 3 decimals'); MyWorksheet.WriteText(row, 0, 'nfFixed, 3 decimals');
MyWorksheet.WriteNumber(row, 1, number1, nfFixed, 3); MyWorksheet.WriteNumber(row, 1, number1, nfFixed, 3);
MyWorksheet.WriteNumber(row, 2, number2, nfFixed, 3); MyWorksheet.WriteNumber(row, 2, number2, nfFixed, 3);
MyWorksheet.WriteNumber(row, 3, number3, nfFixed, 3); MyWorksheet.WriteNumber(row, 3, number3, nfFixed, 3);
@ -94,7 +94,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfFixed, 3); MyWorksheet.WriteNumber(row, 7, number7, nfFixed, 3);
MyWorksheet.WriteNumber(row, 8, number8, nfFixed, 3); MyWorksheet.WriteNumber(row, 8, number8, nfFixed, 3);
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfFixedTh, 0 decimals'); MyWorksheet.WriteText(row, 0, 'nfFixedTh, 0 decimals');
MyWorksheet.WriteNumber(row, 1, number1, nfFixedTh, 0); MyWorksheet.WriteNumber(row, 1, number1, nfFixedTh, 0);
MyWorksheet.WriteNumber(row, 2, number2, nfFixedTh, 0); MyWorksheet.WriteNumber(row, 2, number2, nfFixedTh, 0);
MyWorksheet.WriteNumber(row, 3, number3, nfFixedTh, 0); MyWorksheet.WriteNumber(row, 3, number3, nfFixedTh, 0);
@ -104,7 +104,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfFixedTh, 0); MyWorksheet.WriteNumber(row, 7, number7, nfFixedTh, 0);
MyWorksheet.WriteNumber(row, 8, number8, nfFixedTh, 0); MyWorksheet.WriteNumber(row, 8, number8, nfFixedTh, 0);
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfFixedTh, 2 decimals'); MyWorksheet.WriteText(row, 0, 'nfFixedTh, 2 decimals');
MyWorksheet.WriteNumber(row, 1, number1, nfFixedTh, 2); MyWorksheet.WriteNumber(row, 1, number1, nfFixedTh, 2);
MyWorksheet.WriteNumber(row, 2, number2, nfFixedTh, 2); MyWorksheet.WriteNumber(row, 2, number2, nfFixedTh, 2);
MyWorksheet.WriteNumber(row, 3, number3, nfFixedTh, 2); MyWorksheet.WriteNumber(row, 3, number3, nfFixedTh, 2);
@ -114,7 +114,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfFixedTh, 2); MyWorksheet.WriteNumber(row, 7, number7, nfFixedTh, 2);
MyWorksheet.WriteNumber(row, 8, number8, nfFixedTh, 2); MyWorksheet.WriteNumber(row, 8, number8, nfFixedTh, 2);
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfFixedTh, 3 decimals'); MyWorksheet.WriteText(row, 0, 'nfFixedTh, 3 decimals');
MyWorksheet.WriteNumber(row, 1, number1, nfFixedTh, 3); MyWorksheet.WriteNumber(row, 1, number1, nfFixedTh, 3);
MyWorksheet.WriteNumber(row, 2, number2, nfFixedTh, 3); MyWorksheet.WriteNumber(row, 2, number2, nfFixedTh, 3);
MyWorksheet.WriteNumber(row, 3, number3, nfFixedTh, 3); MyWorksheet.WriteNumber(row, 3, number3, nfFixedTh, 3);
@ -124,7 +124,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfFixedTh, 3); MyWorksheet.WriteNumber(row, 7, number7, nfFixedTh, 3);
MyWorksheet.WriteNumber(row, 8, number8, nfFixedTh, 3); MyWorksheet.WriteNumber(row, 8, number8, nfFixedTh, 3);
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfPercentage, 0 decimals'); MyWorksheet.WriteText(row, 0, 'nfPercentage, 0 decimals');
MyWorksheet.WriteNumber(row, 1, number1, nfPercentage, 0); MyWorksheet.WriteNumber(row, 1, number1, nfPercentage, 0);
MyWorksheet.WriteNumber(row, 2, number2, nfPercentage, 0); MyWorksheet.WriteNumber(row, 2, number2, nfPercentage, 0);
MyWorksheet.WriteNumber(row, 3, number3, nfPercentage, 0); MyWorksheet.WriteNumber(row, 3, number3, nfPercentage, 0);
@ -134,7 +134,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfPercentage, 0); MyWorksheet.WriteNumber(row, 7, number7, nfPercentage, 0);
MyWorksheet.WriteNumber(row, 8, number8, nfPercentage, 0); MyWorksheet.WriteNumber(row, 8, number8, nfPercentage, 0);
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfPercentage, 2 decimals'); MyWorksheet.WriteText(row, 0, 'nfPercentage, 2 decimals');
MyWorksheet.WriteNumber(row, 1, number1, nfPercentage, 2); MyWorksheet.WriteNumber(row, 1, number1, nfPercentage, 2);
MyWorksheet.WriteNumber(row, 2, number2, nfPercentage, 2); MyWorksheet.WriteNumber(row, 2, number2, nfPercentage, 2);
MyWorksheet.WriteNumber(row, 3, number3, nfPercentage, 2); MyWorksheet.WriteNumber(row, 3, number3, nfPercentage, 2);
@ -144,7 +144,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfPercentage, 2); MyWorksheet.WriteNumber(row, 7, number7, nfPercentage, 2);
MyWorksheet.WriteNumber(row, 8, number8, nfPercentage, 2); MyWorksheet.WriteNumber(row, 8, number8, nfPercentage, 2);
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfPercentage, 3 decimals'); MyWorksheet.WriteText(row, 0, 'nfPercentage, 3 decimals');
MyWorksheet.WriteNumber(row, 1, number1, nfPercentage, 3); MyWorksheet.WriteNumber(row, 1, number1, nfPercentage, 3);
MyWorksheet.WriteNumber(row, 2, number2, nfPercentage, 3); MyWorksheet.WriteNumber(row, 2, number2, nfPercentage, 3);
MyWorksheet.WriteNumber(row, 3, number3, nfPercentage, 3); MyWorksheet.WriteNumber(row, 3, number3, nfPercentage, 3);
@ -154,7 +154,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfPercentage, 3); MyWorksheet.WriteNumber(row, 7, number7, nfPercentage, 3);
MyWorksheet.WriteNumber(row, 8, number8, nfPercentage, 3); MyWorksheet.WriteNumber(row, 8, number8, nfPercentage, 3);
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfExp, 0 decimals'); MyWorksheet.WriteText(row, 0, 'nfExp, 0 decimals');
MyWorksheet.WriteNumber(row, 1, number1, nfExp, 0); MyWorksheet.WriteNumber(row, 1, number1, nfExp, 0);
MyWorksheet.WriteNumber(row, 2, number2, nfExp, 0); MyWorksheet.WriteNumber(row, 2, number2, nfExp, 0);
MyWorksheet.WriteNumber(row, 3, number3, nfExp, 0); MyWorksheet.WriteNumber(row, 3, number3, nfExp, 0);
@ -164,7 +164,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfExp, 0); MyWorksheet.WriteNumber(row, 7, number7, nfExp, 0);
MyWorksheet.WriteNumber(row, 8, number8, nfExp, 0); MyWorksheet.WriteNumber(row, 8, number8, nfExp, 0);
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfExp, 2 decimals'); MyWorksheet.WriteText(row, 0, 'nfExp, 2 decimals');
MyWorksheet.WriteNumber(row, 1, number1, nfExp, 2); MyWorksheet.WriteNumber(row, 1, number1, nfExp, 2);
MyWorksheet.WriteNumber(row, 2, number2, nfExp, 2); MyWorksheet.WriteNumber(row, 2, number2, nfExp, 2);
MyWorksheet.WriteNumber(row, 3, number3, nfExp, 2); MyWorksheet.WriteNumber(row, 3, number3, nfExp, 2);
@ -174,7 +174,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfExp, 2); MyWorksheet.WriteNumber(row, 7, number7, nfExp, 2);
MyWorksheet.WriteNumber(row, 8, number8, nfExp, 2); MyWorksheet.WriteNumber(row, 8, number8, nfExp, 2);
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfExp, 3 decimals'); MyWorksheet.WriteText(row, 0, 'nfExp, 3 decimals');
MyWorksheet.WriteNumber(row, 1, number1, nfExp, 3); MyWorksheet.WriteNumber(row, 1, number1, nfExp, 3);
MyWorksheet.WriteNumber(row, 2, number2, nfExp, 3); MyWorksheet.WriteNumber(row, 2, number2, nfExp, 3);
MyWorksheet.WriteNumber(row, 3, number3, nfExp, 3); MyWorksheet.WriteNumber(row, 3, number3, nfExp, 3);
@ -184,7 +184,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfExp, 3); MyWorksheet.WriteNumber(row, 7, number7, nfExp, 3);
MyWorksheet.WriteNumber(row, 8, number8, nfExp, 3); MyWorksheet.WriteNumber(row, 8, number8, nfExp, 3);
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfCurrency, 2 decimals'); MyWorksheet.WriteText(row, 0, 'nfCurrency, 2 decimals');
MyWorksheet.WriteCurrency(row, 1, number1, nfCurrency, 2, '$'); MyWorksheet.WriteCurrency(row, 1, number1, nfCurrency, 2, '$');
MyWorksheet.WriteCurrency(row, 2, number2, nfCurrency, 2, '$'); MyWorksheet.WriteCurrency(row, 2, number2, nfCurrency, 2, '$');
MyWorksheet.WriteCurrency(row, 3, number3, nfCurrency, 2, '$'); MyWorksheet.WriteCurrency(row, 3, number3, nfCurrency, 2, '$');
@ -194,7 +194,7 @@ begin
MyWorksheet.WriteCurrency(row, 7, number7, nfCurrency, 2, '$'); MyWorksheet.WriteCurrency(row, 7, number7, nfCurrency, 2, '$');
MyWorksheet.WriteCurrency(row, 8, number8, nfCurrency, 2, '$'); MyWorksheet.WriteCurrency(row, 8, number8, nfCurrency, 2, '$');
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfCurrencyRed, 2 decimals, >0: $ 1000, <0: ($ 1000)'); MyWorksheet.WriteText(row, 0, 'nfCurrencyRed, 2 decimals, >0: $ 1000, <0: ($ 1000)');
MyWorksheet.WriteCurrency(row, 1, number1, nfCurrencyRed, 2, '$', pcfCSV, ncfBCSVB); MyWorksheet.WriteCurrency(row, 1, number1, nfCurrencyRed, 2, '$', pcfCSV, ncfBCSVB);
MyWorksheet.WriteCurrency(row, 2, number2, nfCurrencyRed, 2, '$', pcfCSV, ncfBCSVB); MyWorksheet.WriteCurrency(row, 2, number2, nfCurrencyRed, 2, '$', pcfCSV, ncfBCSVB);
MyWorksheet.WriteCurrency(row, 3, number3, nfCurrencyRed, 2, '$', pcfCSV, ncfBCSVB); MyWorksheet.WriteCurrency(row, 3, number3, nfCurrencyRed, 2, '$', pcfCSV, ncfBCSVB);
@ -204,7 +204,7 @@ begin
MyWorksheet.WriteCurrency(row, 7, number7, nfCurrencyRed, 2, '$', pcfCSV, ncfBCSVB); MyWorksheet.WriteCurrency(row, 7, number7, nfCurrencyRed, 2, '$', pcfCSV, ncfBCSVB);
MyWorksheet.WriteCurrency(row, 8, number8, nfCurrencyRed, 2, '$', pcfCSV, ncfBCSVB); MyWorksheet.WriteCurrency(row, 8, number8, nfCurrencyRed, 2, '$', pcfCSV, ncfBCSVB);
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfFraction, 2 digits'); MyWorksheet.WriteText(row, 0, 'nfFraction, 2 digits');
MyWorksheet.WriteNumber(row, 1, number1, nfFraction, '# ???/???'); MyWorksheet.WriteNumber(row, 1, number1, nfFraction, '# ???/???');
MyWorksheet.WriteNumber(row, 2, number2, nfFraction, '# ???/???'); MyWorksheet.WriteNumber(row, 2, number2, nfFraction, '# ???/???');
MyWorksheet.WriteNumber(row, 3, number3, nfFraction, '# ???/???'); MyWorksheet.WriteNumber(row, 3, number3, nfFraction, '# ???/???');
@ -215,74 +215,73 @@ begin
MyWorksheet.WriteNumber(row, 8, number8, nfFraction, '# ???/???'); MyWorksheet.WriteNumber(row, 8, number8, nfFraction, '# ???/???');
inc(row,2); inc(row,2);
MyWorksheet.WriteUTF8Text(row, 0, 'Some date/time values in various formats:'); MyWorksheet.WriteText(row, 0, 'Some date/time values in various formats:');
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfShortDateTime'); MyWorksheet.WriteText(row, 0, 'nfShortDateTime');
MyWorksheet.WriteDateTime(row, 1, dt1, nfShortDateTime); MyWorksheet.WriteDateTime(row, 1, dt1, nfShortDateTime);
MyWorksheet.WriteDateTime(row, 2, dt2, nfShortDateTime); MyWorksheet.WriteDateTime(row, 2, dt2, nfShortDateTime);
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfShortDate'); MyWorksheet.WriteText(row, 0, 'nfShortDate');
MyWorksheet.WriteDateTime(row, 1, dt1, nfShortDate); MyWorksheet.WriteDateTime(row, 1, dt1, nfShortDate);
MyWorksheet.WriteDateTime(row, 2, dt2, nfShortDate); MyWorksheet.WriteDateTime(row, 2, dt2, nfShortDate);
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfLongDate'); MyWorksheet.WriteText(row, 0, 'nfLongDate');
MyWorksheet.WriteDateTime(row, 1, dt1, nfLongDate); MyWorksheet.WriteDateTime(row, 1, dt1, nfLongDate);
MyWorksheet.WriteDateTime(row, 2, dt2, nfLongDate); MyWorksheet.WriteDateTime(row, 2, dt2, nfLongDate);
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfShortTime'); MyWorksheet.WriteText(row, 0, 'nfShortTime');
MyWorksheet.WriteDateTime(row, 1, dt1, nfShortTime); MyWorksheet.WriteDateTime(row, 1, dt1, nfShortTime);
MyWorksheet.WriteDateTime(row, 2, dt2, nfShortTime); MyWorksheet.WriteDateTime(row, 2, dt2, nfShortTime);
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfLongTime'); MyWorksheet.WriteText(row, 0, 'nfLongTime');
MyWorksheet.WriteDateTime(row, 1, dt1, nfLongTime); MyWorksheet.WriteDateTime(row, 1, dt1, nfLongTime);
MyWorksheet.WriteDateTime(row, 2, dt2, nfLongTime); MyWorksheet.WriteDateTime(row, 2, dt2, nfLongTime);
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfShortTimeAM'); MyWorksheet.WriteText(row, 0, 'nfShortTimeAM');
MyWorksheet.WriteDateTime(row, 1, dt1, nfShortTimeAM); MyWorksheet.WriteDateTime(row, 1, dt1, nfShortTimeAM);
MyWorksheet.WriteDateTime(row, 2, dt2, nfShortTimeAM); MyWorksheet.WriteDateTime(row, 2, dt2, nfShortTimeAM);
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfLongTimeAM'); MyWorksheet.WriteText(row, 0, 'nfLongTimeAM');
MyWorksheet.WriteDateTime(row, 1, dt1, nfLongTimeAM); MyWorksheet.WriteDateTime(row, 1, dt1, nfLongTimeAM);
MyWorksheet.WriteDateTime(row, 2, dt2, nfLongTimeAM); MyWorksheet.WriteDateTime(row, 2, dt2, nfLongTimeAM);
inc(row,2); inc(row,2);
MyWorksheet.WriteUTF8Text(row, 0, 'Some custom formats'); MyWorksheet.WriteText(row, 0, 'Some custom formats');
inc(row); inc(row);
// In order to use a semicolon as a date-time separator it must be escaped either by // In order to use a semicolon as a date-time separator it must be escaped either by
// using the backslash or quotes (because the semicolon is the separator between sections) // using the backslash or quotes (because the semicolon is the separator between sections)
MyWorksheet.WriteUTF8Text(row, 0, 'nfCustom, dddd, dd/mm/yyyy\; hh:nn'); MyWorksheet.WriteText(row, 0, 'nfCustom, dddd, dd/mm/yyyy\; hh:nn');
MyWorksheet.WriteDateTime(row, 1, dt1, nfCustom, 'dddd, dd/mm/yyyy\; hh:nn'); MyWorksheet.WriteDateTime(row, 1, dt1, nfCustom, 'dddd, dd/mm/yyyy\; hh:nn');
MyWorksheet.WriteDateTime(row, 2, dt2, nfCustom, 'dddd, dd/mm/yyyy\; hh:nn'); MyWorksheet.WriteDateTime(row, 2, dt2, nfCustom, 'dddd, dd/mm/yyyy\; hh:nn');
MyWorksheet.WriteUTF8Text(row, 3, 'The semicolon must be escaped otherwise it would be misunderstood as a section separator.'); MyWorksheet.WriteText(row, 3, 'The semicolon must be escaped otherwise it would be misunderstood as a section separator.');
MyWorksheet.WriteUTF8Text(row, 4, 'This format is not displayed correctly by Open/LibreOffice.'); MyWorksheet.WriteText(row, 4, 'This format is not displayed correctly by Open/LibreOffice.');
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfCustom, dddd, dd/mm/yyyy"; "hh:nn'); MyWorksheet.WriteText(row, 0, 'nfCustom, dddd, dd/mm/yyyy"; "hh:nn');
MyWorksheet.WriteDateTime(row, 1, dt1, nfCustom, 'dddd, dd/mm/yyyy"; "hh:nn'); MyWorksheet.WriteDateTime(row, 1, dt1, nfCustom, 'dddd, dd/mm/yyyy"; "hh:nn');
MyWorksheet.WriteDateTime(row, 2, dt2, nfCustom, 'dddd, dd/mm/yyyy"; "hh:nn'); MyWorksheet.WriteDateTime(row, 2, dt2, nfCustom, 'dddd, dd/mm/yyyy"; "hh:nn');
MyWorksheet.WriteUTF8Text(row, 3, 'The semicolon must be escaped otherwise it would be misunderstood as a section separator.'); MyWorksheet.WriteText(row, 3, 'The semicolon must be escaped otherwise it would be misunderstood as a section separator.');
MyWorksheet.WriteUTF8Text(row, 4, 'This format is not displayed correctly by Open/LibreOffice.'); MyWorksheet.WriteText(row, 4, 'This format is not displayed correctly by Open/LibreOffice.');
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfCustom, dd/mmm'); MyWorksheet.WriteText(row, 0, 'nfCustom, dd/mmm');
MyWorksheet.WriteDateTime(row, 1, dt1, nfCustom, 'dd/mmm'); MyWorksheet.WriteDateTime(row, 1, dt1, nfCustom, 'dd/mmm');
MyWorksheet.WriteDateTime(row, 2, dt2, nfCustom, 'dd/mmm'); MyWorksheet.WriteDateTime(row, 2, dt2, nfCustom, 'dd/mmm');
MyWorksheet.WriteUTF8Text(row, 3, 'The slash is replaced by the date or time separator of the FormatSettings'); MyWorksheet.WriteText(row, 3, 'The slash is replaced by the date or time separator of the FormatSettings');
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfCustom, mmm/yy'); MyWorksheet.WriteText(row, 0, 'nfCustom, mmm/yy');
MyWorksheet.WriteDateTime(row, 1, dt1, nfCustom, 'mmm/yy'); MyWorksheet.WriteDateTime(row, 1, dt1, nfCustom, 'mmm/yy');
MyWorksheet.WriteDateTime(row, 2, dt2, nfCustom, 'mmm/yy'); MyWorksheet.WriteDateTime(row, 2, dt2, nfCustom, 'mmm/yy');
MyWorksheet.WriteUTF8Text(row, 3, 'The slash is replaced by the date or time separator of the FormatSettings'); MyWorksheet.WriteText(row, 3, 'The slash is replaced by the date or time separator of the FormatSettings');
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfCustom, mmm-yy'); MyWorksheet.WriteText(row, 0, 'nfCustom, mmm-yy');
MyWorksheet.WriteDateTime(row, 1, dt1, nfCustom, 'mmm-yy'); MyWorksheet.WriteDateTime(row, 1, dt1, nfCustom, 'mmm-yy');
MyWorksheet.WriteDateTime(row, 2, dt2, nfCustom, 'mmm-yy'); MyWorksheet.WriteDateTime(row, 2, dt2, nfCustom, 'mmm-yy');
MyWorksheet.WriteUTF8Text(row, 3, 'The dash is used literally'); MyWorksheet.WriteText(row, 3, 'The dash is used literally');
// Creates a new worksheet // Creates a new worksheet
MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet 2'); MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet 2');
// Save the spreadsheet to a file // Save the spreadsheet to a file
MyWorkbook.WriteToFile(MyDir + 'test.ods', MyWorkbook.WriteToFile(MyDir + 'test.ods', sfOpenDocument);
sfOpenDocument);
MyWorkbook.Free; MyWorkbook.Free;
end. end.

View File

@ -50,7 +50,7 @@ begin
begin begin
Write('Row: ', CurCell^.Row, Write('Row: ', CurCell^.Row,
' Col: ', CurCell^.Col, ' Value: ', ' Col: ', CurCell^.Col, ' Value: ',
UTF8ToConsole(MyWorkSheet.ReadAsUTF8Text(CurCell^.Row, CurCell^.Col)) UTF8ToConsole(MyWorkSheet.ReadAsText(CurCell^.Row, CurCell^.Col))
); );
if HasFormula(CurCell) then if HasFormula(CurCell) then
WriteLn(' Formula: ', CurCell^.FormulaValue) WriteLn(' Formula: ', CurCell^.FormulaValue)
@ -60,5 +60,11 @@ begin
// Finalization // Finalization
MyWorkbook.Free; MyWorkbook.Free;
{$IFDEF WINDOWS}
WriteLn;
WriteLn('Press ENTER to quit...');
ReadLn;
{$ENDIF}
end. end.

View File

@ -30,136 +30,136 @@ begin
Myworksheet.LeftPaneWidth := 1; Myworksheet.LeftPaneWidth := 1;
// Write colwidth // Write colwidth
Myworksheet.WriteColWidth(1, 25); // 25 characters Myworksheet.WriteColWidth(1, 25, suChars); // 25 characters
// Write some cells // Write some cells
row := 0; row := 0;
MyWorksheet.WriteBlank(row, 0); MyWorksheet.WriteBlank(row, 0);
MyWorksheet.WriteUTF8Text(row, 1, 'Description'); MyWorksheet.WriteText(row, 1, 'Description');
MyWorksheet.WriteUTF8Text(row, 2, 'Example'); MyWorksheet.WriteText(row, 2, 'Example');
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'This is a text:'); MyWorksheet.WriteText(row, 1, 'This is a text:');
MyWorksheet.WriteUTF8Text(row, 2, 'Hello world!'); MyWorksheet.WriteText(row, 2, 'Hello world!');
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'This is bold text:'); MyWorksheet.WriteText(row, 1, 'This is bold text:');
Myworksheet.WriteUTF8Text(row, 2, 'Hello world!'); Myworksheet.WriteText(row, 2, 'Hello world!');
Myworksheet.WriteFontStyle(row, 2, [fssBold]); Myworksheet.WriteFontStyle(row, 2, [fssBold]);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'This is a number:'); MyWorksheet.WriteText(row, 1, 'This is a number:');
MyWorksheet.WriteNumber(row, 2, 3.141592); MyWorksheet.WriteNumber(row, 2, 3.141592);
Myworksheet.WriteHorAlignment(row, 2, haRight); Myworksheet.WriteHorAlignment(row, 2, haRight);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'This is a date:'); MyWorksheet.WriteText(row, 1, 'This is a date:');
Myworksheet.WriteDateTime(row, 2, date()); Myworksheet.WriteDateTime(row, 2, date());
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'This is a long text:'); MyWorksheet.WriteText(row, 1, 'This is a long text:');
MyWorksheet.WriteUTF8Text(row, 2, 'A very, very, very, very long text, indeed'); MyWorksheet.WriteText(row, 2, 'A very, very, very, very long text, indeed');
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Centered text:'); MyWorksheet.WriteText(row, 1, 'Centered text:');
MyWorksheet.WriteUTF8Text(row, 2, 'I am in the center.'); MyWorksheet.WriteText(row, 2, 'I am in the center.');
MyWorksheet.WriteHorAlignment(row, 2, haCenter); MyWorksheet.WriteHorAlignment(row, 2, haCenter);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'This is a long text with line break:'); MyWorksheet.WriteText(row, 1, 'This is a long text with line break:');
Myworksheet.WriteVertAlignment(row, 1, vaTop); Myworksheet.WriteVertAlignment(row, 1, vaTop);
MyWorksheet.WriteUTF8Text(row, 2, 'A very, very, very, very long text,<br /> indeed'); MyWorksheet.WriteText(row, 2, 'A very, very, very, very long text,<br /> indeed');
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Merged rows'); MyWorksheet.WriteText(row, 1, 'Merged rows');
Myworksheet.MergeCells(row, 1, row+1, 1); Myworksheet.MergeCells(row, 1, row+1, 1);
MyWorksheet.WriteUTF8Text(row, 2, 'A'); MyWorksheet.WriteText(row, 2, 'A');
inc(row); inc(row);
MyWorksheet.WriteUTF8Text(row, 2, 'B'); MyWorksheet.WriteText(row, 2, 'B');
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Merged columns'); MyWorksheet.WriteText(row, 1, 'Merged columns');
MyWorksheet.WriteHorAlignment(row, 1, haCenter); MyWorksheet.WriteHorAlignment(row, 1, haCenter);
MyWorksheet.MergeCells(row, 1, row, 2); MyWorksheet.MergeCells(row, 1, row, 2);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Right border:'); MyWorksheet.WriteText(row, 1, 'Right border:');
MyWorksheet.WriteUTF8Text(row, 2, 'medium / red'); MyWorksheet.WriteText(row, 2, 'medium / red');
MyWorksheet.WriteBorders(row, 2, [cbEast]); MyWorksheet.WriteBorders(row, 2, [cbEast]);
MyWorksheet.WriteBorderStyle(row, 2, cbEast, lsMedium, scRed); MyWorksheet.WriteBorderStyle(row, 2, cbEast, lsMedium, scRed);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Top border:'); MyWorksheet.WriteText(row, 1, 'Top border:');
MyWorksheet.WriteUTF8Text(row, 2, 'top / dashed'); MyWorksheet.WriteText(row, 2, 'top / dashed');
MyWorksheet.WriteBorders(row, 2, [cbNorth]); MyWorksheet.WriteBorders(row, 2, [cbNorth]);
MyWorksheet.WriteBorderLineStyle(row, 2, cbNorth, lsDashed); MyWorksheet.WriteBorderLineStyle(row, 2, cbNorth, lsDashed);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Left border:'); MyWorksheet.WriteText(row, 1, 'Left border:');
MyWorksheet.WriteUTF8Text(row, 2, 'left / dotted'); MyWorksheet.WriteText(row, 2, 'left / dotted');
MyWorksheet.WriteBorders(row, 2, [cbWest]); MyWorksheet.WriteBorders(row, 2, [cbWest]);
MyWorksheet.WriteBorderLineStyle(row, 2, cbWest, lsDotted); MyWorksheet.WriteBorderLineStyle(row, 2, cbWest, lsDotted);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Bottom border:'); MyWorksheet.WriteText(row, 1, 'Bottom border:');
MyWorksheet.WriteUTF8Text(row, 2, 'bottom / double'); MyWorksheet.WriteText(row, 2, 'bottom / double');
MyWorksheet.WriteBorders(row, 2, [cbSouth]); MyWorksheet.WriteBorders(row, 2, [cbSouth]);
MyWorksheet.WriteBorderLineStyle(row, 2, cbSouth, lsDouble); MyWorksheet.WriteBorderLineStyle(row, 2, cbSouth, lsDouble);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'This row is high'); MyWorksheet.WriteText(row, 1, 'This row is high');
MyWorksheet.WriteRowHeight(row, 5); MyWorksheet.WriteRowHeight(row, 5);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Colors:'); MyWorksheet.WriteText(row, 1, 'Colors:');
MyWorksheet.WriteUTF8Text(row, 2, 'yellow on blue'); MyWorksheet.WriteText(row, 2, 'yellow on blue');
MyWorksheet.WriteFontColor(row, 2, scYellow); MyWorksheet.WriteFontColor(row, 2, scYellow);
MyWorksheet.WriteBackgroundColor(row, 2, scBlue); MyWorksheet.WriteBackgroundColor(row, 2, scBlue);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'RGB background color:'); MyWorksheet.WriteText(row, 1, 'RGB background color:');
MyWorksheet.WriteUTF8Text(row, 2, 'color #FF77C3'); // HTML colors are big-endian MyWorksheet.WriteText(row, 2, 'color #FF77C3'); // HTML colors are big-endian
MyWorksheet.WriteBackgroundColor(row, 2, $C377FF); // fps colors are little-endian MyWorksheet.WriteBackgroundColor(row, 2, $C377FF); // fps colors are little-endian
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Bold text:'); MyWorksheet.WriteText(row, 1, 'Bold text:');
MyWorksheet.WriteUTF8Text(row, 2, 'Bold text'); MyWorksheet.WriteText(row, 2, 'Bold text');
MyWorksheet.WriteFontStyle(row, 2, [fssBold]); MyWorksheet.WriteFontStyle(row, 2, [fssBold]);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Italic text:'); MyWorksheet.WriteText(row, 1, 'Italic text:');
MyWorksheet.WriteUTF8Text(row, 2, 'Italic text'); MyWorksheet.WriteText(row, 2, 'Italic text');
MyWorksheet.WriteFontStyle(row, 2, [fssItalic]); MyWorksheet.WriteFontStyle(row, 2, [fssItalic]);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Underlined text:'); MyWorksheet.WriteText(row, 1, 'Underlined text:');
MyWorksheet.WriteUTF8Text(row, 2, 'Underlined text'); MyWorksheet.WriteText(row, 2, 'Underlined text');
MyWorksheet.WriteFontStyle(row, 2, [fssUnderline]); MyWorksheet.WriteFontStyle(row, 2, [fssUnderline]);
inc(row); inc(row);
MyWorksheet.WriteNumber(row, 0, row); MyWorksheet.WriteNumber(row, 0, row);
MyWorksheet.WriteUTF8Text(row, 1, 'Strike-through text:'); MyWorksheet.WriteText(row, 1, 'Strike-through text:');
MyWorksheet.WriteUTF8Text(row, 2, 'Strike-through text'); MyWorksheet.WriteText(row, 2, 'Strike-through text');
MyWorksheet.WriteFontStyle(row, 2, [fssStrikeout]); MyWorksheet.WriteFontStyle(row, 2, [fssStrikeout]);
inc(row); inc(row);

View File

@ -73,7 +73,6 @@
<ComponentName Value="Form1"/> <ComponentName Value="Form1"/>
<HasResources Value="True"/> <HasResources Value="True"/>
<ResourceBaseClass Value="Form"/> <ResourceBaseClass Value="Form"/>
<UnitName Value="mainform"/>
</Unit1> </Unit1>
</Units> </Units>
</ProjectOptions> </ProjectOptions>

View File

@ -7,7 +7,7 @@ object Form1: TForm1
ClientHeight = 634 ClientHeight = 634
ClientWidth = 877 ClientWidth = 877
OnCreate = FormCreate OnCreate = FormCreate
LCLVersion = '1.5' LCLVersion = '1.7'
object Panel1: TPanel object Panel1: TPanel
Left = 0 Left = 0
Height = 40 Height = 40
@ -78,6 +78,8 @@ object Form1: TForm1
Align = alClient Align = alClient
AutoAdvance = aaDown AutoAdvance = aaDown
ColCount = 27 ColCount = 27
DefaultColWidth = 64
DefaultRowHeight = 22
Font.Color = clBlack Font.Color = clBlack
Font.Height = -15 Font.Height = -15
Font.Name = 'Calibri' Font.Name = 'Calibri'
@ -125,7 +127,6 @@ object Form1: TForm1
) )
Title.Visible = True Title.Visible = True
Align = alTop Align = alTop
ParentColor = False
object Chart1AreaSeries1: TAreaSeries object Chart1AreaSeries1: TAreaSeries
AreaBrush.Color = clSkyBlue AreaBrush.Color = clSkyBlue
AreaLinesPen.Style = psClear AreaLinesPen.Style = psClear
@ -158,7 +159,6 @@ object Form1: TForm1
) )
Title.Visible = True Title.Visible = True
Align = alClient Align = alClient
ParentColor = False
object Chart2BarSeries1: TBarSeries object Chart2BarSeries1: TBarSeries
Marks.Distance = 15 Marks.Distance = 15
Marks.Format = '%0:.2f' Marks.Format = '%0:.2f'
@ -199,7 +199,6 @@ object Form1: TForm1
) )
Title.Visible = True Title.Visible = True
Align = alBottom Align = alBottom
ParentColor = False
object Chart3PieSeries1: TPieSeries object Chart3PieSeries1: TPieSeries
Legend.Multiplicity = lmPoint Legend.Multiplicity = lmPoint
Marks.Distance = 8 Marks.Distance = 8

View File

@ -7,12 +7,20 @@ object FPSChartForm: TFPSChartForm
ClientHeight = 382 ClientHeight = 382
ClientWidth = 697 ClientWidth = 697
OnCreate = FormCreate OnCreate = FormCreate
LCLVersion = '1.5' LCLVersion = '1.7'
object MyChart: TChart object MyChart: TChart
AnchorSideLeft.Control = Bevel1
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = editXAxis
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
Left = 352 Left = 352
Height = 264 Height = 263
Top = 112 Top = 111
Width = 336 Width = 337
AxisList = < AxisList = <
item item
Minors = <> Minors = <>
@ -34,23 +42,39 @@ object FPSChartForm: TFPSChartForm
Title.Text.Strings = ( Title.Text.Strings = (
'TAChart' 'TAChart'
) )
ParentColor = False Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Top = 8
BorderSpacing.Right = 8
BorderSpacing.Bottom = 8
object MyChartBarSeries1: TBarSeries object MyChartBarSeries1: TBarSeries
BarBrush.Color = clRed BarBrush.Color = clRed
Source = FPSChartSource Source = FPSChartSource
end end
end end
object WorksheetGrid: TsWorksheetGrid object WorksheetGrid: TsWorksheetGrid
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = editXAxis
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Bevel1
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
Left = 8 Left = 8
Height = 264 Height = 263
Top = 112 Top = 111
Width = 336 Width = 336
FrozenCols = 0 FrozenCols = 0
FrozenRows = 0 FrozenRows = 0
ReadFormulas = False ReadFormulas = False
TextOverflow = True TextOverflow = True
WorkbookSource = WorksheetGrid.internal
Anchors = [akTop, akLeft, akRight, akBottom]
AutoAdvance = aaDown AutoAdvance = aaDown
BorderSpacing.Left = 8
BorderSpacing.Top = 8
BorderSpacing.Bottom = 8
ColCount = 27 ColCount = 27
DefaultColWidth = 64
DefaultRowHeight = 22
ExtendedSelect = False ExtendedSelect = False
Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goColSizing, goEditing, goThumbTracking] Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goColSizing, goEditing, goThumbTracking]
RowCount = 101 RowCount = 101
@ -70,6 +94,7 @@ object FPSChartForm: TFPSChartForm
Height = 42 Height = 42
Top = 4 Top = 4
Width = 678 Width = 678
Anchors = [akTop, akLeft, akRight]
AutoSize = False AutoSize = False
Caption = 'Please add data to the grid or load it from a file, then choose the location of the data for the X and Y axises and click on the button "Create Graphic" to generate a chart.' Caption = 'Please add data to the grid or load it from a file, then choose the location of the data for the X and Y axises and click on the button "Create Graphic" to generate a chart.'
ParentColor = False ParentColor = False
@ -147,6 +172,15 @@ object FPSChartForm: TFPSChartForm
TabOrder = 6 TabOrder = 6
Text = 'B3:B14' Text = 'B3:B14'
end end
object Bevel1: TBevel
AnchorSideLeft.Control = Owner
AnchorSideLeft.Side = asrCenter
Left = 344
Height = 50
Top = 83
Width = 8
Shape = bsSpacer
end
object FPSChartSource: TsWorksheetChartSource object FPSChartSource: TsWorksheetChartSource
PointsNumber = 5 PointsNumber = 5
YFirstCellCol = 1 YFirstCellCol = 1

View File

@ -15,6 +15,7 @@ type
{ TFPSChartForm } { TFPSChartForm }
TFPSChartForm = class(TForm) TFPSChartForm = class(TForm)
Bevel1: TBevel;
btnCreateGraphic: TButton; btnCreateGraphic: TButton;
btnLoadSpreadsheet: TButton; btnLoadSpreadsheet: TButton;
editSourceFile: TFileNameEdit; editSourceFile: TFileNameEdit;

View File

@ -120,8 +120,6 @@ object Form1: TForm1
FrozenCols = 0 FrozenCols = 0
FrozenRows = 0 FrozenRows = 0
ReadFormulas = True ReadFormulas = True
SelectionPen.JoinStyle = pjsMiter
SelectionPen.Width = 3
WorkbookSource = WorksheetGrid.internal WorkbookSource = WorksheetGrid.internal
Align = alClient Align = alClient
AutoAdvance = aaDown AutoAdvance = aaDown

View File

@ -5,7 +5,7 @@ unit mainform;
interface interface
uses uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls, Menus, ExtCtrls, ActnList, Spin, Buttons, ButtonPanel, StdCtrls, Menus, ExtCtrls, ActnList, Spin, Buttons, ButtonPanel,
fpspreadsheetgrid, fpsallformats; fpspreadsheetgrid, fpsallformats;
@ -47,7 +47,8 @@ var
implementation implementation
uses uses
fpcanvas, fpstypes, fpsutils, fpsRegFileFormats, fpspreadsheet; fpcanvas, lazutf8,
fpstypes, fpsutils, fpsRegFileFormats, fpspreadsheet;
{ TForm1 } { TForm1 }

View File

@ -11,7 +11,7 @@ object MainFrm: TMainFrm
OnCreate = FormCreate OnCreate = FormCreate
OnDestroy = FormDestroy OnDestroy = FormDestroy
ShowHint = True ShowHint = True
LCLVersion = '1.5' LCLVersion = '1.7'
object MainToolBar: TToolBar object MainToolBar: TToolBar
Left = 0 Left = 0
Height = 28 Height = 28

View File

@ -5,7 +5,7 @@ unit wtMain;
interface interface
uses uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls, Menus, ExtCtrls, ComCtrls, ActnList, Grids, ColorBox, SynEdit, StdCtrls, Menus, ExtCtrls, ComCtrls, ActnList, Grids, ColorBox, SynEdit,
SynEditHighlighter, SynHighlighterHTML, SynHighlighterMulti, SynEditHighlighter, SynHighlighterHTML, SynHighlighterMulti,
SynHighlighterCss, SynGutterCodeFolding, fpspreadsheetgrid, SynHighlighterCss, SynGutterCodeFolding, fpspreadsheetgrid,
@ -216,9 +216,9 @@ var
implementation implementation
uses uses
TypInfo, LCLIntf, LCLType, LCLVersion, clipbrd, fpcanvas, TypInfo, LazUtf8, LCLIntf, LCLType, LCLVersion, clipbrd, fpcanvas,
SynHighlighterWikiTable, SynHighlighterWikiTable,
fpsutils; fpsutils, fpsRegFileFormats;
const const
DROPDOWN_COUNT = 24; DROPDOWN_COUNT = 24;
@ -264,7 +264,7 @@ begin
BeginUpdate; BeginUpdate;
try try
if TAction(Sender).Tag = 0 then begin if TAction(Sender).Tag = 0 then begin
CellBorders[Selection] := []; CellBorders[Selection.Left, Selection.Top, Selection.Right, Selection.Bottom] := [];
exit; exit;
end; end;
// Top and bottom edges // Top and bottom edges
@ -421,7 +421,7 @@ begin
if AcFontItalic.Checked then Include(style, fssItalic); if AcFontItalic.Checked then Include(style, fssItalic);
if AcFontStrikeout.Checked then Include(style, fssStrikeout); if AcFontStrikeout.Checked then Include(style, fssStrikeout);
if AcFontUnderline.Checked then Include(style, fssUnderline); if AcFontUnderline.Checked then Include(style, fssUnderline);
CellFontStyles[Selection] := style; CellFontStyles[Selection.Left, Selection.Top, Selection.Right, Selection.Bottom] := style;
end; end;
end; end;
@ -433,7 +433,8 @@ begin
hor_align := TsHorAlignment(TAction(Sender).Tag - HORALIGN_TAG) hor_align := TsHorAlignment(TAction(Sender).Tag - HORALIGN_TAG)
else else
hor_align := haDefault; hor_align := haDefault;
with WorksheetGrid do HorAlignments[Selection] := hor_align; with WorksheetGrid do
HorAlignments[Selection.Left, Selection.Top, Selection.Right, Selection.Bottom] := hor_align;
UpdateHorAlignmentActions; UpdateHorAlignmentActions;
end; end;
@ -521,13 +522,15 @@ begin
vert_align := TsVertAlignment(TAction(Sender).Tag - VERTALIGN_TAG) vert_align := TsVertAlignment(TAction(Sender).Tag - VERTALIGN_TAG)
else else
vert_align := vaDefault; vert_align := vaDefault;
with WorksheetGrid do VertAlignments[Selection] := vert_align; with WorksheetGrid do
VertAlignments[Selection.Left, Selection.Top, Selection.Right, Selection.Bottom] := vert_align;
UpdateVertAlignmentActions; UpdateVertAlignmentActions;
end; end;
procedure TMainFrm.AcWordwrapExecute(Sender: TObject); procedure TMainFrm.AcWordwrapExecute(Sender: TObject);
begin begin
with WorksheetGrid do Wordwraps[Selection] := TAction(Sender).Checked; with WorksheetGrid do
Wordwraps[Selection.Left, Selection.Top, Selection.Right, Selection.Bottom] := TAction(Sender).Checked;
end; end;
procedure TMainFrm.BeforeRun; procedure TMainFrm.BeforeRun;
@ -558,9 +561,13 @@ var
clr: TsColor; clr: TsColor;
begin begin
if CbBackgroundColor.ItemIndex <= 0 then if CbBackgroundColor.ItemIndex <= 0 then
with WorksheetGrid do BackgroundColors[Selection] := scNotDefined with WorksheetGrid do
BackgroundColors[Selection.Left, selection.Top, Selection.Right, Selection.Bottom] :=
scNotDefined
else else
with WorksheetGrid do BackgroundColors[Selection] := PtrInt(CbBackgroundColor.Items.Objects[CbBackgroundColor.ItemIndex]); with WorksheetGrid do
BackgroundColors[Selection.Left, selection.Top, Selection.Right, Selection.Bottom] :=
PtrInt(CbBackgroundColor.Items.Objects[CbBackgroundColor.ItemIndex]);
end; end;
procedure TMainFrm.FontComboBoxSelect(Sender: TObject); procedure TMainFrm.FontComboBoxSelect(Sender: TObject);
@ -569,7 +576,8 @@ var
begin begin
fname := FontCombobox.Items[FontCombobox.ItemIndex]; fname := FontCombobox.Items[FontCombobox.ItemIndex];
if fname <> '' then if fname <> '' then
with WorksheetGrid do CellFontNames[Selection] := fName; with WorksheetGrid do
CellFontNames[Selection.Left, selection.Top, Selection.Right, Selection.Bottom] := fName;
end; end;
procedure TMainFrm.FontSizeComboBoxSelect(Sender: TObject); procedure TMainFrm.FontSizeComboBoxSelect(Sender: TObject);
@ -578,7 +586,8 @@ var
begin begin
sz := StrToInt(FontSizeCombobox.Items[FontSizeCombobox.ItemIndex]); sz := StrToInt(FontSizeCombobox.Items[FontSizeCombobox.ItemIndex]);
if sz > 0 then if sz > 0 then
with WorksheetGrid do CellFontSizes[Selection] := sz; with WorksheetGrid do
CellFontSizes[Selection.Left, selection.Top, Selection.Right, Selection.Bottom] := sz;
end; end;
procedure TMainFrm.FormActivate(Sender: TObject); procedure TMainFrm.FormActivate(Sender: TObject);
@ -698,8 +707,9 @@ begin
// Update user interface // Update user interface
Caption := Format('wikitable maker - %s (%s)', [ Caption := Format('wikitable maker - %s (%s)', [
AFilename, AFilename,
GetFileFormatName(WorksheetGrid.Workbook.FileFormat) GetSpreadTechnicalName(WorksheetGrid.Workbook.FileFormatID)
]); ]);
AcShowGridLines.Checked := WorksheetGrid.ShowGridLines; AcShowGridLines.Checked := WorksheetGrid.ShowGridLines;
AcShowHeaders.Checked := WorksheetGrid.ShowHeaders; AcShowHeaders.Checked := WorksheetGrid.ShowHeaders;
AcRowTitles.Checked := WorksheetGrid.FrozenCols <> 0; AcRowTitles.Checked := WorksheetGrid.FrozenCols <> 0;
@ -740,7 +750,8 @@ procedure TMainFrm.UpdateBackgroundColorIndex;
var var
clr: TsColor; clr: TsColor;
begin begin
with WorksheetGrid do clr := BackgroundColors[Selection]; with WorksheetGrid do
clr := BackgroundColors[Selection.Left, Selection.Top, Selection.Right, Selection.Bottom];
if (clr = scNotDefined) or (clr = scTransparent) then if (clr = scNotDefined) or (clr = scTransparent) then
CbBackgroundColor.ItemIndex := 0 // no fill CbBackgroundColor.ItemIndex := 0 // no fill
else else
@ -753,7 +764,8 @@ var
ac: TAction; ac: TAction;
hor_align: TsHorAlignment; hor_align: TsHorAlignment;
begin begin
with WorksheetGrid do hor_align := HorAlignments[Selection]; with WorksheetGrid do
hor_align := HorAlignments[Selection.Left, Selection.Top, Selection.Right, Selection.Bottom];
for i:=0 to ActionList.ActionCount-1 do begin for i:=0 to ActionList.ActionCount-1 do begin
ac := TAction(ActionList.Actions[i]); ac := TAction(ActionList.Actions[i]);
if (ac.Tag >= HORALIGN_TAG) and (ac.Tag < HORALIGN_TAG+10) then if (ac.Tag >= HORALIGN_TAG) and (ac.Tag < HORALIGN_TAG+10) then
@ -765,7 +777,8 @@ procedure TMainFrm.UpdateFontNameIndex;
var var
fname: String; fname: String;
begin begin
with WorksheetGrid do fname := CellFontNames[Selection]; with WorksheetGrid do
fname := CellFontNames[Selection.Left, Selection.Top, Selection.Right, Selection.Bottom];
if fname = '' then if fname = '' then
FontCombobox.ItemIndex := -1 FontCombobox.ItemIndex := -1
else else
@ -776,7 +789,8 @@ procedure TMainFrm.UpdateFontSizeIndex;
var var
sz: Single; sz: Single;
begin begin
with WorksheetGrid do sz := CellFontSizes[Selection]; with WorksheetGrid do
sz := CellFontSizes[Selection.Left, Selection.Top, Selection.Right, Selection.Bottom];
if sz < 0 then if sz < 0 then
FontSizeCombobox.ItemIndex := -1 FontSizeCombobox.ItemIndex := -1
else else
@ -787,7 +801,8 @@ procedure TMainFrm.UpdateFontStyleActions;
var var
style: TsFontStyles; style: TsFontStyles;
begin begin
with WorksheetGrid do style := CellFontStyles[Selection]; with WorksheetGrid do
style := CellFontStyles[Selection.Left, Selection.Top, Selection.Right, Selection.Bottom];
AcFontBold.Checked := fssBold in style; AcFontBold.Checked := fssBold in style;
AcFontItalic.Checked := fssItalic in style; AcFontItalic.Checked := fssItalic in style;
AcFontUnderline.Checked := fssUnderline in style; AcFontUnderline.Checked := fssUnderline in style;
@ -800,7 +815,8 @@ var
ac: TAction; ac: TAction;
vert_align: TsVertAlignment; vert_align: TsVertAlignment;
begin begin
with WorksheetGrid do vert_align := VertAlignments[Selection]; with WorksheetGrid do
vert_align := VertAlignments[Selection.Left, Selection.Top, Selection.Right, Selection.Bottom];
for i:=0 to ActionList.ActionCount-1 do begin for i:=0 to ActionList.ActionCount-1 do begin
ac := TAction(ActionList.Actions[i]); ac := TAction(ActionList.Actions[i]);
if (ac.Tag >= VERTALIGN_TAG) and (ac.Tag < VERTALIGN_TAG+10) then if (ac.Tag >= VERTALIGN_TAG) and (ac.Tag < VERTALIGN_TAG+10) then

View File

@ -192,7 +192,7 @@ begin
begin begin
for i:=0 to ExportFields.Count-1 do for i:=0 to ExportFields.Count-1 do
begin begin
FSheet.WriteUTF8Text(FRow,i,ExportFields[i].ExportedName); FSheet.WriteText(FRow,i,ExportFields[i].ExportedName);
end; end;
inc(FRow); inc(FRow);
end; end;
@ -304,13 +304,13 @@ begin
else if Field.Datatype in [ftBCD,ftCurrency,ftFloat,ftFMTBcd] then else if Field.Datatype in [ftBCD,ftCurrency,ftFloat,ftFMTBcd] then
FSheet.WriteCurrency(FRow, EF.Index, Field.AsFloat) FSheet.WriteCurrency(FRow, EF.Index, Field.AsFloat)
else if Field.DataType in [ftString,ftFixedChar] then else if Field.DataType in [ftString,ftFixedChar] then
FSheet.WriteUTF8Text(FRow, EF.Index, Field.AsString) FSheet.WriteText(FRow, EF.Index, Field.AsString)
else if (Field.DataType in ([ftWideMemo,ftWideString,ftFixedWideChar]+BlobFieldTypes)) then else if (Field.DataType in ([ftWideMemo,ftWideString,ftFixedWideChar]+BlobFieldTypes)) then
FSheet.WriteUTF8Text(FRow, EF.Index, UTF8Encode(Field.AsWideString)) FSheet.WriteText(FRow, EF.Index, UTF8Encode(Field.AsWideString))
{ Note: we test for the wide text fields before the MemoFieldTypes, in order to { Note: we test for the wide text fields before the MemoFieldTypes, in order to
let ftWideMemo end up at the right place } let ftWideMemo end up at the right place }
else if Field.DataType in MemoFieldTypes then else if Field.DataType in MemoFieldTypes then
FSheet.WriteUTF8Text(FRow, EF.Index, Field.AsString) FSheet.WriteText(FRow, EF.Index, Field.AsString)
else if Field.DataType=ftBoolean then else if Field.DataType=ftBoolean then
FSheet.WriteBoolValue(FRow, EF.Index, Field.AsBoolean) FSheet.WriteBoolValue(FRow, EF.Index, Field.AsBoolean)
else if Field.DataType in DateFieldTypes then else if Field.DataType in DateFieldTypes then
@ -327,7 +327,7 @@ begin
FSheet.WriteDateTime(FRow, EF.Index, Field.AsDateTime, nfShortDateTime); FSheet.WriteDateTime(FRow, EF.Index, Field.AsDateTime, nfShortDateTime);
end end
else //fallback to string else //fallback to string
FSheet.WriteUTF8Text(FRow, EF.Index, Field.AsString); FSheet.WriteText(FRow, EF.Index, Field.AsString);
end; end;
end; end;

View File

@ -1321,7 +1321,7 @@ begin
if (col <> nil) and (col^.Width > 0) then if (col <> nil) and (col^.Width > 0) then
w := col^.Width; w := col^.Width;
end; end;
w := w * FWorkbook.GetDefaultFont.Size; w := FWorkbook.ConvertUnits(w, FWorkbook.Units, suPoints);
Result:= Format(' width="%.1fpt"', [w], FPointSeparatorSettings); Result:= Format(' width="%.1fpt"', [w], FPointSeparatorSettings);
end; end;
@ -1396,7 +1396,7 @@ begin
row := FWorksheet.FindRow(ARowIndex); row := FWorksheet.FindRow(ARowIndex);
if row <> nil then if row <> nil then
h := row^.Height; h := row^.Height;
h := (h + ROW_HEIGHT_CORRECTION) * FWorkbook.GetDefaultFont.Size; h := FWorkbook.ConvertUnits(h, FWorkbook.Units, suPoints);
Result := Format(' height="%.1fpt"', [h], FPointSeparatorSettings); Result := Format(' height="%.1fpt"', [h], FPointSeparatorSettings);
end; end;

View File

@ -54,8 +54,8 @@ type
function LoadFromStream(AStream: TStream; AName: String): Boolean; function LoadFromStream(AStream: TStream; AName: String): Boolean;
property FileName: String read FFileName; property FileName: String read FFileName;
property ImageType: TsImagetype read FImageType; property ImageType: TsImagetype read FImageType;
property ImageWidth: Double read FWidth; property ImageWidth: Double read FWidth write FWidth;
property ImageHeight: Double read FHeight; property ImageHeight: Double read FHeight write FWidth;
property Stream: TMemoryStream read FStream; property Stream: TMemoryStream read FStream;
end; end;
@ -866,17 +866,10 @@ begin
end; end;
function TsEmbeddedObj.CheckStream(AImageType: TsImageType): Boolean; function TsEmbeddedObj.CheckStream(AImageType: TsImageType): Boolean;
var
w, h: Double;
begin begin
FImageType := GetImageInfo(FStream, w, h, AImageType); FImageType := GetImageInfo(FStream, FWidth, FHeight, AImageType);
if FImageType <> itUnknown then // FWidth and FHeight are in inches here.
begin Result := FImageType <> itUnknown;
FWidth := inToMM(w);
FHeight := inToMM(h);
Result := true;
end else
Result := false;
end; end;
function TsEmbeddedObj.LoadFromFile(const AFileName: String): Boolean; function TsEmbeddedObj.LoadFromFile(const AFileName: String): Boolean;

View File

@ -1436,7 +1436,7 @@ function ApplyTextFormat(AText: String; AParams: TsNumFormatParams): String;
var var
sct: TsNumFormatSection; sct: TsNumFormatSection;
element: TsNumFormatElement; element: TsNumFormatElement;
i, n: Integer; i: Integer;
begin begin
Result := ''; Result := '';
for sct in AParams.Sections do for sct in AParams.Sections do

View File

@ -328,8 +328,8 @@ const
FALSE_TRUE: Array[boolean] of String = ('false', 'true'); FALSE_TRUE: Array[boolean] of String = ('false', 'true');
COLWIDTH_EPS = 1e-2; // for mm COLWIDTH_EPS = 1e-3;
ROWHEIGHT_EPS = 1e-2; // for lines ROWHEIGHT_EPS = 1e-3;
type type
@ -344,7 +344,7 @@ type
TColumnStyleData = class TColumnStyleData = class
public public
Name: String; Name: String;
ColWidth: Double; // in mm ColWidth: Double; // in workbook units
end; end;
{ Column data items stored in the ColumnList } { Column data items stored in the ColumnList }
@ -359,7 +359,7 @@ type
TRowStyleData = class TRowStyleData = class
public public
Name: String; Name: String;
RowHeight: Double; // in mm RowHeight: Double; // in workbook units
AutoRowHeight: Boolean; AutoRowHeight: Boolean;
end; end;
@ -1030,31 +1030,20 @@ end;
procedure TsSpreadOpenDocReader.ApplyColWidths; procedure TsSpreadOpenDocReader.ApplyColWidths;
var var
colIndex: Integer; colIndex: Integer;
colWidth: Single;
colStyleIndex: Integer; colStyleIndex: Integer;
colStyle: TColumnStyleData; colStyle: TColumnStyleData;
factor: Double;
col: PCol;
i: Integer; i: Integer;
begin begin
factor := FWorkbook.GetDefaultFont.Size/2;
for i:=0 to FColumnList.Count-1 do for i:=0 to FColumnList.Count-1 do
begin begin
colIndex := TColumnData(FColumnList[i]).Col; colIndex := TColumnData(FColumnList[i]).Col;
colStyleIndex := TColumnData(FColumnList[i]).ColStyleIndex; colStyleIndex := TColumnData(FColumnList[i]).ColStyleIndex;
colStyle := TColumnStyleData(FColumnStyleList[colStyleIndex]); colStyle := TColumnStyleData(FColumnStyleList[colStyleIndex]);
{ The column width stored in colStyle is in mm (see ReadColumnStyles). // Add only column records to the worksheet if their width is different from
We convert it to character count by converting it to points and then by // the default column width. The column width stored in colStyle is already
dividing the points by the approximate width of the '0' character which // in workbook units (see ReadColumnStyles).
is assumed to be 50% of the default font point size. } if not SameValue(colStyle.ColWidth, FWorksheet.DefaultColWidth, COLWIDTH_EPS) then
colWidth := mmToPts(colStyle.ColWidth)/factor; FWorksheet.WriteColWidth(colIndex, colStyle.ColWidth, FWorkbook.Units);
{ Add only column records to the worksheet if their width is different from
the default column width. }
if not SameValue(colWidth, FWorksheet.DefaultColWidth, COLWIDTH_EPS) then
begin
col := FWorksheet.GetCol(colIndex);
col^.Width := colWidth;
end;
end; end;
end; end;
@ -1828,7 +1817,8 @@ begin
s := GetAttrValue(styleChildNode, 'style:column-width'); s := GetAttrValue(styleChildNode, 'style:column-width');
if s <> '' then if s <> '' then
begin begin
colWidth := PtsToMM(HTMLLengthStrToPts(s)); // convert to mm colWidth := FWorkbook.ConvertUnits(HTMLLengthStrToPts(s), suPoints, FWorkbook.Units);
// convert to workbook units
break; break;
end; end;
end; end;
@ -3235,7 +3225,7 @@ var
rowStyleName: String; rowStyleName: String;
rowStyleIndex: Integer; rowStyleIndex: Integer;
rowStyle: TRowStyleData; rowStyle: TRowStyleData;
rowHeight: Single; rowHeight: Double;
autoRowHeight: Boolean; autoRowHeight: Boolean;
col: Integer; col: Integer;
cellNode: TDOMNode; cellNode: TDOMNode;
@ -3254,11 +3244,7 @@ var
if rowStyleIndex > -1 then // just for safety if rowStyleIndex > -1 then // just for safety
begin begin
rowStyle := TRowStyleData(FRowStyleList[rowStyleIndex]); rowStyle := TRowStyleData(FRowStyleList[rowStyleIndex]);
rowHeight := rowStyle.RowHeight; // in mm (see ReadRowStyles) rowHeight := rowStyle.RowHeight; // in Workbook units (see ReadRowStyles)
rowHeight := mmToPts(rowHeight) / Workbook.GetDefaultFontSize;
if rowHeight > ROW_HEIGHT_CORRECTION
then rowHeight := rowHeight - ROW_HEIGHT_CORRECTION // in "lines"
else rowHeight := 0;
autoRowHeight := rowStyle.AutoRowHeight; autoRowHeight := rowStyle.AutoRowHeight;
end else end else
autoRowHeight := true; autoRowHeight := true;
@ -3356,7 +3342,7 @@ var
// Transfer non-default row heights to sheet's rows // Transfer non-default row heights to sheet's rows
if not autoRowHeight then if not autoRowHeight then
for i:=1 to rowsRepeated do for i:=1 to rowsRepeated do
FWorksheet.WriteRowHeight(row + i - 1, rowHeight); FWorksheet.WriteRowHeight(row + i - 1, rowHeight, FWorkbook.Units);
row := row + rowsRepeated; row := row + rowsRepeated;
end; end;
@ -3416,7 +3402,8 @@ begin
begin begin
s := GetAttrValue(styleChildNode, 'style:row-height'); s := GetAttrValue(styleChildNode, 'style:row-height');
if s <> '' then if s <> '' then
rowHeight := PtsToMm(HTMLLengthStrToPts(s)); // convert to mm rowHeight := FWorkbook.ConvertUnits(HTMLLengthStrToPts(s), suPoints, FWorkbook.Units);
// convert to workbook units
s := GetAttrValue(styleChildNode, 'style:use-optimal-row-height'); s := GetAttrValue(styleChildNode, 'style:use-optimal-row-height');
if s = 'true' then if s = 'true' then
auto := true; auto := true;
@ -4206,21 +4193,19 @@ var
found: Boolean; found: Boolean;
colstyle: TColumnStyleData; colstyle: TColumnStyleData;
w: Double; w: Double;
multiplier: Double;
begin begin
{ At first, add the default column width } { At first, add the default column width }
colStyle := TColumnStyleData.Create; colStyle := TColumnStyleData.Create;
colStyle.Name := 'co1'; colStyle.Name := 'co1';
colStyle.ColWidth := 12; //Workbook.DefaultColWidth; colStyle.ColWidth := FWorkbook.ConvertUnits(12, suChars, FWorkbook.Units);
FColumnStyleList.Add(colStyle); FColumnStyleList.Add(colStyle);
for i:=0 to Workbook.GetWorksheetCount-1 do for i:=0 to Workbook.GetWorksheetCount-1 do
begin begin
sheet := Workbook.GetWorksheetByIndex(i); sheet := Workbook.GetWorksheetByIndex(i);
// colStyle.ColWidth := sheet.DefaultColWidth;
for c:=0 to sheet.GetLastColIndex do for c:=0 to sheet.GetLastColIndex do
begin begin
w := sheet.GetColWidth(c); w := sheet.GetColWidth(c, FWorkbook.Units);
// Look for this width in the current ColumnStyleList // Look for this width in the current ColumnStyleList
found := false; found := false;
for j := 0 to FColumnStyleList.Count-1 do for j := 0 to FColumnStyleList.Count-1 do
@ -4239,7 +4224,7 @@ begin
end; end;
end; end;
end; end;
(*
{ fpspreadsheet's column width is the count of '0' characters of the { fpspreadsheet's column width is the count of '0' characters of the
default font. On average, the width of the '0' is about half of the default font. On average, the width of the '0' is about half of the
point size of the font. --> we can convert the fps col width to pts and point size of the font. --> we can convert the fps col width to pts and
@ -4250,6 +4235,7 @@ begin
w := TColumnStyleData(FColumnStyleList[i]).ColWidth * multiplier; w := TColumnStyleData(FColumnStyleList[i]).ColWidth * multiplier;
TColumnStyleData(FColumnStyleList[i]).ColWidth := PtsToMM(w); TColumnStyleData(FColumnStyleList[i]).ColWidth := PtsToMM(w);
end; end;
*)
end; end;
{ Collects the fonts used by headers and footers in the FHeaderFooterFontList } { Collects the fonts used by headers and footers in the FHeaderFooterFontList }
@ -4308,13 +4294,13 @@ var
row: PRow; row: PRow;
found: Boolean; found: Boolean;
rowstyle: TRowStyleData; rowstyle: TRowStyleData;
h, multiplier: Double; h: Double;
begin begin
{ At first, add the default row height } { At first, add the default row height }
{ Initially, row height units will be the same as in the sheet, i.e. in "lines" } { Initially, row height units will be the same as in the workbook }
rowStyle := TRowStyleData.Create; rowStyle := TRowStyleData.Create;
rowStyle.Name := 'ro1'; rowStyle.Name := 'ro1';
rowStyle.RowHeight := 1; //Workbook.DefaultRowHeight; rowStyle.RowHeight := FWorkbook.ConvertUnits(15, suPoints, FWorkbook.Units);
rowStyle.AutoRowHeight := true; rowStyle.AutoRowHeight := true;
FRowStyleList.Add(rowStyle); FRowStyleList.Add(rowStyle);
@ -4326,7 +4312,7 @@ begin
row := sheet.FindRow(r); row := sheet.FindRow(r);
if row <> nil then if row <> nil then
begin begin
h := sheet.GetRowHeight(r); h := sheet.GetRowHeight(r, FWorkbook.Units);
// Look for this height in the current RowStyleList // Look for this height in the current RowStyleList
found := false; found := false;
for j:=0 to FRowStyleList.Count-1 do for j:=0 to FRowStyleList.Count-1 do
@ -4348,7 +4334,7 @@ begin
end; end;
end; end;
end; end;
(*
{ fpspreadsheet's row heights are measured as line count of the default font. { fpspreadsheet's row heights are measured as line count of the default font.
Using the default font size (which is in points) we convert the line count Using the default font size (which is in points) we convert the line count
to points and then to millimeters as needed by ods. } to points and then to millimeters as needed by ods. }
@ -4357,7 +4343,7 @@ begin
begin begin
h := (TRowStyleData(FRowStyleList[i]).RowHeight + ROW_HEIGHT_CORRECTION) * multiplier; h := (TRowStyleData(FRowStyleList[i]).RowHeight + ROW_HEIGHT_CORRECTION) * multiplier;
TRowStyleData(FRowStyleList[i]).RowHeight := PtsToMM(h); TRowStyleData(FRowStyleList[i]).RowHeight := PtsToMM(h);
end; end; *)
end; end;
{ Is called before zipping the individual file parts. Rewinds the streams. } { Is called before zipping the individual file parts. Rewinds the streams. }
@ -4847,7 +4833,8 @@ begin
// Column width // Column width
AppendToStream(AStream, Format( AppendToStream(AStream, Format(
'<style:table-column-properties style:column-width="%.3fmm" fo:break-before="auto"/>', '<style:table-column-properties style:column-width="%.3fmm" fo:break-before="auto"/>',
[colStyle.ColWidth], FPointSeparatorSettings)); [FWorkbook.ConvertUnits(colStyle.ColWidth, FWorkbook.Units, suMillimeters)],
FPointSeparatorSettings));
// End // End
AppendToStream(AStream, AppendToStream(AStream,
@ -4860,15 +4847,16 @@ procedure TsSpreadOpenDocWriter.WriteColumns(AStream: TStream;
var var
lastCol: Integer; lastCol: Integer;
c, k: Integer; c, k: Integer;
w, w_mm: Double; w: Double;
widthMultiplier: Double; // w, w_mm: Double;
// widthMultiplier: Double;
styleName: String; styleName: String;
colsRepeated: Integer; colsRepeated: Integer;
colsRepeatedStr: String; colsRepeatedStr: String;
firstRepeatedPrintCol, lastRepeatedPrintCol: Longint; firstRepeatedPrintCol, lastRepeatedPrintCol: Longint;
headerCols: Boolean; headerCols: Boolean;
begin begin
widthMultiplier := Workbook.GetFont(0).Size / 2; // widthMultiplier := Workbook.GetFont(0).Size / 2;
lastCol := ASheet.GetLastColIndex; lastCol := ASheet.GetLastColIndex;
firstRepeatedPrintCol := ASheet.PageLayout.RepeatedCols.FirstIndex; firstRepeatedPrintCol := ASheet.PageLayout.RepeatedCols.FirstIndex;
lastRepeatedPrintCol := ASheet.PageLayout.RepeatedCols.LastIndex; lastRepeatedPrintCol := ASheet.PageLayout.RepeatedCols.LastIndex;
@ -4881,9 +4869,7 @@ begin
c := 0; c := 0;
while (c <= lastCol) do while (c <= lastCol) do
begin begin
w := ASheet.GetColWidth(c); w := ASheet.GetColWidth(c, FWorkbook.Units);
// Convert to mm
w_mm := PtsToMM(w * widthMultiplier);
if (c = firstRepeatedPrintCol) then if (c = firstRepeatedPrintCol) then
begin begin
@ -4894,7 +4880,7 @@ begin
// Find width in ColumnStyleList to retrieve corresponding style name // Find width in ColumnStyleList to retrieve corresponding style name
styleName := ''; styleName := '';
for k := 0 to FColumnStyleList.Count-1 do for k := 0 to FColumnStyleList.Count-1 do
if SameValue(TColumnStyleData(FColumnStyleList[k]).ColWidth, w_mm, COLWIDTH_EPS) then begin if SameValue(TColumnStyleData(FColumnStyleList[k]).ColWidth, w, COLWIDTH_EPS) then begin
styleName := TColumnStyleData(FColumnStyleList[k]).Name; styleName := TColumnStyleData(FColumnStyleList[k]).Name;
break; break;
end; end;
@ -4907,7 +4893,7 @@ begin
if headerCols then if headerCols then
while (k <= lastCol) and (k <= lastRepeatedPrintCol) do while (k <= lastCol) and (k <= lastRepeatedPrintCol) do
begin begin
if ASheet.GetColWidth(k) = w then if ASheet.GetColWidth(k, FWorkbook.Units) = w then
inc(colsRepeated) inc(colsRepeated)
else else
break; break;
@ -4916,7 +4902,7 @@ begin
else else
while (k <= lastCol) and (k < firstRepeatedPrintCol) do while (k <= lastCol) and (k < firstRepeatedPrintCol) do
begin begin
if ASheet.GetColWidth(k) = w then if ASheet.GetColWidth(k, FWorkbook.Units) = w then
inc(colsRepeated) inc(colsRepeated)
else else
break; break;
@ -5231,8 +5217,7 @@ var
cell: PCell; // current cell cell: PCell; // current cell
styleName: String; styleName: String;
k: Integer; k: Integer;
h, h_mm: Single; // row height in "lines" and millimeters, respectively h, h1: Double;
h1: Single;
colsRepeated: Cardinal; colsRepeated: Cardinal;
rowsRepeated: Cardinal; rowsRepeated: Cardinal;
colsRepeatedStr: String; colsRepeatedStr: String;
@ -5240,12 +5225,10 @@ var
firstCol, firstRow, lastCol, lastRow: Cardinal; firstCol, firstRow, lastCol, lastRow: Cardinal;
firstRepeatedPrintRow, lastRepeatedPrintRow: Cardinal; firstRepeatedPrintRow, lastRepeatedPrintRow: Cardinal;
rowStyleData: TRowStyleData; rowStyleData: TRowStyleData;
defFontSize: Single;
emptyRowsAbove: Boolean; emptyRowsAbove: Boolean;
headerRows: Boolean; headerRows: Boolean;
begin begin
// some abbreviations... // some abbreviations...
defFontSize := Workbook.GetFont(0).Size;
GetSheetDimensions(ASheet, firstRow, lastRow, firstCol, lastCol); GetSheetDimensions(ASheet, firstRow, lastRow, firstCol, lastCol);
emptyRowsAbove := firstRow > 0; emptyRowsAbove := firstRow > 0;
@ -5278,12 +5261,11 @@ begin
begin begin
styleName := ''; styleName := '';
h := row^.Height; // row height in "lines" h := row^.Height; // row height in workbook units
h_mm := PtsToMM((h + ROW_HEIGHT_CORRECTION) * defFontSize); // in mm
for k := 0 to FRowStyleList.Count-1 do begin for k := 0 to FRowStyleList.Count-1 do begin
rowStyleData := TRowStyleData(FRowStyleList[k]); rowStyleData := TRowStyleData(FRowStyleList[k]);
// Compare row heights, but be aware of rounding errors // Compare row heights, but be aware of rounding errors
if SameValue(rowStyleData.RowHeight, h_mm, 1E-3) then if SameValue(rowStyleData.RowHeight, h, ROWHEIGHT_EPS) then
begin begin
styleName := rowStyleData.Name; styleName := rowStyleData.Name;
break; break;
@ -5318,7 +5300,7 @@ begin
begin begin
if ASheet.Cells.GetFirstCellOfRow(rr) <> nil then if ASheet.Cells.GetFirstCellOfRow(rr) <> nil then
break; break;
h1 := ASheet.GetRowHeight(rr); h1 := ASheet.GetRowHeight(rr, FWorkbook.Units);
if not SameValue(h, h1, ROWHEIGHT_EPS) then if not SameValue(h, h1, ROWHEIGHT_EPS) then
break; break;
inc(rr); inc(rr);
@ -5431,7 +5413,9 @@ begin
// Column width // Column width
AppendToStream(AStream, Format( AppendToStream(AStream, Format(
'<style:table-row-properties style:row-height="%.3fmm" ', [rowStyle.RowHeight], FPointSeparatorSettings)); '<style:table-row-properties style:row-height="%.3fmm" ',
[FWorkbook.ConvertUnits(rowStyle.RowHeight, FWorkbook.Units, suMillimeters)],
FPointSeparatorSettings));
if rowStyle.AutoRowHeight then if rowStyle.AutoRowHeight then
AppendToStream(AStream, 'style:use-optimal-row-height="true" '); AppendToStream(AStream, 'style:use-optimal-row-height="true" ');
AppendToStream(AStream, 'fo:break-before="auto"/>'); AppendToStream(AStream, 'fo:break-before="auto"/>');
@ -6041,25 +6025,20 @@ function TsSpreadOpenDocWriter.WritePageLayoutAsXMLString(AStyleName: String;
function CalcStyleStr(AName, AHeaderFooterImageStr: String; function CalcStyleStr(AName, AHeaderFooterImageStr: String;
APageMargin, AHeaderFooterMargin: Double): String; APageMargin, AHeaderFooterMargin: Double): String;
var var
h: Double;
marginKind: String; marginKind: String;
begin begin
h := PtsToMM(FWorkbook.GetDefaultFontSize);
if AName = 'header' then marginKind := 'bottom' else marginKind := 'top'; if AName = 'header' then marginKind := 'bottom' else marginKind := 'top';
Result := Format( Result := Format(
'<style:%s-style>' + // e.g. <style:header-style> '<style:%s-style>' + // e.g. <style:header-style>
'<style:header-footer-properties ' + '<style:header-footer-properties ' +
'fo:margin-left="0mm" fo:margin-right="0mm" '+ 'fo:margin-left="0mm" fo:margin-right="0mm" '+
// 'fo:min-height="%.2fmm" fo:margin-%s="%.2fmm" ' + // margin-bottom or -top 'svg:height="%.2fmm" fo:margin-%s="%.2fmm" ' + // fo:margin-bottom or -top
'svg:height="%.2fmm" fo:margin-%s="%.2fmm" ' +
'fo:background-color="transparent">' + 'fo:background-color="transparent">' +
'%s' + '%s' +
'</style:header-footer-properties>' + '</style:header-footer-properties>' +
'</style:%s-style>', [ '</style:%s-style>', [
AName, AName,
APageMargin - AHeaderFooterMargin, marginKind, 0.0, // - h, marginKind, h, APageMargin - AHeaderFooterMargin, marginKind, 0.0,
// AHeaderFooterMargin, marginKind, APageMargin-AHeaderFooterMargin-h,
// AHeaderFooterMargin-APageMargin-h, marginKind, AHeaderFooterMargin-APageMargin,
AHeaderFooterImageStr, AHeaderFooterImageStr,
AName AName
], FPointSeparatorSettings); ], FPointSeparatorSettings);
@ -6387,19 +6366,17 @@ var
value: variant; value: variant;
styleCell: PCell; styleCell: PCell;
styleName: String; styleName: String;
h, h_mm: Single; // row height in "lines" and millimeters, respectively h: Single; // row height workbook units
k: Integer; k: Integer;
rowStyleData: TRowStyleData; rowStyleData: TRowStyleData;
rowsRepeated: Cardinal; rowsRepeated: Cardinal;
colsRepeated: Cardinal; colsRepeated: Cardinal;
colsRepeatedStr: String; colsRepeatedStr: String;
defFontSize: Single;
lastCol, lastRow: Cardinal; lastCol, lastRow: Cardinal;
begin begin
// some abbreviations... // some abbreviations...
lastCol := Workbook.VirtualColCount - 1; lastCol := Workbook.VirtualColCount - 1;
lastRow := Workbook.VirtualRowCount - 1; lastRow := Workbook.VirtualRowCount - 1;
defFontSize := Workbook.GetFont(0).Size;
rowsRepeated := 1; rowsRepeated := 1;
r := 0; r := 0;
@ -6413,13 +6390,12 @@ begin
begin begin
styleName := ''; styleName := '';
h := row^.Height; // row height in "lines" h := row^.Height; // row height in workbook units
h_mm := PtsToMM((h + ROW_HEIGHT_CORRECTION) * defFontSize); // in mm
for k := 0 to FRowStyleList.Count-1 do for k := 0 to FRowStyleList.Count-1 do
begin begin
rowStyleData := TRowStyleData(FRowStyleList[k]); rowStyleData := TRowStyleData(FRowStyleList[k]);
// Compare row heights, but be aware of rounding errors // Compare row heights, but be aware of rounding errors
if SameValue(rowStyleData.RowHeight, h_mm, 1E-3) then if SameValue(rowStyleData.RowHeight, h, ROWHEIGHT_EPS) then
begin begin
styleName := rowStyleData.Name; styleName := rowStyleData.Name;
break; break;
@ -6431,7 +6407,6 @@ begin
// No empty rows allowed here for the moment! // No empty rows allowed here for the moment!
// Write the row XML // Write the row XML
AppendToStream(AStream, Format( AppendToStream(AStream, Format(
'<table:table-row table:style-name="%s">', [styleName])); '<table:table-row table:style-name="%s">', [styleName]));

View File

@ -55,12 +55,12 @@ type
{@@ The record TRow contains information about a spreadsheet row: {@@ The record TRow contains information about a spreadsheet row:
@param Row The index of the row (beginning with 0) @param Row The index of the row (beginning with 0)
@param Height The height of the row (expressed as lines count of the default font) @param Height The height of the row (expressed in the units defined in the workbook)
Only rows with heights that cannot be derived from the font height have a Only rows with heights that cannot be derived from the font height have a
row record. } row record. }
TRow = record TRow = record
Row: Cardinal; Row: Cardinal;
Height: Single; // in "lines" Height: Single;
end; end;
{@@ Pointer to a TRow record } {@@ Pointer to a TRow record }
@ -68,11 +68,11 @@ type
{@@ The record TCol contains information about a spreadsheet column: {@@ The record TCol contains information about a spreadsheet column:
@param Col The index of the column (beginning with 0) @param Col The index of the column (beginning with 0)
@param Width The width of the column (expressed in character count of the "0" character of the default font. @param Width The width of the column (expressed in the units defined in the workbook)
Only columns with non-default widths have a column record. } Only columns with non-default widths have a column record. }
TCol = record TCol = record
Col: Cardinal; Col: Cardinal;
Width: Single; // in "characters". Excel uses the width of char "0" in 1st font Width: Single;
end; end;
{@@ Pointer to a TCol record } {@@ Pointer to a TCol record }
@ -428,9 +428,11 @@ type
function GetCellCountInRow(ARow: Cardinal): Cardinal; function GetCellCountInRow(ARow: Cardinal): Cardinal;
function GetCellCountInCol(ACol: Cardinal): Cardinal; function GetCellCountInCol(ACol: Cardinal): Cardinal;
function GetRow(ARow: Cardinal): PRow; function GetRow(ARow: Cardinal): PRow;
function GetRowHeight(ARow: Cardinal): Single; function GetRowHeight(ARow: Cardinal; AUnits: TsSizeUnits): Single; overload;
function GetRowHeight(ARow: Cardinal): Single; overload; deprecated 'Use version with parameter AUnits.';
function GetCol(ACol: Cardinal): PCol; function GetCol(ACol: Cardinal): PCol;
function GetColWidth(ACol: Cardinal): Single; function GetColWidth(ACol: Cardinal; AUnits: TsSizeUnits): Single; overload;
function GetColWidth(ACol: Cardinal): Single; overload; deprecated 'Use version with parameter AUnits.';
procedure DeleteCol(ACol: Cardinal); procedure DeleteCol(ACol: Cardinal);
procedure DeleteRow(ARow: Cardinal); procedure DeleteRow(ARow: Cardinal);
procedure InsertCol(ACol: Cardinal); procedure InsertCol(ACol: Cardinal);
@ -440,9 +442,11 @@ type
procedure RemoveCol(ACol: Cardinal); procedure RemoveCol(ACol: Cardinal);
procedure RemoveRow(ARow: Cardinal); procedure RemoveRow(ARow: Cardinal);
procedure WriteRowInfo(ARow: Cardinal; AData: TRow); procedure WriteRowInfo(ARow: Cardinal; AData: TRow);
procedure WriteRowHeight(ARow: Cardinal; AHeight: Single); procedure WriteRowHeight(ARow: Cardinal; AHeight: Single; AUnits: TsSizeUnits); overload;
procedure WriteRowHeight(ARow: Cardinal; AHeight: Single); overload; deprecated 'Use version with parameter AUnits';
procedure WriteColInfo(ACol: Cardinal; AData: TCol); procedure WriteColInfo(ACol: Cardinal; AData: TCol);
procedure WriteColWidth(ACol: Cardinal; AWidth: Single); procedure WriteColWidth(ACol: Cardinal; AWidth: Single; AUnits: TsSizeUnits); overload;
procedure WriteColWidth(ACol: Cardinal; AWidth: Single); overload; deprecated 'Use version with parameter AUnits';
// Sorting // Sorting
procedure Sort(const ASortParams: TsSortParams; procedure Sort(const ASortParams: TsSortParams;
@ -491,12 +495,12 @@ type
procedure UnmergeCells(ARange: String); overload; procedure UnmergeCells(ARange: String); overload;
{ Embedded images } { Embedded images }
procedure CalcImageCell(AIndex: Integer; x, y, AWidth, AHeight: Double;
out ARow, ACol: Cardinal; out ARowOffs, AColOffs, AScaleX, AScaleY: Double);
procedure CalcImageExtent(AIndex: Integer; procedure CalcImageExtent(AIndex: Integer;
out ARow1, ACol1, ARow2, ACol2: Cardinal; out ARow1, ACol1, ARow2, ACol2: Cardinal;
out ARowOffs1, AColOffs1, ARowOffs2, AColOffs2: Double; out ARowOffs1, AColOffs1, ARowOffs2, AColOffs2: Double;
out x, y, AWidth, AHeight: Double); out x, y, AWidth, AHeight: Double);
procedure CalcImageCell(AIndex: Integer; x, y, AWidth, AHeight: Double;
out ARow, ACol: Cardinal; out ARowOffs, AColOffs, AScaleX, AScaleY: Double);
function GetImage(AIndex: Integer): TsImage; function GetImage(AIndex: Integer): TsImage;
function GetImageCount: Integer; function GetImageCount: Integer;
procedure RemoveAllImages; procedure RemoveAllImages;
@ -650,6 +654,7 @@ type
FLockCount: Integer; FLockCount: Integer;
FLog: TStringList; FLog: TStringList;
FSearchEngine: TObject; FSearchEngine: TObject;
FUnits: TsSizeUnits;
{ Setter/Getter } { Setter/Getter }
function GetErrorMsg: String; function GetErrorMsg: String;
@ -784,6 +789,7 @@ type
procedure RemoveAllEmbeddedObj; procedure RemoveAllEmbeddedObj;
{ Utilities } { Utilities }
function ConvertUnits(AValue: Double; AFromUnits, AToUnits: TsSizeUnits): Double;
procedure DisableNotifications; procedure DisableNotifications;
procedure EnableNotifications; procedure EnableNotifications;
function NotificationsEnabled: Boolean; function NotificationsEnabled: Boolean;
@ -806,6 +812,7 @@ type
property VirtualColCount: cardinal read FVirtualColCount write SetVirtualColCount; property VirtualColCount: cardinal read FVirtualColCount write SetVirtualColCount;
property VirtualRowCount: cardinal read FVirtualRowCount write SetVirtualRowCount; property VirtualRowCount: cardinal read FVirtualRowCount write SetVirtualRowCount;
property Options: TsWorkbookOptions read FOptions write FOptions; property Options: TsWorkbookOptions read FOptions write FOptions;
property Units: TsSizeUnits read FUnits;
{@@ This event fires whenever a new worksheet is added } {@@ This event fires whenever a new worksheet is added }
property OnAddWorksheet: TsWorksheetEvent read FOnAddWorksheet write FOnAddWorksheet; property OnAddWorksheet: TsWorksheetEvent read FOnAddWorksheet write FOnAddWorksheet;
@ -1029,8 +1036,8 @@ begin
FPageLayout := TsPageLayout.Create(self); FPageLayout := TsPageLayout.Create(self);
FDefaultColWidth := 12; FDefaultColWidth := ptsToMM(72); // Excel: about 72 pts
FDefaultRowHeight := 1; FDefaultRowHeight := ptsToMM(15); // Excel: 15pts
FFirstRowIndex := UNASSIGNED_ROW_COL_INDEX; FFirstRowIndex := UNASSIGNED_ROW_COL_INDEX;
FFirstColIndex := UNASSIGNED_ROW_COL_INDEX; FFirstColIndex := UNASSIGNED_ROW_COL_INDEX;
@ -3336,16 +3343,15 @@ end;
procedure TsWorksheet.CalcImageCell(AIndex: Integer; x, y, AWidth, AHeight: Double; procedure TsWorksheet.CalcImageCell(AIndex: Integer; x, y, AWidth, AHeight: Double;
out ARow, ACol: Cardinal; out ARowOffs, AColOffs, AScaleX, AScaleY: Double); out ARow, ACol: Cardinal; out ARowOffs, AColOffs, AScaleX, AScaleY: Double);
// All lengths are in workbook units!
var var
colW, rowH, sum: Double; colW, rowH, sum: Double;
factor: Double;
embobj: TsEmbeddedObj; embobj: TsEmbeddedObj;
begin begin
factor := FWorkbook.GetDefaultFont.Size/2; // Width of "0" character in pts
ACol := 0; ACol := 0;
sum := 0; sum := 0;
repeat repeat
colW := ptsToMM(GetColWidth(ACol) * factor); colW := GetColWidth(ACol, FWorkbook.Units);;
sum := sum + colW; sum := sum + colW;
inc(ACol); inc(ACol);
until sum > x; until sum > x;
@ -3353,11 +3359,10 @@ begin
AColOffs := x - sum; AColOffs := x - sum;
dec(ACol); dec(ACol);
factor := FWorkbook.GetDefaultFont.Size; // Height of line in pts
ARow := 0; ARow := 0;
sum := 0; sum := 0;
repeat repeat
rowH := ptsToMM(CalcRowHeight(ARow) * factor); // row height in mm rowH := CalcRowHeight(ARow);
sum := sum + rowH; sum := sum + rowH;
inc(ARow); inc(ARow);
until sum > y; until sum > y;
@ -3377,32 +3382,33 @@ end;
@param ACol1 Index of the column containing the left edege of the image @param ACol1 Index of the column containing the left edege of the image
@param ARow2 Index of the row containing the right edge of the image @param ARow2 Index of the row containing the right edge of the image
@param ACol2 Index of the column containing the bottom edge of the image @param ACol2 Index of the column containing the bottom edge of the image
@param ARowOffs1 Distance between the top edge of image and row 1, in mm @param ARowOffs1 Distance between the top edge of image and row 1
@param AColOffs1 Distance between the left edge of image and column 1, in mm @param AColOffs1 Distance between the left edge of image and column 1
@param ARowOffs2 Distance between the bottom edge of image and top of row 2, in mm @param ARowOffs2 Distance between the bottom edge of image and top of row 2
@param AColOffs2 Distance between the right edge of image and left of col 2, in mm @param AColOffs2 Distance between the right edge of image and left of col 2
@param x Absolute coordinate of left edge of image, in mm @param x Absolute coordinate of left edge of image
@param y Absolute coordinate of top edge of image, in mm @param y Absolute coordinate of top edge of image
@param AWidth Width of the image, in mm @param AWidth Width of the image
@param AHeight Height of the image, in mm @param AHeight Height of the image
All dimensions are in workbook units
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
procedure TsWorksheet.CalcImageExtent(AIndex: Integer; procedure TsWorksheet.CalcImageExtent(AIndex: Integer;
out ARow1, ACol1, ARow2, ACol2: Cardinal; out ARow1, ACol1, ARow2, ACol2: Cardinal;
out ARowOffs1, AColOffs1, ARowOffs2, AColOffs2: Double; out ARowOffs1, AColOffs1, ARowOffs2, AColOffs2: Double;
out x,y, AWidth, AHeight: Double); // mm out x,y, AWidth, AHeight: Double);
var var
img: TsImage; img: TsImage;
obj: TsEmbeddedObj; obj: TsEmbeddedObj;
colW, rowH: Double; colW, rowH: Double;
totH, totW: Double; totH, totW: Double;
r, c: Integer; r, c: Integer;
factor: Double;
begin begin
img := GetImage(AIndex); img := GetImage(AIndex);
ARow1 := img.Row; ARow1 := img.Row;
ACol1 := img.Col; ACol1 := img.Col;
ARowOffs1 := img.OffsetX; // millimeters ARowOffs1 := img.OffsetX;
AColOffs1 := img.OffsetY; AColOffs1 := img.OffsetY;
obj := FWorkbook.GetEmbeddedObj(img.Index); obj := FWorkbook.GetEmbeddedObj(img.Index);
@ -3410,11 +3416,10 @@ begin
AHeight := obj.ImageHeight * img.ScaleY; AHeight := obj.ImageHeight * img.ScaleY;
// Find x coordinate of left image edge, in inches. // Find x coordinate of left image edge, in inches.
factor := FWorkbook.GetDefaultFont.Size/2; // Width of "0" character in pts
x := AColOffs1; x := AColOffs1;
for c := 0 to ACol1-1 do for c := 0 to ACol1-1 do
begin begin
colW := ptsToMM(GetColWidth(c) * factor); // in mm colW := GetColWidth(c, FWorkbook.Units);
x := x + colW; x := x + colW;
end; end;
@ -3423,7 +3428,7 @@ begin
ACol2 := ACol1; ACol2 := ACol1;
while (totW < AWidth) do while (totW < AWidth) do
begin begin
colW := ptsToMM(GetColWidth(ACol2) * factor); colW := GetColWidth(ACol2, FWorkbook.Units);
totW := totW + colW; totW := totW + colW;
if totW >= AWidth then if totW >= AWidth then
begin begin
@ -3434,11 +3439,10 @@ begin
end; end;
// Find y coordinate of top image edge, in inches. // Find y coordinate of top image edge, in inches.
factor := FWorkbook.GetDefaultFont.Size; // Height of line in pts
y := ARowOffs1; y := ARowOffs1;
for r := 0 to ARow1 - 1 do for r := 0 to ARow1 - 1 do
begin begin
rowH := ptsToMM(CalcRowHeight(r) * factor); // row height in mm rowH := CalcRowHeight(r);
y := y + rowH; y := y + rowH;
end; end;
@ -3447,7 +3451,7 @@ begin
ARow2 := ARow1; ARow2 := ARow1;
while (totH < AHeight) do while (totH < AHeight) do
begin begin
rowH := ptsToMM(CalcRowHeight(ARow2) * factor); rowH := CalcRowHeight(ARow2);
totH := totH + rowH; totH := totH + rowH;
if totH >= AHeight then if totH >= AHeight then
begin begin
@ -3466,10 +3470,10 @@ end;
@param AFileName Name of the image file @param AFileName Name of the image file
@param AOffsetX The image is offset horizontally from the left edge of @param AOffsetX The image is offset horizontally from the left edge of
the anchor cell. May reach into another cell. the anchor cell. May reach into another cell.
Value is in millimeters. Value is in workbook units.
@param AOffsetY The image is offset vertically from the top edge of the @param AOffsetY The image is offset vertically from the top edge of the
anchor cell. May reach into another cell. anchor cell. May reach into another cell.
Value is in millimeters. Value is in workbook units.
@param AScaleX Horizontal scaling factor of the image @param AScaleX Horizontal scaling factor of the image
@param AScaleY Vertical scaling factor of the image @param AScaleY Vertical scaling factor of the image
@return Index into the internal image list. @return Index into the internal image list.
@ -3501,10 +3505,10 @@ end;
@param AStream Stream which contains the image data @param AStream Stream which contains the image data
@param AOffsetX The image is offset horizontally from the left edge of @param AOffsetX The image is offset horizontally from the left edge of
the anchor cell. May reach into another cell. the anchor cell. May reach into another cell.
Value is in millimeters. Value is in workbook units.
@param AOffsetY The image is offset vertically from the top edge of the @param AOffsetY The image is offset vertically from the top edge of the
anchor cell. May reach into another cell. anchor cell. May reach into another cell.
Value is in millimeters. Value is in workbook units.
@param AScaleX Horizontal scaling factor of the image @param AScaleX Horizontal scaling factor of the image
@param AScaleY Vertical scaling factor of the image @param AScaleY Vertical scaling factor of the image
@return Index into the internal image list. @return Index into the internal image list.
@ -3536,6 +3540,7 @@ begin
img^.Index := AImageIndex; img^.Index := AImageIndex;
Result := FImages.Add(img); Result := FImages.Add(img);
end; end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
Removes an image from the internal image list. Removes an image from the internal image list.
The image is identified by its index. The image is identified by its index.
@ -6157,28 +6162,24 @@ end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
Calculates the optimum height of a given row. Depends on the font size Calculates the optimum height of a given row. Depends on the font size
of the individual cells in the row. of the individual cells in the row. Is converted to workbook units.
@param ARow Index of the row to be considered @param ARow Index of the row to be considered
@return Row height in line count of the default font. @return Row height in workbook units
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
function TsWorksheet.CalcAutoRowHeight(ARow: Cardinal): Single; function TsWorksheet.CalcAutoRowHeight(ARow: Cardinal): Single;
var var
cell: PCell; cell: PCell;
h0: Single;
begin begin
Result := 0; Result := 0;
h0 := Workbook.GetDefaultFontSize;
for cell in Cells.GetRowEnumerator(ARow) do for cell in Cells.GetRowEnumerator(ARow) do
Result := Max(Result, ReadCellFont(cell).Size / h0); Result := Max(Result, ReadCellFont(cell).Size);
Result := FWorkbook.ConvertUnits(Result, suPoints, FWorkbook.Units);
// FixMe: This is not correct if text is rotated or wrapped // FixMe: This is not correct if text is rotated or wrapped
{
if Result = 0 then
Result := DefaultRowHeight;
}
end; end;
function TsWorksheet.CalcRowHeight(ARow: Cardinal): Single; function TsWorksheet.CalcRowHeight(ARow: Cardinal): Single;
// In workbook units
begin begin
Result := CalcAutoRowHeight(ARow); Result := CalcAutoRowHeight(ARow);
if Result = 0 then if Result = 0 then
@ -6327,9 +6328,10 @@ end;
the default column width is returned. the default column width is returned.
@param ACol Index of the column considered @param ACol Index of the column considered
@return Width of the column (in count of "0" characters of the default font) @param AUnits Units for the column width.
@return Width of the column
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
function TsWorksheet.GetColWidth(ACol: Cardinal): Single; function TsWorksheet.GetColWidth(ACol: Cardinal; AUnits: TsSizeUnits): Single;
var var
col: PCol; col: PCol;
begin begin
@ -6342,17 +6344,24 @@ begin
Result := col^.Width Result := col^.Width
else else
Result := FDefaultColWidth; Result := FDefaultColWidth;
Result := FWorkbook.ConvertUnits(Result, FWorkbook.Units, AUnits);
end; end;
end; end;
function TsWorksheet.GetColWidth(ACol: Cardinal): Single;
begin
Result := GetColWidth(ACol, suChars);
end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
Returns the height of the given row. If there is no row record then the Returns the height of the given row. If there is no row record then the
default row height is returned default row height is returned
@param ARow Index of the row considered @param ARow Index of the row considered
@return Height of the row (in line count of the default font). @param AUnits Units for the row height.
@return Height of the row
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
function TsWorksheet.GetRowHeight(ARow: Cardinal): Single; function TsWorksheet.GetRowHeight(ARow: Cardinal; AUnits: TsSizeUnits): Single;
var var
row: PRow; row: PRow;
begin begin
@ -6365,9 +6374,15 @@ begin
Result := row^.Height Result := row^.Height
else else
Result := FDefaultRowHeight; Result := FDefaultRowHeight;
Result := FWorkbook.ConvertUnits(Result, FWorkbook.Units, AUnits);
end; end;
end; end;
function TsWorksheet.GetRowHeight(ARow: Cardinal): Single;
begin
Result := GetRowHeight(ARow, suLines);
end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
Deletes the column at the index specified. Cells with greader column indexes Deletes the column at the index specified. Cells with greader column indexes
are moved one column to the left. Merged cell blocks and cell references in are moved one column to the left. Merged cell blocks and cell references in
@ -6748,7 +6763,8 @@ end;
Creates a new row record if it does not yet exist. Creates a new row record if it does not yet exist.
@param ARow Index of the row record which will be created or modified @param ARow Index of the row record which will be created or modified
@param AData Data to be written. @param AData Data to be written. Expected to be already in the units
defined for the workbook
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
procedure TsWorksheet.WriteRowInfo(ARow: Cardinal; AData: TRow); procedure TsWorksheet.WriteRowInfo(ARow: Cardinal; AData: TRow);
var var
@ -6763,17 +6779,23 @@ end;
does not yet exist. does not yet exist.
@param ARow Index of the row to be considered @param ARow Index of the row to be considered
@param AHeight Row height to be assigned to the row. The row height is @param AHeight Row height to be assigned to the row.
expressed as the line count of the default font size. @param AUnits Units measuring the row height.
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
procedure TsWorksheet.WriteRowHeight(ARow: Cardinal; AHeight: Single); procedure TsWorksheet.WriteRowHeight(ARow: Cardinal; AHeight: Single;
AUnits: TsSizeUnits);
var var
AElement: PRow; AElement: PRow;
begin begin
if ARow = UNASSIGNED_ROW_COL_INDEX then if ARow = UNASSIGNED_ROW_COL_INDEX then
exit; exit;
AElement := GetRow(ARow); AElement := GetRow(ARow);
AElement^.Height := AHeight; AElement^.Height := FWorkbook.ConvertUnits(AHeight, AUnits, FWorkbook.FUnits);
end;
procedure TsWorksheet.WriteRowHeight(ARow: Cardinal; AHeight: Single);
begin
WriteRowHeight(ARow, AHeight, suLines);
end; end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
@ -6784,7 +6806,8 @@ end;
Creates a new column record if it does not yet exist. Creates a new column record if it does not yet exist.
@param ACol Index of the column record which will be created or modified @param ACol Index of the column record which will be created or modified
@param AData Data to be written (essentially column width). @param AData Data to be written (essentially column width). The column
width is already in the units defined for the workbook.
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
procedure TsWorksheet.WriteColInfo(ACol: Cardinal; AData: TCol); procedure TsWorksheet.WriteColInfo(ACol: Cardinal; AData: TCol);
var var
@ -6799,19 +6822,24 @@ end;
does not yet exist. does not yet exist.
@param ACol Index of the column to be considered @param ACol Index of the column to be considered
@param AWidth Width to be assigned to the column. The column width is @param AWidth Width to be assigned to the column.
expressed as the count of "0" characters of the default font. @param AUnits Units used for parameter AWidth.
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
procedure TsWorksheet.WriteColWidth(ACol: Cardinal; AWidth: Single); procedure TsWorksheet.WriteColWidth(ACol: Cardinal; AWidth: Single;
AUnits: TsSizeUnits);
var var
AElement: PCol; AElement: PCol;
begin begin
if ACol = UNASSIGNED_ROW_COL_INDEX then if ACol = UNASSIGNED_ROW_COL_INDEX then
exit; exit;
AElement := GetCol(ACol); AElement := GetCol(ACol);
AElement^.Width := AWidth; AElement^.Width := FWorkbook.ConvertUnits(AWidth, AUnits, FWorkbook.FUnits);
end; end;
procedure TsWorksheet.WriteColWidth(ACol: Cardinal; AWidth: Single);
begin
WriteColWidth(ACol, AWidth, suChars);
end;
{------------------------------------------------------------------------------} {------------------------------------------------------------------------------}
{ TsWorkbook } { TsWorkbook }
@ -6869,6 +6897,53 @@ begin
TsWorksheet(sheet).CalcFormulas; TsWorksheet(sheet).CalcFormulas;
end; end;
{@@ ----------------------------------------------------------------------------
Conversion of length values between units
-------------------------------------------------------------------------------}
function TsWorkbook.ConvertUnits(AValue: Double;
AFromUnits, AToUnits: TsSizeUnits): Double;
begin
if AFromUnits = AToUnits then
begin
Result := AValue;
exit;
end;
// Convert to mm
case AFromUnits of
suMillimeters:
Result := AValue;
suCentimeters:
Result := AValue * 10.0;
suInches:
Result := inToMM(AValue);
suPoints:
Result := ptsToMM(AValue);
suChars:
Result := ptsToMM(GetDefaultFont.Size * ZERO_WIDTH_FACTOR * AValue);
suLines:
Result := ptsToMM(GetDefaultFont.Size * (AValue + ROW_HEIGHT_CORRECTION));
else
raise Exception.Create('Unit not supported.');
end;
// Convert from mm
case AToUnits of
suMillimeters: ; // nothing to do
suCentimeters:
Result := Result * 0.1;
suInches:
Result := mmToIn(Result);
suPoints:
Result := mmToPts(Result);
suChars:
Result := mmToPts(Result) / (GetDefaultFont.Size * ZERO_WIDTH_FACTOR);
suLines:
Result := mmToPts(Result) / GetDefaultFont.Size - ROW_HEIGHT_CORRECTION;
else
raise Exception.Create('Unit not supported.');
end;
end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
Helper method for clearing the spreadsheet list. Helper method for clearing the spreadsheet list.
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
@ -6926,6 +7001,7 @@ begin
FWorksheets := TFPList.Create; FWorksheets := TFPList.Create;
FLog := TStringList.Create; FLog := TStringList.Create;
FFormatID := sfidUnknown; FFormatID := sfidUnknown;
FUnits := suMillimeters; // Units for column width and row height
FormatSettings := UTF8FormatSettings; FormatSettings := UTF8FormatSettings;
FormatSettings.ShortDateFormat := MakeShortDateFormat(FormatSettings.ShortDateFormat); FormatSettings.ShortDateFormat := MakeShortDateFormat(FormatSettings.ShortDateFormat);
@ -8314,6 +8390,8 @@ var
rdest, cdest: Integer; // row and column index at destination rdest, cdest: Integer; // row and column index at destination
nselS, nselD: Integer; // count of selected blocks nselS, nselD: Integer; // count of selected blocks
begin begin
Unused(ATransposed);
if AStream = nil then if AStream = nil then
exit; exit;
@ -8452,13 +8530,13 @@ begin
end; end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
Creates a new "embedded" stream and load the specified file. Creates a new "embedded" stream and loads the specified file.
Returns the index of the embedded file item. Returns the index of the embedded file item.
Image dimensions are converted to workbook units.
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
function TsWorkbook.AddEmbeddedObj(const AFileName: String): Integer; function TsWorkbook.AddEmbeddedObj(const AFileName: String): Integer;
var var
obj: TsEmbeddedObj = nil; obj: TsEmbeddedObj = nil;
w, h: Double;
begin begin
if not FileExists(AFileName) then if not FileExists(AFileName) then
begin begin
@ -8469,8 +8547,11 @@ begin
obj := TsEmbeddedObj.Create; obj := TsEmbeddedObj.Create;
if obj.LoadFromFile(AFileName) then if obj.LoadFromFile(AFileName) then
begin
obj.ImageWidth := ConvertUnits(obj.ImageWidth, suInches, FUnits);
obj.ImageHeight := ConvertUnits(obj.ImageHeight, suInches, FUnits);
Result := FEmbeddedObjList.Add(obj) Result := FEmbeddedObjList.Add(obj)
else end else
begin begin
AddErrorMsg(rsFileFormatNotSupported, [AFileName]); AddErrorMsg(rsFileFormatNotSupported, [AFileName]);
obj.Free; obj.Free;
@ -8486,7 +8567,6 @@ function TsWorkbook.AddEmbeddedObj(AStream: TStream;
const AName: String = ''): Integer; const AName: String = ''): Integer;
var var
obj: TsEmbeddedObj = nil; obj: TsEmbeddedObj = nil;
w, h: Double;
begin begin
obj := TsEmbeddedObj.Create; obj := TsEmbeddedObj.Create;
if obj.LoadFromStream(AStream, AName) then if obj.LoadFromStream(AStream, AName) then

View File

@ -84,7 +84,7 @@ type
TsWorkbookChartSource = class(TCustomChartSource, IsSpreadsheetControl) TsWorkbookChartSource = class(TCustomChartSource, IsSpreadsheetControl)
private private
FWorkbookSource: TsWorkbookSource; FWorkbookSource: TsWorkbookSource;
FWorkbook: TsWorkbook; // FWorkbook: TsWorkbook;
FWorksheets: array[TsXYRange] of TsWorksheet; FWorksheets: array[TsXYRange] of TsWorksheet;
FRangeStr: array[TsXYRange] of String; FRangeStr: array[TsXYRange] of String;
FRanges: array[TsXYRange] of TsCellRangeArray; FRanges: array[TsXYRange] of TsCellRangeArray;
@ -323,13 +323,13 @@ var
L: TStrings; L: TStrings;
range: TsCellRange; range: TsCellRange;
begin begin
if (FWorkbook = nil) or (FWorksheets[AIndex] = nil) or (Length(FRanges) = 0) then if (Workbook = nil) or (FWorksheets[AIndex] = nil) or (Length(FRanges) = 0) then
exit(''); exit('');
L := TStringList.Create; L := TStringList.Create;
try try
if AListSeparator = #0 then if AListSeparator = #0 then
L.Delimiter := FWorkbook.FormatSettings.ListSeparator L.Delimiter := Workbook.FormatSettings.ListSeparator
else else
L.Delimiter := AListSeparator; L.Delimiter := AListSeparator;
L.StrictDelimiter := true; L.StrictDelimiter := true;
@ -412,7 +412,7 @@ begin
Result := WorkbookSource.Workbook Result := WorkbookSource.Workbook
else else
Result := nil; Result := nil;
FWorkbook := Result; // FWorkbook := Result;
end; end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
@ -547,7 +547,6 @@ begin
end; end;
end; end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
Standard component notification: The ChartSource is notified that the Standard component notification: The ChartSource is notified that the
WorkbookSource is being removed. WorkbookSource is being removed.
@ -582,7 +581,7 @@ const
var var
range: TsCellRange; range: TsCellRange;
begin begin
if (FWorkbook = nil) or (FRangeStr[AIndex] = '') //or (FWorksheets[AIndex] = nil) if (Workbook = nil) or (FRangeStr[AIndex] = '') //or (FWorksheets[AIndex] = nil)
then begin then begin
FWorksheets[AIndex] := nil; FWorksheets[AIndex] := nil;
SetLength(FRanges[AIndex], 0); SetLength(FRanges[AIndex], 0);
@ -591,7 +590,7 @@ begin
exit; exit;
end; end;
if FWorkbook.TryStrToCellRanges(FRangeStr[AIndex], FWorksheets[AIndex], FRanges[AIndex]) if Workbook.TryStrToCellRanges(FRangeStr[AIndex], FWorksheets[AIndex], FRanges[AIndex])
then begin then begin
for range in FRanges[AIndex] do for range in FRanges[AIndex] do
if (range.Col1 <> range.Col2) and (range.Row1 <> range.Row2) then if (range.Col1 <> range.Col2) and (range.Row1 <> range.Row2) then
@ -602,7 +601,7 @@ begin
// Make sure to include worksheet name in RangeString. // Make sure to include worksheet name in RangeString.
FRangeStr[AIndex] := BuildRangeStr(AIndex); FRangeStr[AIndex] := BuildRangeStr(AIndex);
end else end else
if (FWorkbook.GetWorksheetCount > 0) then begin if (Workbook.GetWorksheetCount > 0) then begin
if FWorksheets[AIndex] = nil then if FWorksheets[AIndex] = nil then
raise Exception.CreateFmt('Worksheet of %s cell range "%s" does not exist.', raise Exception.CreateFmt('Worksheet of %s cell range "%s" does not exist.',
[XY[AIndex], FRangeStr[AIndex]]) [XY[AIndex], FRangeStr[AIndex]])
@ -660,7 +659,7 @@ begin
FWorkbookSource := AValue; FWorkbookSource := AValue;
if FWorkbookSource <> nil then if FWorkbookSource <> nil then
FWorkbookSource.AddListener(self); FWorkbookSource.AddListener(self);
FWorkbook := GetWorkbook; // FWorkbook := GetWorkbook;
ListenerNotification([lniWorkbook, lniWorksheet]); ListenerNotification([lniWorkbook, lniWorksheet]);
end; end;

View File

@ -3269,50 +3269,54 @@ begin
AStrings.Add('Last column='); AStrings.Add('Last column=');
AStrings.Add('Active cell='); AStrings.Add('Active cell=');
AStrings.Add('Selection='); AStrings.Add('Selection=');
AStrings.Add('Default column width=');
AStrings.Add('Default row height=');
AStrings.Add('Page layout='); AStrings.Add('Page layout=');
end else end else
begin begin
AStrings.Add(Format('Name=%s', [ASheet.Name])); AStrings.Add('Name=%s', [ASheet.Name]);
AStrings.Add(Format('First row=%d', [Integer(ASheet.GetFirstRowIndex)])); AStrings.Add('First row=%d', [Integer(ASheet.GetFirstRowIndex)]);
AStrings.Add(Format('Last row=%d', [ASheet.GetLastRowIndex])); AStrings.Add('Last row=%d', [ASheet.GetLastRowIndex]);
AStrings.Add(Format('First column=%d', [Integer(ASheet.GetFirstColIndex)])); AStrings.Add('First column=%d', [Integer(ASheet.GetFirstColIndex)]);
AStrings.Add(Format('Last column=%d', [ASheet.GetLastColIndex])); AStrings.Add('Last column=%d', [ASheet.GetLastColIndex]);
AStrings.Add(Format('Active cell=%s', [GetCellString(ASheet.ActiveCellRow, ASheet.ActiveCellCol)])); AStrings.Add('Active cell=%s', [GetCellString(ASheet.ActiveCellRow, ASheet.ActiveCellCol)]);
AStrings.Add(Format('Selection=%s', [ASheet.GetSelectionAsString])); AStrings.Add('Selection=%s', [ASheet.GetSelectionAsString]);
AStrings.Add(Format('Comments=%d items', [ASheet.Comments.Count])); AStrings.Add('Default column width=%.1f %s', [ASheet.DefaultColWidth, SizeUnitNames[ASheet.Workbook.Units]]);
AStrings.Add(Format('Hyperlinks=%d items', [ASheet.Hyperlinks.Count])); AStrings.Add('Default row height=%.1f %s', [ASheet.DefaultRowHeight, SizeUnitNames[ASheet.Workbook.Units]]);
AStrings.Add(Format('MergedCells=%d items', [ASheet.MergedCells.Count])); AStrings.Add('Comments=%d items', [ASheet.Comments.Count]);
AStrings.Add('Hyperlinks=%d items', [ASheet.Hyperlinks.Count]);
AStrings.Add('MergedCells=%d items', [ASheet.MergedCells.Count]);
if ienPageLayout in FExpanded then if ienPageLayout in FExpanded then
begin begin
AStrings.Add('(-) Page layout='); AStrings.Add('(-) Page layout=');
AStrings.Add(Format(' Orientation=%s', [GetEnumName(TypeInfo(TsPageOrientation), ord(ASheet.PageLayout.Orientation))])); AStrings.Add(' Orientation=%s', [GetEnumName(TypeInfo(TsPageOrientation), ord(ASheet.PageLayout.Orientation))]);
AStrings.Add(Format(' Page width=%.1f mm', [ASheet.PageLayout.PageWidth])); AStrings.Add(' Page width=%.1f mm', [ASheet.PageLayout.PageWidth]);
AStrings.Add(Format(' Page height=%.1f mm', [ASheet.PageLayout.PageHeight])); AStrings.Add(' Page height=%.1f mm', [ASheet.PageLayout.PageHeight]);
AStrings.Add(Format(' Left margin=%.1f mm', [ASheet.PageLayout.LeftMargin])); AStrings.Add(' Left margin=%.1f mm', [ASheet.PageLayout.LeftMargin]);
AStrings.Add(Format(' Right margin=%.1f mm', [ASheet.PageLayout.RightMargin])); AStrings.Add(' Right margin=%.1f mm', [ASheet.PageLayout.RightMargin]);
AStrings.Add(Format(' Top margin=%.1f mm', [ASheet.PageLayout.TopMargin])); AStrings.Add(' Top margin=%.1f mm', [ASheet.PageLayout.TopMargin]);
AStrings.Add(Format(' Bottom margin=%.1f mm', [ASheet.PageLayout.BottomMargin])); AStrings.Add(' Bottom margin=%.1f mm', [ASheet.PageLayout.BottomMargin]);
AStrings.Add(Format(' Header distance=%.1f mm', [ASheet.PageLayout.HeaderMargin])); AStrings.Add(' Header distance=%.1f mm', [ASheet.PageLayout.HeaderMargin]);
AStrings.Add(Format(' Footer distance=%.1f mm', [ASheet.PageLayout.FooterMargin])); AStrings.Add(' Footer distance=%.1f mm', [ASheet.PageLayout.FooterMargin]);
if poUseStartPageNumber in ASheet.PageLayout.Options then if poUseStartPageNumber in ASheet.PageLayout.Options then
AStrings.Add(Format(' Start page number=%d', [ASheet.pageLayout.StartPageNumber])) AStrings.Add(' Start page number=%d', [ASheet.pageLayout.StartPageNumber])
else else
AStrings.Add (' Start page number=automatic'); AStrings.Add(' Start page number=automatic');
AStrings.Add(Format(' Scaling factor=%d%%', [ASheet.PageLayout.ScalingFactor])); AStrings.Add(' Scaling factor=%d%%', [ASheet.PageLayout.ScalingFactor]);
AStrings.Add(Format(' Copies=%d', [ASheet.PageLayout.Copies])); AStrings.Add(' Copies=%d', [ASheet.PageLayout.Copies]);
if (ASheet.PageLayout.Options * [poDifferentOddEven, poDifferentFirst] <> []) then if (ASheet.PageLayout.Options * [poDifferentOddEven, poDifferentFirst] <> []) then
begin begin
AStrings.Add(Format(' Header (first)=%s', [StringReplace(ASheet.PageLayout.Headers[0], LineEnding, '\n', [rfReplaceAll])])); AStrings.Add(' Header (first)=%s', [StringReplace(ASheet.PageLayout.Headers[0], LineEnding, '\n', [rfReplaceAll])]);
AStrings.Add(Format(' Header (odd)=%s', [StringReplace(ASheet.PageLayout.Headers[1], LineEnding, '\n', [rfReplaceAll])])); AStrings.Add(' Header (odd)=%s', [StringReplace(ASheet.PageLayout.Headers[1], LineEnding, '\n', [rfReplaceAll])]);
AStrings.Add(Format(' Header (even)=%s', [StringReplace(ASheet.PageLayout.Headers[2], LineEnding, '\n', [rfReplaceAll])])); AStrings.Add(' Header (even)=%s', [StringReplace(ASheet.PageLayout.Headers[2], LineEnding, '\n', [rfReplaceAll])]);
AStrings.Add(Format(' Footer (first)=%s', [StringReplace(ASheet.PageLayout.Footers[0], LineEnding, '\n', [rfReplaceAll])])); AStrings.Add(' Footer (first)=%s', [StringReplace(ASheet.PageLayout.Footers[0], LineEnding, '\n', [rfReplaceAll])]);
AStrings.Add(Format(' Footer (odd)=%s', [StringReplace(ASheet.PageLayout.Footers[1], LineEnding, '\n', [rfReplaceall])])); AStrings.Add(' Footer (odd)=%s', [StringReplace(ASheet.PageLayout.Footers[1], LineEnding, '\n', [rfReplaceall])]);
AStrings.Add(Format(' Footer (even)=%s', [StringReplace(ASheet.PageLayout.Footers[2], LineEnding, '\n', [rfReplaceAll])])); AStrings.Add(' Footer (even)=%s', [StringReplace(ASheet.PageLayout.Footers[2], LineEnding, '\n', [rfReplaceAll])]);
end else end else
begin begin
AStrings.Add(Format(' Header=%s', [StringReplace(ASheet.PageLayout.Headers[1], LineEnding, '\n', [rfReplaceAll])])); AStrings.Add(' Header=%s', [StringReplace(ASheet.PageLayout.Headers[1], LineEnding, '\n', [rfReplaceAll])]);
AStrings.Add(Format(' Footer=%s', [StringReplace(ASheet.PageLayout.Footers[1], LineEnding, '\n', [rfReplaceAll])])); AStrings.Add(' Footer=%s', [StringReplace(ASheet.PageLayout.Footers[1], LineEnding, '\n', [rfReplaceAll])]);
end; end;
if ASheet.PageLayout.HeaderImages[hfsLeft].Index > -1 then if ASheet.PageLayout.HeaderImages[hfsLeft].Index > -1 then

View File

@ -79,8 +79,8 @@ type
FHyperlinkCell: PCell; // Selected cell if it stores a hyperlink FHyperlinkCell: PCell; // Selected cell if it stores a hyperlink
FOnClickHyperlink: TsHyperlinkClickEvent; FOnClickHyperlink: TsHyperlinkClickEvent;
function CalcAutoRowHeight(ARow: Integer): Integer; function CalcAutoRowHeight(ARow: Integer): Integer;
function CalcColWidth(AWidth: Single): Integer; function CalcColWidthFromSheet(AWidth: Single): Integer;
function CalcRowHeight(AHeight: Single): Integer; function CalcRowHeightFromSheet(AHeight: Single): Integer;
procedure ChangedCellHandler(ASender: TObject; ARow, ACol: Cardinal); procedure ChangedCellHandler(ASender: TObject; ARow, ACol: Cardinal);
procedure ChangedFontHandler(ASender: TObject; ARow, ACol: Cardinal); procedure ChangedFontHandler(ASender: TObject; ARow, ACol: Cardinal);
procedure FixNeighborCellBorders(ACell: PCell); procedure FixNeighborCellBorders(ACell: PCell);
@ -1098,20 +1098,17 @@ begin
end; end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
Converts the column width, given in "characters" of the default font, to pixels. Converts the column width, given in units used by the worksheet, to pixels.
All chars are assumed to have the same width defined by the width of the
"0" character. Therefore, this calculation is only approximate.
@param AWidth Width of a column given as "character count". @param AWidth Width of a column in units used by the worksheet
@return Column width in pixels. @return Column width in pixels.
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
function TsCustomWorksheetGrid.CalcColWidth(AWidth: Single): Integer; function TsCustomWorksheetGrid.CalcColWidthFromSheet(AWidth: Single): Integer;
var var
w0: Integer; w_pts: Double;
begin begin
Convert_sFont_to_Font(Workbook.GetFont(0), Canvas.Font); w_pts := Workbook.ConvertUnits(AWidth, Workbook.Units, suPoints);
w0 := Canvas.TextWidth('0'); Result := PtsToPx(w_pts, Screen.PixelsPerInch);
Result := Round(AWidth * w0);
end; end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
@ -1138,19 +1135,18 @@ begin
end; end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
Converts the row height (from a worksheet row record), given in lines, to Converts the row height (from a worksheet row record), given in units used by
pixels as needed by the grid the sheet, to pixels as needed by the grid
@param AHeight Row height expressed as default font line count from the @param AHeight Row height expressed in units used by the worksheet.
worksheet
@result Row height in pixels. @result Row height in pixels.
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
function TsCustomWorksheetGrid.CalcRowHeight(AHeight: Single): Integer; function TsCustomWorksheetGrid.CalcRowHeightFromSheet(AHeight: Single): Integer;
var var
h_pts: Single; h_pts: Single;
begin begin
h_pts := AHeight * (Workbook.GetFont(0).Size + ROW_HEIGHT_CORRECTION); h_pts := Workbook.ConvertUnits(AHeight, Workbook.Units, suPoints);;
Result := PtsToPX(h_pts, Screen.PixelsPerInch) + 4; Result := PtsToPx(h_pts, Screen.PixelsPerInch); // + 4;
end; end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
@ -1158,17 +1154,19 @@ end;
worksheet. worksheet.
@param AValue Column width in pixels @param AValue Column width in pixels
@result Count of characters '0' in the worksheet's default font. @result Column width expressed in units defined by the workbook.
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
function TsCustomWorksheetGrid.CalcWorksheetColWidth(AValue: Integer): Single; function TsCustomWorksheetGrid.CalcWorksheetColWidth(AValue: Integer): Single;
var
w_pts: Double;
begin begin
Result := 0; Result := 0;
if Worksheet <> nil then if Worksheet <> nil then
begin begin
// The grid's column width is in "pixels", the worksheet's column width is // The grid's column width is in "pixels", the worksheet's column width
// in "characters". // has the units defined by the workbook.
Convert_sFont_to_Font(Workbook.GetDefaultFont, Canvas.Font); w_pts := PxToPts(AValue, Screen.PixelsPerInch);
Result := AValue / Canvas.TextWidth('0'); Result := Workbook.ConvertUnits(w_pts, suPoints, Workbook.Units);
end; end;
end; end;
@ -1177,7 +1175,7 @@ end;
worksheet. worksheet.
@param AValue Row height in pixels @param AValue Row height in pixels
@result Row height expressed as default font line count. @result Row height expressed in units defined by the workbook.
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
function TsCustomWorksheetGrid.CalcWorksheetRowHeight(AValue: Integer): Single; function TsCustomWorksheetGrid.CalcWorksheetRowHeight(AValue: Integer): Single;
var var
@ -1186,10 +1184,10 @@ begin
Result := 0; Result := 0;
if Worksheet <> nil then if Worksheet <> nil then
begin begin
// The grid's row heights are in "pixels", the worksheet's row heights are // The grid's row heights are in "pixels", the worksheet's row height
// in "lines" // has the units defined by the workbook.
h_pts := PxToPts(AValue - 4, Screen.PixelsPerInch); // height in points h_pts := PxToPts(AValue, Screen.PixelsPerInch);
Result := h_pts / (Workbook.GetDefaultFontSize + ROW_HEIGHT_CORRECTION); Result := Workbook.ConvertUnits(h_pts, suPoints, Workbook.Units);
end; end;
end; end;
@ -3471,11 +3469,11 @@ begin
if IsColumn then if IsColumn then
begin begin
w := CalcWorksheetColWidth(ColWidths[AIndex]); w := CalcWorksheetColWidth(ColWidths[AIndex]);
Worksheet.WriteColWidth(GetWorksheetCol(AIndex), w); Worksheet.WriteColWidth(GetWorksheetCol(AIndex), w, Workbook.Units);
end else end else
begin begin
h := CalcWorksheetRowHeight(RowHeights[AIndex]); h := CalcWorksheetRowHeight(RowHeights[AIndex]);
Worksheet.WriteRowHeight(GetWorksheetRow(AIndex), h); Worksheet.WriteRowHeight(GetWorksheetRow(AIndex), h, Workbook.Units);
end; end;
end; end;
@ -4681,9 +4679,9 @@ begin
begin begin
lCol := Worksheet.FindCol(i - FHeaderCount); lCol := Worksheet.FindCol(i - FHeaderCount);
if lCol <> nil then if lCol <> nil then
w := CalcColWidth(lCol^.Width) w := CalcColWidthFromSheet(lCol^.Width)
else else
w := CalcColWidth(Worksheet.DefaultColWidth); w := CalcColWidthFromSheet(Worksheet.DefaultColWidth);
end; end;
ColWidths[i] := w; ColWidths[i] := w;
end; end;
@ -4726,7 +4724,7 @@ begin
begin begin
lRow := Worksheet.FindRow(r - FHeaderCount); lRow := Worksheet.FindRow(r - FHeaderCount);
if (lRow <> nil) then if (lRow <> nil) then
h := CalcRowHeight(lRow^.Height) h := CalcRowHeightFromSheet(lRow^.Height)
else else
h := CalcAutoRowHeight(r); h := CalcAutoRowHeight(r);
end else end else

View File

@ -83,18 +83,33 @@ const
{@@ Index of italic default font in workbook's font list - not used directly } {@@ Index of italic default font in workbook's font list - not used directly }
ITALIC_FONTINDEX = 3; ITALIC_FONTINDEX = 3;
{@@ Takes account of effect of cell margins on row height by adding this
value to the nominal row height. Note that this is an empirical value
and may be wrong. }
ROW_HEIGHT_CORRECTION = 0.2;
{@@ Line ending character in cell texts with fixed line break. Using a {@@ Line ending character in cell texts with fixed line break. Using a
unique value simplifies many things... } unique value simplifies many things... }
FPS_LINE_ENDING = #10; FPS_LINE_ENDING = #10;
type type
{@@ Units for size dimensions }
TsSizeUnits = (suChars, suLines, suMillimeters, suCentimeters, suPoints, suInches);
const
{@@ Unit names }
SizeUnitNames: array[TsSizeUnits] of string = (
'chars', 'lines', 'mm', 'cm', 'pt', 'in');
{@@ Takes account of effect of cell margins on row height by adding this
value to the nominal row height. Note that this is an empirical value
and may be wrong. }
ROW_HEIGHT_CORRECTION = 0.3;
{@@ Ratio of the width of the "0" character to the font size.
Empirical value to match Excel and LibreOffice column withs.
Needed because Excel defines colum width in terms of count of the "0"
character. }
ZERO_WIDTH_FACTOR = 351/640;
type
{@@ Tokens to identify the <b>elements in an expanded formula</b>. {@@ Tokens to identify the <b>elements in an expanded formula</b>.
NOTE: When adding or rearranging items NOTE: When adding or rearranging items

View File

@ -1530,6 +1530,7 @@ begin
Result := true; Result := true;
end; end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
Excel's unit of row heights is "twips", i.e. 1/20 point. Excel's unit of row heights is "twips", i.e. 1/20 point.
Converts Twips to points. Converts Twips to points.
@ -1682,8 +1683,10 @@ end;
@return Value converted to millimeters @return Value converted to millimeters
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
function PtsToMM(AValue: Double): Double; function PtsToMM(AValue: Double): Double;
const
PTS = 25.4 / 72.0;
begin begin
Result := AValue / 72 * 25.4; Result := AValue * PTS;
end; end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
@ -2122,6 +2125,14 @@ end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
Initializes the fields of a TsImage record Initializes the fields of a TsImage record
@param ARow Index of the anchor row
@param ACol Index of the anchor column
@param AOffsetX Distance of the left image edge from the left edge of the
anchor column. Measured in the units defined by the workbook.
@param AOffsetY Distance of the top image edge from the top edge of the
anchor row. Measured in the units defined by the workbook.
@return TsImage record containing these values.
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
procedure InitImageRecord(out AValue: TsImage; ARow, ACol: Cardinal; procedure InitImageRecord(out AValue: TsImage; ARow, ACol: Cardinal;
AOffsetX, AOffsetY, AScaleX, AScaleY: Double); AOffsetX, AOffsetY, AScaleX, AScaleY: Double);
@ -2143,8 +2154,6 @@ begin
with AImage do with AImage do
begin begin
Index := -1; Index := -1;
//ScaleX := 1.0;
//ScaleY := 1.0;
end; end;
end; end;

View File

@ -124,7 +124,7 @@ begin
// Comment in label cell // Comment in label cell
col := 1; col := 1;
MyWorksheet.WriteUTF8Text(row, col, 'Cell with comment'); MyWorksheet.WriteText(row, col, 'Cell with comment');
Myworksheet.WriteComment(row, col, ACommentText); Myworksheet.WriteComment(row, col, ACommentText);
// Comment in number cell // Comment in number cell

View File

@ -194,7 +194,7 @@ begin
cctNumber: cctNumber:
cell := MyWorksheet.WriteNumber(row+col, col, SourceCells[row].NumberValue); cell := MyWorksheet.WriteNumber(row+col, col, SourceCells[row].NumberValue);
cctUTF8String: cctUTF8String:
cell := Myworksheet.WriteUTF8Text(row+col, col, SourceCells[row].UTF8StringValue); cell := Myworksheet.WriteText(row+col, col, SourceCells[row].UTF8StringValue);
cctEmpty: cctEmpty:
cell := MyWorksheet.WriteBlank(row+col, col); cell := MyWorksheet.WriteBlank(row+col, col);
end; end;

View File

@ -265,7 +265,7 @@ begin
if s[col+1] = 'x' then s[col+1] := ' '; if s[col+1] = 'x' then s[col+1] := ' ';
end; end;
if s[col+1] = 'x' then if s[col+1] = 'x' then
MyWorksheet.WriteUTF8Text(row, col, CELLTEXT) MyWorksheet.WriteText(row, col, CELLTEXT)
else else
if s[col+1] = 'o' then if s[col+1] = 'o' then
MyWorksheet.WriteBlank(row, col); MyWorksheet.WriteBlank(row, col);

View File

@ -112,7 +112,7 @@ begin
for row := row1 to row2 do begin for row := row1 to row2 do begin
MyWorksheet.WriteBlank(row, 0); MyWorksheet.WriteBlank(row, 0);
MyWorksheet.WriteNumber(row, 1, 1.0); MyWorksheet.WriteNumber(row, 1, 1.0);
MyWorksheet.WriteUTF8Text(row, 2, 'A'); MyWorksheet.WriteText(row, 2, 'A');
MyWorksheet.WriteFormula(Row, 3, formula); MyWorksheet.WriteFormula(Row, 3, formula);
MyWorksheet.WriteRPNFormula(row, 4, CreateRPNFormula( MyWorksheet.WriteRPNFormula(row, 4, CreateRPNFormula(
RPNCellValue('A1', nil))); RPNCellValue('A1', nil)));
@ -135,7 +135,7 @@ begin
for col := col1 to col2 do begin for col := col1 to col2 do begin
MyWorksheet.WriteBlank(0, col); MyWorksheet.WriteBlank(0, col);
MyWorksheet.WriteNumber(1, col, 1.0); MyWorksheet.WriteNumber(1, col, 1.0);
MyWorksheet.WriteUTF8Text(2, col, 'A'); MyWorksheet.WriteText(2, col, 'A');
MyWorksheet.WriteFormula(3, col, formula); MyWorksheet.WriteFormula(3, col, formula);
MyWorksheet.WriteRPNFormula(4, col, CreateRPNFormula( MyWorksheet.WriteRPNFormula(4, col, CreateRPNFormula(
RPNCellValue('A1', nil))); RPNCellValue('A1', nil)));
@ -172,7 +172,7 @@ begin
// to file. // to file.
for row := 0 to palette.Count-1 do for row := 0 to palette.Count-1 do
begin begin
MyWorksheet.WriteUTF8Text(row, 0, s); MyWorksheet.WriteText(row, 0, s);
MyWorksheet.WriteFontColor(row, 0, palette[row]); MyWorksheet.WriteFontColor(row, 0, palette[row]);
end; end;
@ -202,7 +202,7 @@ begin
MyWorkbook := TsWorkbook.Create; MyWorkbook := TsWorkbook.Create;
try try
MyWorkSheet:= MyWorkBook.AddWorksheet(ERROR_SHEET); MyWorkSheet:= MyWorkBook.AddWorksheet(ERROR_SHEET);
MyWorksheet.WriteUTF8Text(0, 0, s); MyWorksheet.WriteText(0, 0, s);
TempFile:=NewTempFile; TempFile:=NewTempFile;
MyWorkBook.WriteToFile(TempFile, AFormat, true); MyWorkBook.WriteToFile(TempFile, AFormat, true);
ErrList.Text := MyWorkbook.ErrorMsg; ErrList.Text := MyWorkbook.ErrorMsg;
@ -219,7 +219,7 @@ begin
MyWorkbook := TsWorkbook.Create; MyWorkbook := TsWorkbook.Create;
try try
MyWorksheet := MyWorkbook.AddWorksheet(ERROR_SHEET); MyWorksheet := MyWorkbook.AddWorksheet(ERROR_SHEET);
Myworksheet.WriteUTF8Text(0, 0, s); Myworksheet.WriteText(0, 0, s);
TempFile := NewTempFile; TempFile := NewTempFile;
Myworkbook.WriteToFile(TempFile, AFormat, true); Myworkbook.WriteToFile(TempFile, AFormat, true);
ErrList.Text := MyWorkbook.ErrorMsg; ErrList.Text := MyWorkbook.ErrorMsg;

View File

@ -1186,7 +1186,7 @@ begin
try try
MyWorkSheet:= MyWorkBook.AddWorksheet(RowHeightSheet); MyWorkSheet:= MyWorkBook.AddWorksheet(RowHeightSheet);
for Row := Low(SollRowHeights) to High(SollRowHeights) do for Row := Low(SollRowHeights) to High(SollRowHeights) do
MyWorksheet.WriteRowHeight(Row, SollRowHeights[Row]); MyWorksheet.WriteRowHeight(Row, SollRowHeights[Row], suLines);
TempFile:=NewTempFile; TempFile:=NewTempFile;
MyWorkBook.WriteToFile(TempFile, AFormat, true); MyWorkBook.WriteToFile(TempFile, AFormat, true);
finally finally
@ -1205,7 +1205,7 @@ begin
fail('Error in test code. Failed to get named worksheet'); fail('Error in test code. Failed to get named worksheet');
for Row := Low(SollRowHeights) to High(SollRowHeights) do for Row := Low(SollRowHeights) to High(SollRowHeights) do
begin begin
ActualRowHeight := MyWorksheet.GetRowHeight(Row); ActualRowHeight := MyWorksheet.GetRowHeight(Row, suLines);
// Take care of rounding errors - due to missing details of calculation // Take care of rounding errors - due to missing details of calculation
// they can be quite large... // they can be quite large...
if abs(ActualRowHeight - SollRowHeights[Row]) > 1e-2 then if abs(ActualRowHeight - SollRowHeights[Row]) > 1e-2 then

View File

@ -210,7 +210,7 @@ begin
CheckEquals(expected, actual, CheckEquals(expected, actual,
'Test saved hyperlink target, cell '+CellNotation(MyWorksheet, row, col)); 'Test saved hyperlink target, cell '+CellNotation(MyWorksheet, row, col));
actual := MyWorksheet.ReadAsUTF8Text(cell); actual := MyWorksheet.ReadAsText(cell);
if row = 0 then begin if row = 0 then begin
// An originally blank cell shows the hyperlink.Target. // An originally blank cell shows the hyperlink.Target.
// But Worksheet.WriteHyperlink removes the "file:///" protocol // But Worksheet.WriteHyperlink removes the "file:///" protocol

View File

@ -987,7 +987,7 @@ begin
'0'..'9': MyWorksheet.WriteNumber(row, col, StrToInt(s[col+1])); '0'..'9': MyWorksheet.WriteNumber(row, col, StrToInt(s[col+1]));
'F' : MyWorksheet.WriteFormula(row, col, InsDelTestData[ATestIndex].Formula); 'F' : MyWorksheet.WriteFormula(row, col, InsDelTestData[ATestIndex].Formula);
'M' : begin 'M' : begin
MyWorksheet.WriteUTF8Text(row, col, 'M'); MyWorksheet.WriteText(row, col, 'M');
MyWorksheet.MergeCells( MyWorksheet.MergeCells(
row, row,
col, col,

View File

@ -130,10 +130,8 @@ const
var var
MyWorksheet: TsWorksheet; MyWorksheet: TsWorksheet;
MyWorkbook: TsWorkbook; MyWorkbook: TsWorkbook;
i, ilast, n, row, col: Integer; i, ilast, row, col: Integer;
TempFile: string; //write xls/xml to this file and read back from it TempFile: string; //write xls/xml to this file and read back from it
L: TStringList;
s: String;
sortParams: TsSortParams; sortParams: TsSortParams;
actualNumber: Double; actualNumber: Double;
actualString: String; actualString: String;
@ -157,12 +155,12 @@ begin
0: for i :=0 to High(SollSortNumbers) do // Numbers only 0: for i :=0 to High(SollSortNumbers) do // Numbers only
MyWorksheet.WriteNumber(i, col, SollSortNumbers[i]); MyWorksheet.WriteNumber(i, col, SollSortNumbers[i]);
1: for i := 0 to High(SollSortStrings) do // Strings only 1: for i := 0 to High(SollSortStrings) do // Strings only
Myworksheet.WriteUTF8Text(i, col, SollSortStrings[i]); Myworksheet.WriteText(i, col, SollSortStrings[i]);
2: begin // Numbers and strings 2: begin // Numbers and strings
for i := 0 to High(SollSortNumbers) do for i := 0 to High(SollSortNumbers) do
MyWorkSheet.WriteNumber(i*2, col, SollSortNumbers[i]); MyWorkSheet.WriteNumber(i*2, col, SollSortNumbers[i]);
for i := 0 to High(SollSortStrings) do for i := 0 to High(SollSortStrings) do
MyWorksheet.WriteUTF8Text(i*2+1, col, SollSortStrings[i]); MyWorksheet.WriteText(i*2+1, col, SollSortStrings[i]);
end; end;
end end
end end
@ -171,12 +169,12 @@ begin
0: for i := 0 to High(SollSortNumbers) do 0: for i := 0 to High(SollSortNumbers) do
MyWorksheet.WriteNumber(row, i, SollSortNumbers[i]); MyWorksheet.WriteNumber(row, i, SollSortNumbers[i]);
1: for i := 0 to High(SollSortStrings) do 1: for i := 0 to High(SollSortStrings) do
MyWorksheet.WriteUTF8Text(row, i, SollSortStrings[i]); MyWorksheet.WriteText(row, i, SollSortStrings[i]);
2: begin 2: begin
for i := 0 to High(SollSortNumbers) do for i := 0 to High(SollSortNumbers) do
myWorkSheet.WriteNumber(row, i*2, SollSortNumbers[i]); myWorkSheet.WriteNumber(row, i*2, SollSortNumbers[i]);
for i:=0 to High(SollSortStrings) do for i:=0 to High(SollSortStrings) do
MyWorksheet.WriteUTF8Text(row, i*2+1, SollSortStrings[i]); MyWorksheet.WriteText(row, i*2+1, SollSortStrings[i]);
end; end;
end; end;
end; end;
@ -257,7 +255,7 @@ begin
end; end;
1: begin 1: begin
cell := MyWorksheet.FindCell(row, col); cell := MyWorksheet.FindCell(row, col);
actualString := MyWorksheet.ReadAsUTF8Text(cell); actualString := MyWorksheet.ReadAsText(cell);
expectedString := char(ord('A') + i); expectedString := char(ord('A') + i);
CheckEquals(expectedstring, actualstring, CheckEquals(expectedstring, actualstring,
'Sorted cell string mismatch, cell '+CellNotation(MyWorksheet, row, col)); 'Sorted cell string mismatch, cell '+CellNotation(MyWorksheet, row, col));
@ -279,7 +277,7 @@ begin
CheckEquals(expectednumber, actualnumber, CheckEquals(expectednumber, actualnumber,
'Sorted cell number mismatch, cell '+CellNotation(MyWorksheet, row, col)); 'Sorted cell number mismatch, cell '+CellNotation(MyWorksheet, row, col));
end else begin end else begin
actualstring := MyWorksheet.ReadAsUTF8Text(row, col); actualstring := MyWorksheet.ReadAsText(row, col);
expectedstring := char(ord('A') + i - Length(SollSortNumbers)); expectedstring := char(ord('A') + i - Length(SollSortNumbers));
CheckEquals(expectedstring, actualstring, CheckEquals(expectedstring, actualstring,
'Sorted cell string mismatch, cell '+CellNotation(MyWorksheet, row, col)); 'Sorted cell string mismatch, cell '+CellNotation(MyWorksheet, row, col));
@ -302,14 +300,9 @@ const
var var
MyWorksheet: TsWorksheet; MyWorksheet: TsWorksheet;
MyWorkbook: TsWorkbook; MyWorkbook: TsWorkbook;
i, ilast, n, row, col: Integer; i, ilast, row, col: Integer;
MyCell: PCell;
TempFile: string; //write xls/xml to this file and read back from it TempFile: string; //write xls/xml to this file and read back from it
L: TStringList;
s: String;
sortParams: TsSortParams; sortParams: TsSortParams;
sortOptions: TsSortOptions;
r1,r2,c1,c2: Cardinal;
actualNumber: Double; actualNumber: Double;
actualString: String; actualString: String;
expectedNumber: Double; expectedNumber: Double;
@ -340,14 +333,14 @@ begin
// We will sort primarily according to column A, and seconarily according // We will sort primarily according to column A, and seconarily according
// to B. The construction allows us to determine if the sorting is correct. // to B. The construction allows us to determine if the sorting is correct.
for i:=0 to iLast do for i:=0 to iLast do
MyWorksheet.WriteUTF8Text(i, col, char(ord('A')+round(SollSortNumbers[i]) div 2)); MyWorksheet.WriteText(i, col, char(ord('A')+round(SollSortNumbers[i]) div 2));
end else end else
begin begin
// The same with the rows... // The same with the rows...
for i:=0 to iLast do for i:=0 to iLast do
MyWorksheet.WriteNumber(row+1, i, SollSortNumbers[i]); MyWorksheet.WriteNumber(row+1, i, SollSortNumbers[i]);
for i:=0 to iLast do for i:=0 to iLast do
MyWorksheet.WriteUTF8Text(row, i, char(ord('A')+round(SollSortNumbers[i]) div 2)); MyWorksheet.WriteText(row, i, char(ord('A')+round(SollSortNumbers[i]) div 2));
end; end;
MyWorkBook.WriteToFile(TempFile, AFormat, true); MyWorkBook.WriteToFile(TempFile, AFormat, true);
@ -404,7 +397,7 @@ begin
// Now read the string. It must be the character corresponding to the // Now read the string. It must be the character corresponding to the
// half of the number // half of the number
col := 0; col := 0;
actualString := MyWorksheet.ReadAsUTF8Text(row, col); actualString := MyWorksheet.ReadAsText(row, col);
expectedString := char(ord('A') + round(expectedNumber) div 2); expectedString := char(ord('A') + round(expectedNumber) div 2);
CheckEquals(expectedstring, actualstring, CheckEquals(expectedstring, actualstring,
'Sorted cell string mismatch, cell '+CellNotation(MyWorksheet, row, col)); 'Sorted cell string mismatch, cell '+CellNotation(MyWorksheet, row, col));
@ -421,7 +414,7 @@ begin
'Sorted cell number mismatch, cell '+CellNotation(MyWorksheet, row, col)); 'Sorted cell number mismatch, cell '+CellNotation(MyWorksheet, row, col));
row := 0; row := 0;
actualstring := MyWorksheet.ReadAsUTF8Text(row, col); actualstring := MyWorksheet.ReadAsText(row, col);
expectedString := char(ord('A') + round(expectedNumber) div 2); expectedString := char(ord('A') + round(expectedNumber) div 2);
CheckEquals(expectedstring, actualstring, CheckEquals(expectedstring, actualstring,
'Sorted cell string mismatch, cell '+CellNotation(MyWorksheet, row, col)); 'Sorted cell string mismatch, cell '+CellNotation(MyWorksheet, row, col));

View File

@ -111,7 +111,7 @@ begin
end; end;
for row := Length(SollNumbers) to worksheet.GetLastRowIndex do for row := Length(SollNumbers) to worksheet.GetLastRowIndex do
begin begin
s := worksheet.ReadAsUTF8Text(row, col); s := worksheet.ReadAsText(row, col);
CheckEquals(SollStrings[row - Length(SollNumbers)], s, CheckEquals(SollStrings[row - Length(SollNumbers)], s,
'Test string value mismatch, cell '+CellNotation(workSheet, row, col)); 'Test string value mismatch, cell '+CellNotation(workSheet, row, col));
end; end;

View File

@ -488,7 +488,8 @@ begin
begin begin
lCol := FWorksheet.FindCol(j); lCol := FWorksheet.FindCol(j);
if lCol <> nil then if lCol <> nil then
lColWidthStr := Format(' width="%.0fpt"', [lCol^.Width*FWorkbook.GetDefaultFontSize*0.5]); lColWidthStr := Format(' width="%.0fpt"',
[FWorkbook.ConvertUnits(lCol^.Width, FWorkbook.Units, suPoints)]);
end; end;
// Row height (to be considered in first column) // Row height (to be considered in first column)
@ -496,7 +497,8 @@ begin
begin begin
lRow := FWorksheet.FindRow(i); lRow := FWorksheet.FindRow(i);
if lRow <> nil then if lRow <> nil then
lRowHeightStr := Format(' height="%.0fpt"', [lRow^.Height*FWorkbook.GetDefaultFontSize]); lRowHeightStr := Format(' height="%.0fpt"',
[FWorkbook.ConvertUnits(lRow^.Height, FWorkbook.Units, suPoints)]);
end; end;
// Font // Font

View File

@ -363,10 +363,12 @@ begin
end; end;
procedure TsSpreadBIFF2Reader.ReadColWidth(AStream: TStream); procedure TsSpreadBIFF2Reader.ReadColWidth(AStream: TStream);
const
EPS = 1E-3;
var var
c, c1, c2: Cardinal; c, c1, c2: Cardinal;
w: Word; w: Word;
col: TCol; colwidth: Single;
begin begin
// read column start and end index of column range // read column start and end index of column range
c1 := AStream.ReadByte; c1 := AStream.ReadByte;
@ -374,22 +376,25 @@ begin
// read col width in 1/256 of the width of "0" character // read col width in 1/256 of the width of "0" character
w := WordLEToN(AStream.ReadWord); w := WordLEToN(AStream.ReadWord);
// calculate width in units of "characters" // calculate width in units of "characters"
col.Width := w / 256; colwidth := FWorkbook.ConvertUnits(w / 256, suChars, FWorkbook.Units);
// assign width to columns, but only if different from default column width. // assign width to columns, but only if different from default column width.
if not SameValue(col.Width, FWorksheet.DefaultColWidth) then if not SameValue(colwidth, FWorksheet.DefaultColWidth, EPS) then
for c := c1 to c2 do for c := c1 to c2 do
FWorksheet.WriteColInfo(c, col); FWorksheet.WriteColWidth(c, colwidth, FWorkbook.Units);
end; end;
procedure TsSpreadBIFF2Reader.ReadDefRowHeight(AStream: TStream); procedure TsSpreadBIFF2Reader.ReadDefRowHeight(AStream: TStream);
var var
hw: word; hw: word;
h : Single;
begin begin
hw := WordLEToN(AStream.ReadWord); hw := WordLEToN(AStream.ReadWord);
FWorksheet.DefaultRowHeight := FWorkbook.ConvertUnits(
TwipsToPts(hw and $8000), suPoints, FWorkbook.Units);
{
h := TwipsToPts(hw and $8000) / FWorkbook.GetDefaultFontSize; h := TwipsToPts(hw and $8000) / FWorkbook.GetDefaultFontSize;
if h > ROW_HEIGHT_CORRECTION then if h > ROW_HEIGHT_CORRECTION then
FWorksheet.DefaultRowHeight := h - ROW_HEIGHT_CORRECTION; FWorksheet.DefaultRowHeight := h - ROW_HEIGHT_CORRECTION;
}
end; end;
procedure TsSpreadBIFF2Reader.ReadFONT(AStream: TStream); procedure TsSpreadBIFF2Reader.ReadFONT(AStream: TStream);
@ -789,12 +794,16 @@ begin
begin begin
lRow := FWorksheet.GetRow(WordLEToN(rowrec.RowIndex)); lRow := FWorksheet.GetRow(WordLEToN(rowrec.RowIndex));
// Row height is encoded into the 15 remaining bits in units "twips" (1/20 pt) // Row height is encoded into the 15 remaining bits in units "twips" (1/20 pt)
lRow^.Height := FWorkbook.ConvertUnits(
TwipsToPts(h and $7FFF), suPoints, FWorkbook.Units);
{
// We need it in "lines" units. // We need it in "lines" units.
lRow^.Height := TwipsToPts(h and $7FFF) / Workbook.GetFont(0).Size; lRow^.Height := TwipsToPts(h and $7FFF) / Workbook.GetFont(0).Size;
if lRow^.Height > ROW_HEIGHT_CORRECTION then if lRow^.Height > ROW_HEIGHT_CORRECTION then
lRow^.Height := lRow^.Height - ROW_HEIGHT_CORRECTION lRow^.Height := lRow^.Height - ROW_HEIGHT_CORRECTION
else else
lRow^.Height := 0; lRow^.Height := 0;
}
end; end;
end; end;
@ -1227,7 +1236,7 @@ begin
{ Column width } { Column width }
{ calculate width to be in units of 1/256 of pixel width of character "0" } { calculate width to be in units of 1/256 of pixel width of character "0" }
w := round(ACol^.Width * 256); w := round(FWorkbook.ConvertUnits(ACol^.Width, FWorkbook.Units, suChars)*256);
rec.ColWidth := WordToLE(w); rec.ColWidth := WordToLE(w);
{ Write out } { Write out }
@ -1780,7 +1789,8 @@ begin
{ Default height for unused rows, in twips = 1/20 of a point { Default height for unused rows, in twips = 1/20 of a point
Bits 0-14: Default height for unused rows, in twips Bits 0-14: Default height for unused rows, in twips
Bit 15 = 1: Row height not changed manually } Bit 15 = 1: Row height not changed manually }
h := (AWorksheet.DefaultRowHeight + ROW_HEIGHT_CORRECTION) * FWorkbook.GetDefaultFontSize; h := FWorkbook.ConvertUnits(AWorksheet.DefaultRowHeight, FWorkbook.Units, suPoints);
// h := (AWorksheet.DefaultRowHeight + ROW_HEIGHT_CORRECTION) * FWorkbook.GetDefaultFontSize;
AStream.WriteWord(WordToLE(PtsToTwips(h))); AStream.WriteWord(WordToLE(PtsToTwips(h)));
end; end;
@ -1964,7 +1974,6 @@ var
containsXF: Boolean; containsXF: Boolean;
rowheight: Word; rowheight: Word;
w: Word; w: Word;
h: Single;
begin begin
if (ARowIndex >= FLimitations.MaxRowCount) or (AFirstColIndex >= FLimitations.MaxColCount) if (ARowIndex >= FLimitations.MaxRowCount) or (AFirstColIndex >= FLimitations.MaxColCount)
or (ALastColIndex >= FLimitations.MaxColCount) or (ALastColIndex >= FLimitations.MaxColCount)
@ -1988,14 +1997,17 @@ begin
AStream.WriteWord(WordToLE(Word(ALastColIndex) + 1)); AStream.WriteWord(WordToLE(Word(ALastColIndex) + 1));
{ Row height (in twips, 1/20 point) and info on custom row height } { Row height (in twips, 1/20 point) and info on custom row height }
h := Workbook.GetFont(0).Size;
if (ARow = nil) or (ARow^.Height = ASheet.DefaultRowHeight) then if (ARow = nil) or (ARow^.Height = ASheet.DefaultRowHeight) then
rowheight := PtsToTwips((ASheet.DefaultRowHeight + ROW_HEIGHT_CORRECTION) * h) rowheight := PtsToTwips(FWorkbook.ConvertUnits(
ASheet.DefaultRowHeight, FWorkbook.Units, suPoints))
// rowheight := PtsToTwips((ASheet.DefaultRowHeight + ROW_HEIGHT_CORRECTION) * h)
else else
if (ARow^.Height = 0) then if (ARow^.Height = 0) then
rowheight := 0 rowheight := 0
else else
rowheight := PtsToTwips((ARow^.Height + ROW_HEIGHT_CORRECTION) * h); rowheight := PtsToTwips(FWorkbook.ConvertUnits(
ARow^.Height, FWorkbook.Units, suPoints));
// rowheight := PtsToTwips((ARow^.Height + ROW_HEIGHT_CORRECTION) * h);
w := rowheight and $7FFF; w := rowheight and $7FFF;
AStream.WriteWord(WordToLE(w)); AStream.WriteWord(WordToLE(w));

View File

@ -691,8 +691,8 @@ var
begin begin
// read width in 1/256 of the width of "0" character // read width in 1/256 of the width of "0" character
w := WordLEToN(AStream.ReadWord); w := WordLEToN(AStream.ReadWord);
// calculate width in units of "characters" and use it as DefaultColWidth // calculate width in workbook units and use it as DefaultColWidth
ASheet.DefaultColWidth := w / 256; ASheet.DefaultColWidth := FWorkbook.ConvertUnits(w / 256, suChars, FWorkbook.Units);
end; end;
{ Reads a STRING record which contains the result of string formula. } { Reads a STRING record which contains the result of string formula. }
@ -1322,6 +1322,8 @@ procedure TsSpreadBIFF5Writer.WriteDefinedName(AStream: TStream;
var var
sheetIdx: Integer; sheetIdx: Integer;
begin begin
Unused(AIndexToREF);
sheetIdx := FWorkbook.GetWorksheetIndex(AWorksheet); sheetIdx := FWorkbook.GetWorksheetIndex(AWorksheet);
{ Token for tArea3dR } { Token for tArea3dR }

View File

@ -1399,7 +1399,7 @@ const
var var
c, c1, c2: Cardinal; c, c1, c2: Cardinal;
w: Word; w: Word;
col: TCol; colwidth: Double;
begin begin
// read column start and end index of column range // read column start and end index of column range
c1 := WordLEToN(AStream.ReadWord); c1 := WordLEToN(AStream.ReadWord);
@ -1407,11 +1407,11 @@ begin
// read col width in 1/256 of the width of "0" character // read col width in 1/256 of the width of "0" character
w := WordLEToN(AStream.ReadWord); w := WordLEToN(AStream.ReadWord);
// calculate width in units of "characters" // calculate width in units of "characters"
col.Width := w / 256; colwidth := FWorkbook.ConvertUnits(w / 256, suChars, FWorkbook.Units);
// assign width to columns, but only if different from default column width // assign width to columns, but only if different from default column width
if not SameValue(col.Width, FWorksheet.DefaultColWidth, EPS) then if not SameValue(colwidth, FWorksheet.DefaultColWidth, EPS) then
for c := c1 to c2 do for c := c1 to c2 do
FWorksheet.WriteColInfo(c, col); FWorksheet.WriteColWidth(c, colwidth, FWorkbook.Units);
end; end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
@ -1511,9 +1511,12 @@ end;
Reads the default column width Reads the default column width
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
procedure TsSpreadBIFFReader.ReadDefColWidth(AStream: TStream); procedure TsSpreadBIFFReader.ReadDefColWidth(AStream: TStream);
var
w: Word;
begin begin
// The file contains the column width in characters // The file contains the column width in characters
FWorksheet.DefaultColWidth := WordLEToN(AStream.ReadWord); w := WordLEToN(AStream.ReadWord);
FWorksheet.DefaultColWidth := FWorkbook.ConvertUnits(w, suChars, FWorkbook.Units);
end; end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
@ -1523,16 +1526,14 @@ end;
procedure TsSpreadBIFFReader.ReadDefRowHeight(AStream: TStream); procedure TsSpreadBIFFReader.ReadDefRowHeight(AStream: TStream);
var var
hw: Word; hw: Word;
h: Single;
begin begin
// Options // Options
AStream.ReadWord; AStream.ReadWord;
// Height, in Twips (1/20 pt). // Height, in Twips (1/20 pt).
hw := WordLEToN(AStream.ReadWord); hw := WordLEToN(AStream.ReadWord);
h := TwipsToPts(hw) / FWorkbook.GetDefaultFontSize; FWorksheet.DefaultRowHeight := FWorkbook.ConvertUnits(
if h > ROW_HEIGHT_CORRECTION then TwipsToPts(hw), suPoints, FWorkbook.Units);
FWorksheet.DefaultRowHeight := h - ROW_HEIGHT_CORRECTION;
end; end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
@ -2089,13 +2090,8 @@ begin
if rowrec.Flags and $00000040 <> 0 then begin if rowrec.Flags and $00000040 <> 0 then begin
lRow := FWorksheet.GetRow(WordLEToN(rowrec.RowIndex)); lRow := FWorksheet.GetRow(WordLEToN(rowrec.RowIndex));
// row height is encoded into the 15 lower bits in units "twips" (1/20 pt) // row height is encoded into the 15 lower bits in units "twips" (1/20 pt)
// we need it in "lines", i.e. we divide the points by the point size of the default font
h := WordLEToN(rowrec.Height) and $7FFF; h := WordLEToN(rowrec.Height) and $7FFF;
lRow^.Height := TwipsToPts(h) / FWorkbook.GetDefaultFontSize; lRow^.Height := FWorkbook.ConvertUnits(TwipsToPts(h), suPoints, FWorkbook.Units);
if lRow^.Height > ROW_HEIGHT_CORRECTION then
lRow^.Height := lRow^.Height - ROW_HEIGHT_CORRECTION
else
lRow^.Height := 0;
end; end;
end; end;
@ -3183,7 +3179,7 @@ begin
rec.EndCol := WordToLE(ACol^.Col); rec.EndCol := WordToLE(ACol^.Col);
{ calculate width to be in units of 1/256 of pixel width of character "0" } { calculate width to be in units of 1/256 of pixel width of character "0" }
w := round(ACol^.Width * 256); w := round(FWorkbook.ConvertUnits(ACol^.Width, FWorkbook.Units, suChars)*256);
rec.ColWidth := WordToLE(w); rec.ColWidth := WordToLE(w);
rec.XFIndex := WordToLE(15); // Index of XF record, not used rec.XFIndex := WordToLE(15); // Index of XF record, not used
@ -3309,13 +3305,16 @@ end;
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
procedure TsSpreadBIFFWriter.WriteDefaultColWidth(AStream: TStream; procedure TsSpreadBIFFWriter.WriteDefaultColWidth(AStream: TStream;
AWorksheet: TsWorksheet); AWorksheet: TsWorksheet);
var
colwidth: Single;
begin begin
{ BIFF record header } { BIFF record header }
WriteBIFFHeader(AStream, INT_EXCEL_ID_DEFCOLWIDTH, 2); WriteBIFFHeader(AStream, INT_EXCEL_ID_DEFCOLWIDTH, 2);
{ Column width in characters, using the width of the zero character { Column width in characters, using the width of the zero character
from default font (first FONT record in the file). } from default font (first FONT record in the file). }
AStream.WriteWord(round(FWorksheet.DefaultColWidth)); colwidth := FWorkbook.ConvertUnits(AWorksheet.DefaultColWidth, FWorkbook.Units, suChars);
AStream.WriteWord(round(colwidth));
end; end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
@ -3327,7 +3326,7 @@ end;
procedure TsSpreadBIFFWriter.WriteDefaultRowHeight(AStream: TStream; procedure TsSpreadBIFFWriter.WriteDefaultRowHeight(AStream: TStream;
AWorksheet: TsWorksheet); AWorksheet: TsWorksheet);
var var
h: Single; h: Double;
begin begin
{ BIFF record header } { BIFF record header }
WriteBIFFHeader(AStream, INT_EXCEL_ID_DEFROWHEIGHT, 4); WriteBIFFHeader(AStream, INT_EXCEL_ID_DEFROWHEIGHT, 4);
@ -3340,7 +3339,7 @@ begin
AStream.WriteWord(WordToLE($0001)); AStream.WriteWord(WordToLE($0001));
{ Default height for unused rows, in twips = 1/20 of a point } { Default height for unused rows, in twips = 1/20 of a point }
h := (AWorksheet.DefaultRowHeight + ROW_HEIGHT_CORRECTION) * FWorkbook.GetDefaultFontSize; h := FWorkbook.ConvertUnits(AWorksheet.DefaultRowHeight, FWorkbook.Units, suPoints);
AStream.WriteWord(WordToLE(PtsToTwips(h))); AStream.WriteWord(WordToLE(PtsToTwips(h)));
end; end;
@ -4243,7 +4242,6 @@ var
spaceabove, spacebelow: Boolean; spaceabove, spacebelow: Boolean;
colindex: Cardinal; colindex: Cardinal;
rowheight: Word; rowheight: Word;
h: Single;
fmt: PsCellFormat; fmt: PsCellFormat;
begin begin
if (ARowIndex >= FLimitations.MaxRowCount) or if (ARowIndex >= FLimitations.MaxRowCount) or
@ -4287,14 +4285,13 @@ begin
AStream.WriteWord(WordToLE(Word(ALastColIndex) + 1)); AStream.WriteWord(WordToLE(Word(ALastColIndex) + 1));
{ Row height (in twips, 1/20 point) and info on custom row height } { Row height (in twips, 1/20 point) and info on custom row height }
h := Workbook.GetFont(0).Size; // Point size of default font
if (ARow = nil) or (ARow^.Height = ASheet.DefaultRowHeight) then if (ARow = nil) or (ARow^.Height = ASheet.DefaultRowHeight) then
rowheight := PtsToTwips((ASheet.DefaultRowHeight + ROW_HEIGHT_CORRECTION) * h) rowheight := PtsToTwips(FWorkbook.ConvertUnits(ASheet.DefaultRowHeight, FWorkbook.Units, suPoints))
else else
if (ARow^.Height = 0) then if (ARow^.Height = 0) then
rowheight := 0 rowheight := 0
else else
rowheight := PtsToTwips((ARow^.Height + ROW_HEIGHT_CORRECTION)*h); rowheight := PtsToTwips(FWorkbook.ConvertUnits(ARow^.Height, FWorkbook.Units, suPoints));
w := rowheight and $7FFF; w := rowheight and $7FFF;
AStream.WriteWord(WordToLE(w)); AStream.WriteWord(WordToLE(w));

View File

@ -671,15 +671,9 @@ var
cell: PCell; cell: PCell;
rowheightStr: String; rowheightStr: String;
colwidthStr: String; colwidthStr: String;
defFnt: TsFont;
col: PCol; col: PCol;
row: PRow; row: PRow;
cw_fact, rh_fact: Double;
begin begin
defFnt := FWorkbook.GetDefaultFont;
cw_fact := defFnt.Size * 0.5; // ColWidthFactor = Approx width of "0" character in pts
rh_fact := defFnt.Size; // RowHeightFactor = Height of a single line
r1 := 0; r1 := 0;
c1 := 0; c1 := 0;
r2 := AWorksheet.GetLastRowIndex; r2 := AWorksheet.GetLastRowIndex;
@ -691,8 +685,8 @@ begin
'ss:DefaultRowHeight="%.2f">' + LF, 'ss:DefaultRowHeight="%.2f">' + LF,
[ [
AWorksheet.GetLastColIndex + 1, AWorksheet.GetLastRowIndex + 1, AWorksheet.GetLastColIndex + 1, AWorksheet.GetLastRowIndex + 1,
FWorksheet.DefaultColWidth * cw_fact, FWorkbook.ConvertUnits(AWorksheet.DefaultColWidth, FWorkbook.Units, suPoints),
(FWorksheet.DefaultRowHeight + ROW_HEIGHT_CORRECTION) * rh_fact FWorkbook.ConvertUnits(AWorksheet.DefaultRowHeight, FWorkbook.Units, suPoints)
], ],
FPointSeparatorSettings FPointSeparatorSettings
)); ));
@ -700,11 +694,10 @@ begin
for c := c1 to c2 do for c := c1 to c2 do
begin begin
col := FWorksheet.FindCol(c); col := FWorksheet.FindCol(c);
// column width in the worksheet is in multiples of the "0" character width. // column width is needed in pts.
// In the xml file, it is needed in pts.
if Assigned(col) then if Assigned(col) then
colwidthStr := Format(' ss:Width="%0.2f"', colwidthStr := Format(' ss:Width="%0.2f"',
[col^.Width * cw_fact], [FWorkbook.ConvertUnits(col^.Width, FWorkbook.Units, suPoints)],
FPointSeparatorSettings) FPointSeparatorSettings)
else else
colwidthStr := ''; colwidthStr := '';
@ -715,11 +708,10 @@ begin
for r := r1 to r2 do for r := r1 to r2 do
begin begin
row := FWorksheet.FindRow(r); row := FWorksheet.FindRow(r);
// Row height in the worksheet is in multiples of the default font height // Row height is needed in pts.
// In the xml file, it is needed in pts.
if Assigned(row) then if Assigned(row) then
rowheightStr := Format(' ss:Height="%.2f"', rowheightStr := Format(' ss:Height="%.2f"',
[(row^.Height + ROW_HEIGHT_CORRECTION) * rh_fact], [FWorkbook.ConvertUnits(row^.Height, FWorkbook.Units, suPoints)],
FPointSeparatorSettings FPointSeparatorSettings
) )
else else

View File

@ -982,7 +982,7 @@ end;
procedure TsSpreadOOXMLReader.ReadCols(ANode: TDOMNode; AWorksheet: TsWorksheet); procedure TsSpreadOOXMLReader.ReadCols(ANode: TDOMNode; AWorksheet: TsWorksheet);
const const
EPS = 1e-2; EPS = 1e-3;
var var
colNode: TDOMNode; colNode: TDOMNode;
col, col1, col2: Cardinal; col, col1, col2: Cardinal;
@ -1008,7 +1008,7 @@ begin
if (s <> '') and TryStrToFloat(s, w, FPointSeparatorSettings) then if (s <> '') and TryStrToFloat(s, w, FPointSeparatorSettings) then
if not SameValue(w, AWorksheet.DefaultColWidth, EPS) then if not SameValue(w, AWorksheet.DefaultColWidth, EPS) then
for col := col1 to col2 do for col := col1 to col2 do
AWorksheet.WriteColWidth(col, w); AWorksheet.WriteColWidth(col, w, suChars);
end; end;
end; end;
colNode := colNode.NextSibling; colNode := colNode.NextSibling;
@ -1719,7 +1719,6 @@ var
s: String; s: String;
ht: Single; ht: Single;
r: Cardinal; r: Cardinal;
row: PRow;
begin begin
if ANode = nil then if ANode = nil then
exit; exit;
@ -1729,12 +1728,7 @@ begin
r := StrToInt(s) - 1; r := StrToInt(s) - 1;
s := GetAttrValue(ANode, 'ht'); s := GetAttrValue(ANode, 'ht');
ht := StrToFloat(s, FPointSeparatorSettings); // seems to be in "Points" ht := StrToFloat(s, FPointSeparatorSettings); // seems to be in "Points"
row := AWorksheet.GetRow(r); AWorksheet.WriteRowHeight(r, ht, suPoints);
row^.Height := ht / FWorkbook.GetDefaultFontSize;
if row^.Height > ROW_HEIGHT_CORRECTION then
row^.Height := row^.Height - ROW_HEIGHT_CORRECTION
else
row^.Height := 0;
end; end;
end; end;
@ -1808,7 +1802,7 @@ end;
procedure TsSpreadOOXMLReader.ReadSheetFormatPr(ANode: TDOMNode; procedure TsSpreadOOXMLReader.ReadSheetFormatPr(ANode: TDOMNode;
AWorksheet: TsWorksheet); AWorksheet: TsWorksheet);
var var
w, h: Single; w, h: Double;
s: String; s: String;
begin begin
if ANode = nil then if ANode = nil then
@ -1816,16 +1810,11 @@ begin
s := GetAttrValue(ANode, 'defaultColWidth'); // is in characters s := GetAttrValue(ANode, 'defaultColWidth'); // is in characters
if (s <> '') and TryStrToFloat(s, w, FPointSeparatorSettings) then if (s <> '') and TryStrToFloat(s, w, FPointSeparatorSettings) then
AWorksheet.DefaultColWidth := w; AWorksheet.DefaultColWidth := FWorkbook.ConvertUnits(w, suChars, FWorkbook.Units);
s := GetAttrValue(ANode, 'defaultRowHeight'); // in in points s := GetAttrValue(ANode, 'defaultRowHeight'); // is in points
if (s <> '') and TryStrToFloat(s, h, FPointSeparatorSettings) then begin if (s <> '') and TryStrToFloat(s, h, FPointSeparatorSettings) then //begin
h := h / Workbook.GetDefaultFontSize; AWorksheet.DefaultRowHeight := FWorkbook.ConvertUnits(h, suPoints, FWorkbook.Units);
if h > ROW_HEIGHT_CORRECTION then begin
h := h - ROW_HEIGHT_CORRECTION;
AWorksheet.DefaultRowHeight := h;
end;
end;
end; end;
procedure TsSpreadOOXMLReader.ReadSheetList(ANode: TDOMNode; AList: TStrings); procedure TsSpreadOOXMLReader.ReadSheetList(ANode: TDOMNode; AList: TStrings);
@ -2474,22 +2463,17 @@ var
c: Integer; c: Integer;
w: Single; w: Single;
begin begin
{
if AWorksheet.Cols.Count = 0 then
exit;
}
AppendToStream(AStream, AppendToStream(AStream,
'<cols>'); '<cols>');
for c:=0 to AWorksheet.GetLastColIndex do begin for c:=0 to AWorksheet.GetLastColIndex do begin
col := AWorksheet.FindCol(c); col := AWorksheet.FindCol(c);
if col <> nil then if col <> nil then
w := col^.Width w := FWorkbook.ConvertUnits(col^.Width, FWorkbook.Units, suChars)
else else
w := AWorksheet.DefaultColWidth; w := FWorkbook.ConvertUnits(AWorksheet.DefaultColWidth, FWorkbook.Units, suChars);
AppendToStream(AStream, Format( AppendToStream(AStream, Format(
'<col min="%d" max="%d" width="%g" customWidth="1" />', '<col min="%d" max="%d" width="%.2f" customWidth="1" />',
[c+1, c+1, w], FPointSeparatorSettings) [c+1, c+1, w], FPointSeparatorSettings)
); );
end; end;
@ -2910,10 +2894,7 @@ var
styleCell: PCell; styleCell: PCell;
cell: PCell; cell: PCell;
rh: String; rh: String;
h0: Single;
begin begin
h0 := Workbook.GetDefaultFontSize; // Point size of default font
AppendToStream(AStream, AppendToStream(AStream,
'<sheetData>'); '<sheetData>');
@ -2924,8 +2905,8 @@ begin
for r := 0 to r2 do begin for r := 0 to r2 do begin
row := AWorksheet.FindRow(r); row := AWorksheet.FindRow(r);
if row <> nil then if row <> nil then
rh := Format(' ht="%g" customHeight="1"', [ rh := Format(' ht="%.2f" customHeight="1"',
(row^.Height + ROW_HEIGHT_CORRECTION)*h0], [FWorkbook.ConvertUnits(row^.Height, FWorkbook.Units, suPoints)],
FPointSeparatorSettings) FPointSeparatorSettings)
else else
rh := ''; rh := '';
@ -2981,14 +2962,15 @@ begin
// If the row has a custom height add this value to the <row> specification // If the row has a custom height add this value to the <row> specification
row := AWorksheet.FindRow(r); row := AWorksheet.FindRow(r);
if row <> nil then if row <> nil then
rh := Format(' ht="%g" customHeight="1"', [ rh := Format(' ht="%.2f" customHeight="1"',
(row^.Height + ROW_HEIGHT_CORRECTION)*h0], FPointSeparatorSettings) [FWorkbook.ConvertUnits(row^.Height, FWorkbook.Units, suPoints)],
FPointSeparatorSettings)
else else
rh := ''; rh := '';
AppendToStream(AStream, Format( AppendToStream(AStream, Format(
'<row r="%d" spans="%d:%d"%s>', [r+1, c1+1, c2+1, rh])); '<row r="%d" spans="%d:%d"%s>', [r+1, c1+1, c2+1, rh]));
// Write cells belonging to this row.
// Write cells belonging to this row.
{ // Strange: the RowEnumerator is very slow here... ?! { // Strange: the RowEnumerator is very slow here... ?!
for cell in AWorksheet.Cells.GetRowEnumerator(r) do for cell in AWorksheet.Cells.GetRowEnumerator(r) do
WriteCellToStream(AStream, cell); WriteCellToStream(AStream, cell);
@ -3013,10 +2995,11 @@ procedure TsSpreadOOXMLWriter.WriteSheetFormatPr(AStream: TStream;
var var
w, h: Single; w, h: Single;
begin begin
w := AWorksheet.DefaultColWidth; // Excel has column width in characters, and row heights in pts.
h := (AWorksheet.DefaultRowHeight + ROW_HEIGHT_CORRECTION) * Workbook.GetDefaultFontSize; w := FWorkbook.ConvertUnits(AWorksheet.DefaultColWidth, FWorkbook.Units, suChars);
h := FWorkbook.ConvertUnits(AWorksheet.DefaultRowHeight, FWorkbook.Units, suPoints);
AppendToStream(AStream, Format( AppendToStream(AStream, Format(
'<sheetFormatPr baseColWidth="%g" defaultRowHeight="%g" customHeight="true" />', '<sheetFormatPr baseColWidth="%.2f" defaultRowHeight="%.2f" customHeight="true" />',
[w, h], [w, h],
FPointSeparatorSettings)); FPointSeparatorSettings));
end; end;