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"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="main"/>
</Unit1>
</Units>
</ProjectOptions>

View File

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

View File

@ -127,6 +127,7 @@ var
i: Integer;
startDate: TDate;
maxAge: Integer = 80 * 365;
f: TField;
begin
if FExportDataset <> nil then
FExportDataset.Free;
@ -137,7 +138,7 @@ begin
FExportDataset := TDbf.Create(self);
FExportDataset.FilePathFull := DATADIR + DirectorySeparator;
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.FieldDefs.Add('Last 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
// defined in the FIRST_NAMES, LAST_NAMES and CITIES arrays. We also add a
// random birthday.
for i:=1 to StrToInt(EdRecordCount.Text) do begin
if (i mod 1000 = 0) then
begin
@ -165,8 +167,8 @@ begin
FExportDataset.FieldByName('City').AsString := CITIES[Random(NUM_CITIES)];
FExportDataset.FieldByName('Birthday').AsDateTime := startDate - random(maxAge);
FExportDataset.FieldByName('Salary').AsFloat := 1000+Random(9000);
FExportDataSet.FieldByName('Work begin').AsDateTime := 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 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.Post;
end;
FExportDataset.Close;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -41,7 +41,7 @@ begin
// Write colors to worksheet
for row := 0 to palette.Count-1 do begin
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.WriteHorAlignment(row, 0, haCenter);
end;
@ -49,7 +49,7 @@ begin
palette.Free;
end;
MyWorksheet.WriteColWidth(0, 25);
MyWorksheet.WriteColWidth(0, 5.0, suCentimeters);
// Save the spreadsheet to a file
MyWorkbook.WriteToFile(MyDir + TestFile, sfExcel8, True);

View File

@ -26,69 +26,69 @@ begin
MyWorksheet := MyWorkbook.AddWorksheet('Worksheet1');
// 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^.Border := [];
MyWorksheet.WriteUTF8Text(1, 3, '[N]');// D2
MyWorksheet.WriteText(1, 3, '[N]'); // D2
MyCell := MyWorksheet.GetCell(1, 3);
MyCell^.Border := [cbNorth];
MyWorksheet.WriteUTF8Text(1, 5, '[W]');// F2
MyWorksheet.WriteText(1, 5, '[W]'); // F2
MyCell := MyWorksheet.GetCell(1, 5);
MyCell^.Border := [cbWest];
MyWorksheet.WriteUTF8Text(1, 7, '[E]');// H2
MyWorksheet.WriteText(1, 7, '[E]'); // H2
MyCell := MyWorksheet.GetCell(1, 7);
MyCell^.Border := [cbEast];
MyWorksheet.WriteUTF8Text(1, 9, '[S]');// J2
MyWorksheet.WriteText(1, 9, '[S]'); // J2
MyCell := MyWorksheet.GetCell(1, 9);
MyCell^.Border := [cbSouth];
MyWorksheet.WriteUTF8Text(3, 1, '[N,W]');// B4
MyWorksheet.WriteText(3, 1, '[N,W]'); // B4
MyCell := MyWorksheet.GetCell(3, 1);
MyCell^.Border := [cbNorth, cbWest];
MyWorksheet.WriteUTF8Text(3, 3, '[N,E]');// D4
MyWorksheet.WriteText(3, 3, '[N,E]'); // D4
MyCell := MyWorksheet.GetCell(3, 3);
MyCell^.Border := [cbNorth, cbEast];
MyWorksheet.WriteUTF8Text(3, 5, '[N,S]');// F4
MyWorksheet.WriteText(3, 5, '[N,S]'); // F4
MyCell := MyWorksheet.GetCell(3, 5);
MyCell^.Border := [cbNorth, cbSouth];
MyWorksheet.WriteUTF8Text(3, 7, '[W,E]');// H4
MyWorksheet.WriteText(3, 7, '[W,E]'); // H4
MyCell := MyWorksheet.GetCell(3, 7);
MyCell^.Border := [cbWest, cbEast];
MyWorksheet.WriteUTF8Text(3, 9, '[W,S]');// J4
MyWorksheet.WriteText(3, 9, '[W,S]'); // J4
MyCell := MyWorksheet.GetCell(3, 9);
MyCell^.Border := [cbWest, cbSouth];
MyWorksheet.WriteUTF8Text(3, 11, '[E,S]');// L4
MyWorksheet.WriteText(3, 11, '[E,S]'); // L4
MyCell := MyWorksheet.GetCell(3, 11);
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^.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^.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^.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^.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^.Border := [cbNorth, cbWest, cbEast, cbSouth];
MyCell^.BackgroundColor := scGreen;
@ -102,36 +102,36 @@ begin
// Line 1
MyWorksheet.WriteUTF8Text(1, 1, 'Relatório');
MyWorksheet.WriteText(1, 1, 'Relatório');
MyCell := MyWorksheet.GetCell(1, 1);
MyCell^.Border := [cbNorth, cbWest, cbSouth];
MyCell^.BackgroundColor := scGrey20pct;
MyWorksheet.WriteUTF8Text(1, 2, ' ');
MyWorksheet.WriteText(1, 2, ' ');
MyCell := MyWorksheet.GetCell(1, 2);
MyCell^.Border := [cbNorth, cbEast, cbSouth];
MyCell^.BackgroundColor := scGrey20pct;
// Line 2
MyWorksheet.WriteUTF8Text(2, 1, 'Compras');
MyWorksheet.WriteText(2, 1, 'Compras');
MyCell := MyWorksheet.GetCell(2, 1);
MyCell^.Border := [cbWest];
MyCell^.BackgroundColor := scGrey10pct;
MyWorksheet.WriteUTF8Text(2, 2, 'R$ 20');
MyWorksheet.WriteText(2, 2, 'R$ 20');
MyCell := MyWorksheet.GetCell(2, 2);
MyCell^.Border := [cbEast];
MyCell^.BackgroundColor := scGrey10pct;
// Line 3
MyWorksheet.WriteUTF8Text(3, 1, 'Total:');
MyWorksheet.WriteText(3, 1, 'Total:');
MyCell := MyWorksheet.GetCell(3, 1);
MyCell^.Border := [cbWest, cbSouth];
MyCell^.BackgroundColor := scGrey10pct;
MyWorksheet.WriteUTF8Text(3, 2, 'R$ 20');
MyWorksheet.WriteText(3, 2, 'R$ 20');
MyCell := MyWorksheet.GetCell(3, 2);
MyCell^.Border := [cbEast, cbSouth];
MyCell^.BackgroundColor := scGrey10pct;

View File

@ -29,17 +29,17 @@ begin
MyWorksheet := MyWorkbook.AddWorksheet('Worksheet1');
// Write some cells
MyWorksheet.WriteUTF8Text(0, 1, 'Text Formula');// B1
MyWorksheet.WriteUTF8Text(0, 2, 'RPN');// C1
MyWorksheet.WriteText(0, 1, 'Text Formula');// B1
MyWorksheet.WriteText(0, 2, 'RPN'); // C1
MyWorksheet.WriteNumber(0, 4, -3.14); // E1
MyWorksheet.WriteNumber(1, 4, 100); // E2
MyWorksheet.WriteNumber(2, 4, 200); // E3
Myworksheet.WriteNumber(3, 4, 300); // E4
MyWorksheet.WriteNumber(4, 4, 250); // E5
MyWorksheet.WriteNumber(0, 4, -3.14); // E1
MyWorksheet.WriteNumber(1, 4, 100); // E2
MyWorksheet.WriteNumber(2, 4, 200); // E3
Myworksheet.WriteNumber(3, 4, 300); // E4
MyWorksheet.WriteNumber(4, 4, 250); // E5
// =Sum(E2:E5)
MyWorksheet.WriteUTF8Text(1, 0, '=Sum(E2:E5)'); // A2
MyWorksheet.WriteText(1, 0, '=Sum(E2:E5)'); // A2
MyFormula := '=Sum(E2:E5)';
MyWorksheet.WriteFormula(1, 1, MyFormula); // B2
MyWorksheet.WriteRPNFormula(1, 2, CreateRPNFormula( // C2
@ -48,7 +48,7 @@ begin
nil))));
// 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.WriteRPNFormula(2, 2, CreateRPNFormula( // C3
RPNCellValue('E1',
@ -56,7 +56,7 @@ begin
nil))));
// 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.WriteRPNFormula(3, 2, CreateRPNFormula( //C4
RPNNumber(4.0,
@ -73,7 +73,7 @@ begin
// Line 1
MyWorksheet.WriteUTF8Text(1, 1, 'Relatório');
MyWorksheet.WriteText(1, 1, 'Relatório');
MyCell := MyWorksheet.GetCell(1, 1);
MyWorksheet.WriteBorders(MyCell, [cbNorth, cbWest, cbSouth]);
Myworksheet.WriteBackgroundColor(MyCell, scGray20pct);

View File

@ -10,8 +10,7 @@ var
MyWorkbook: TsWorkbook;
MyWorksheet: TsWorksheet;
MyDir: string;
cell: PCell;
i, r, c: Integer;
i: Integer;
const
image1 = '../../images/components/TSWORKBOOKSOURCE.png';
@ -25,7 +24,11 @@ begin
MyWorkbook := TsWorkbook.Create;
try
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'); //
// 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

View File

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

View File

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

View File

@ -47,7 +47,7 @@ begin
for CurCell in MyWorksheet.Cells do
begin
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
Write(' (Formula ', CurCell^.FormulaValue, ')');
@ -58,5 +58,11 @@ begin
// Finalization
MyWorkbook.Free;
end;
{$ifdef Windows}
WriteLn;
WriteLn('Press ENTER to quit...');
ReadLn;
{$endif}
end.

View File

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

View File

@ -46,7 +46,7 @@ begin
begin
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
Write(' - Formula: ', CurCell^.FormulaValue);
WriteLn;
@ -56,5 +56,11 @@ begin
// Finalization
MyWorkbook.Free;
end;
{$ifdef Windows}
WriteLn;
WriteLn('Press ENTER to quit...');
Readln;
{$endif}
end.

View File

@ -48,10 +48,10 @@ begin
MyWorkbook.AddFont('Calibri', 20, [], scRed);
// 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
MyWorksheet.WriteColWidth(0, 40);
MyWorksheet.WriteColWidth(0, 40); // characters
MyWorksheet.WriteColWidth(1, 20);
MyWorksheet.WriteColWidth(2, 20);
MyWorksheet.WriteColWidth(3, 15);
@ -61,12 +61,11 @@ begin
MyWorksheet.WriteNumber(0, 0, 1.0);// A1
MyWorksheet.WriteVertAlignment(0, 0, vaCenter);
MyWorksheet.WriteNumber(0, 1, 2.0);// B1
MyWorksheet.WriteNumber(0, 2, 3.0);// C1
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.WriteFontColor(4, 2, scRed);
MyWorksheet.WriteBackgroundColor(4, 2, scSilver);
@ -74,35 +73,35 @@ begin
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.WriteHorAlignment(4, 4, haCenter);
MyWorksheet.WriteUTF8Text(4, 5, 'Stacked text');
MyWorksheet.WriteText(4, 5, 'Stacked text');
MyWorksheet.WriteTextRotation(4, 5, rtStacked);
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.WriteUTF8Text(4, 7, 'CCW-rotated text');
MyWorksheet.WriteText(4, 7, 'CCW-rotated text');
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.WriteVertAlignment(4, 8, vaTop);
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.WriteVertAlignment(4, 9, vaTop);
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.WriteVertAlignment(4, 10, vaCenter);
MyWorksheet.WriteUTF8Text(4, 11, 'CCW-rotated text');
MyWorksheet.WriteText(4, 11, 'CCW-rotated text');
MyWorksheet.WriteTextRotation(4, 11, rt90DegreeCounterClockwiseRotation);
MyWorksheet.WriteVertAlignment(4, 11, vaCenter);
@ -170,133 +169,134 @@ begin
r := 10;
// Write current date/time to cells B11:B16
MyWorksheet.WriteUTF8Text(r, 0, 'nfShortDate');
MyWorksheet.WriteText(r, 0, 'nfShortDate');
MyWorksheet.WriteDateTime(r, 1, now, nfShortDate);
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfLongDate');
MyWorksheet.WriteText(r, 0, 'nfLongDate');
MyWorksheet.WriteDateTime(r, 1, now, nfLongDate);
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfShortTime');
MyWorksheet.WriteText(r, 0, 'nfShortTime');
MyWorksheet.WriteDateTime(r, 1, now, nfShortTime);
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfLongTime');
MyWorksheet.WriteText(r, 0, 'nfLongTime');
MyWorksheet.WriteDateTime(r, 1, now, nfLongTime);
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfShortDateTime');
MyWorksheet.WriteText(r, 0, 'nfShortDateTime');
MyWorksheet.WriteDateTime(r, 1, now, nfShortDateTime);
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, dd/mmm');
MyWorksheet.WriteText(r, 0, 'nfCustom, dd/mmm');
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'dd/mmm');
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, mmm/yy');
MyWorksheet.WriteText(r, 0, 'nfCustom, mmm/yy');
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'mmm/yy');
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfShortTimeAM');
MyWorksheet.WriteText(r, 0, 'nfShortTimeAM');
MyWorksheet.WriteDateTime(r, 1, now, nfShortTimeAM);
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfLongTimeAM');
MyWorksheet.WriteText(r, 0, 'nfLongTimeAM');
MyWorksheet.WriteDateTime(r, 1, now, nfLongTimeAM);
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, nn:ss');
MyWorksheet.WriteText(r, 0, 'nfCustom, nn:ss');
MyWorksheet.WriteDateTime(r, 1, now, nfCustom, 'nn:ss');
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');
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');
// Write formatted numbers
number := 12345.67890123456789;
inc(r, 2);
MyWorksheet.WriteUTF8Text(r, 1, '12345.67890123456789');
MyWorksheet.WriteUTF8Text(r, 2, '-12345.67890123456789');
MyWorksheet.WriteText(r, 1, '12345.67890123456789');
MyWorksheet.WriteText(r, 2, '-12345.67890123456789');
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfGeneral');
MyWorksheet.WriteText(r, 0, 'nfGeneral');
MyWorksheet.WriteNumber(r, 1, number, nfGeneral);
MyWorksheet.WriteNumber(r, 2, -number, nfGeneral);
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixed, 0 decs');
MyWorksheet.WriteText(r, 0, 'nfFixed, 0 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixed, 0);
MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 0);
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFixed, 1 decs');
MyWorksheet.WriteText(r, 0, 'nfFixed, 1 decs');
MyWorksheet.WriteNumber(r, 1, number, nfFixed, 1);
MyWorksheet.WriteNumber(r, 2, -number, nfFixed, 1);
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, 2, -number, nfFixed, 2);
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, 2, -number, nfFixed, 3);
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, 2, -number, nfFixedTh, 0);
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, 2, -number, nfFixedTh, 1);
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, 2, -number, nfFixedTh, 2);
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, 2, -number, nfFixedTh, 3);
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, 2, -number, nfExp, 1);
MyWorksheet.WriteNumber(r, 3, 1.0/number, nfExp, 1);
MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 1);
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, 2, -number, nfExp, 2);
MyWorksheet.WriteNumber(r, 3, 1.0/number, nfExp, 2);
MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 2);
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfExp, 3 decs');
MyWorksheet.WriteText(r, 0, 'nfExp, 3 decs');
MyWorksheet.WriteNumber(r, 1, number, nfExp, 3);
MyWorksheet.WriteNumber(r, 2, -number, nfExp, 3);
MyWorksheet.WriteNumber(r, 3, 1.0/number, nfExp, 3);
MyWorksheet.WriteNumber(r, 4, -1.0/number, nfExp, 3);
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, 2, -number, nfCurrency, 0, 'USD');
MyWorksheet.WriteCurrency(r, 3, 0.0, nfCurrency, 0, 'USD');
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, 2, -number, nfCurrencyRed, 0, 'USD');
MyWorksheet.WriteCurrency(r, 3, 0.0, nfCurrencyRed, 0, 'USD');
inc(r, 2);
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, "$"#,##0_);("$"#,##0)');
MyWorksheet.WriteText(r, 0, 'nfCustom, "$"#,##0_);("$"#,##0)');
MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '"$"#,##0_);("$"#,##0)');
MyWorksheet.WriteNumber(r, 2, -number);
MyWorksheet.WriteNumberFormat(r, 2, nfCustom, '"$"#,##0_);("$"#,##0)');
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.WriteNumberFormat(r, 1, nfCustom, '"$"#,##0.0_);[Red]("$"#,##0.0)');
MyWorksheet.WriteNumber(r, 2, -number);
MyWorksheet.WriteNumberFormat(r, 2, nfCustom, '"$"#,##0.0_);[Red]("$"#,##0.0)');
inc(r);
fmt := '"€"#,##0.0_);[Red]("€"#,##0.0)';
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, '+fmt);
MyWorksheet.WriteText(r, 0, 'nfCustom, '+fmt);
MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, UTF8ToAnsi(fmt));
MyWorksheet.WriteNumber(r, 2, -number);
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';
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, '+fmt);
MyWorksheet.WriteNumber(r, 1, number);
@ -304,46 +304,46 @@ begin
MyWorksheet.WriteNumber(r, 2, -number);
MyWorksheet.WriteNumberFormat(r, 2, nfCustom, UTF8ToAnsi(fmt));
inc(r); }
MyWorksheet.WriteUTF8Text(r, 0, 'nfCustom, _("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)');
MyWorksheet.WriteText(r, 0, 'nfCustom, _("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)');
MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteNumberFormat(r, 1, nfCustom, '_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)');
MyWorksheet.WriteNumber(r, 2, -number);
MyWorksheet.WriteNumberFormat(r, 2, nfCustom, '_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)');
inc(r, 2);
number := 1.333333333;
MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 0 decs');
MyWorksheet.WriteText(r, 0, 'nfPercentage, 0 decs');
MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 0);
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 1 decs');
MyWorksheet.WriteText(r, 0, 'nfPercentage, 1 decs');
MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 1);
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 2 decs');
MyWorksheet.WriteText(r, 0, 'nfPercentage, 2 decs');
MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 2);
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfPercentage, 3 decs');
MyWorksheet.WriteText(r, 0, 'nfPercentage, 3 decs');
MyWorksheet.WriteNumber(r, 1, number, nfPercentage, 3);
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, hh:mm:ss');
MyWorksheet.WriteText(r, 0, 'nfTimeInterval, hh:mm:ss');
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval);
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');
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, hh:mm');
MyWorksheet.WriteText(r, 0, 'nfTimeInterval, hh:mm');
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'hh:mm');
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, h:m');
MyWorksheet.WriteText(r, 0, 'nfTimeInterval, h:m');
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'h:m');
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfTimeInterval, h');
MyWorksheet.WriteText(r, 0, 'nfTimeInterval, h');
MyWorksheet.WriteDateTime(r, 1, number, nfTimeInterval, 'h');
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFraction, ??/??');
MyWorksheet.WriteText(r, 0, 'nfFraction, ??/??');
MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteFractionFormat(r, 1, false, 2, 2);
inc(r);
MyWorksheet.WriteUTF8Text(r, 0, 'nfFraction, # ??/??');
MyWorksheet.WriteText(r, 0, 'nfFraction, # ??/??');
MyWorksheet.WriteNumber(r, 1, number);
MyWorksheet.WriteFractionFormat(r, 1, true, 2, 2);
@ -353,10 +353,10 @@ begin
MyWorksheet := MyWorkbook.AddWorksheet(Str_Worksheet2);
// Write some string cells
MyWorksheet.WriteUTF8Text(0, 0, Str_First);
MyWorksheet.WriteUTF8Text(0, 1, Str_Second);
MyWorksheet.WriteUTF8Text(0, 2, Str_Third);
MyWorksheet.WriteUTF8Text(0, 3, Str_Fourth);
MyWorksheet.WriteText(0, 0, Str_First);
MyWorksheet.WriteText(0, 1, Str_Second);
MyWorksheet.WriteText(0, 2, Str_Third);
MyWorksheet.WriteText(0, 3, Str_Fourth);
// Creates a new worksheet
MyWorksheet := MyWorkbook.AddWorksheet('Colors');
@ -366,7 +366,7 @@ begin
for i:=0 to palette.Count-1 do begin
MyWorksheet.WriteBlank(i, 0);
Myworksheet.WriteBackgroundColor(i, 0, palette[i]);
MyWorksheet.WriteUTF8Text(i, 1, GetColorName(palette[i]));
MyWorksheet.WriteText(i, 1, GetColorName(palette[i]));
end;
finally
palette.Free;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -37,28 +37,28 @@ begin
try
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#''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.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.WriteUTF8Text(3, 0, 'Web-Hyperlink');
sheet.WriteText(3, 0, 'Web-Hyperlink');
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'));
// 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.
sheet.WriteUTF8Text(5, 0, 'Jump to A10');
sheet.WriteText(5, 0, 'Jump to A10');
sheet.WriteHyperlink(5, 0, '#A10');
sheet.WriteColWidth(0, 40);
sheet.WriteColWidth(0, 40, suChars);
srcWorkbook.WriteToFile(srcFile, true);
finally
@ -124,7 +124,6 @@ begin
WriteLn('Failure finding linked worksheet.');
continue;
end;
// linkedSheet := linkedWorkbook.GetWorksheetByName(bookmark);
// Copy linked worksheet to new sheet in destination workbook
destSheet := destWorkbook.CopyWorksheetFrom(linkedSheet);
// Create sheet name
@ -152,8 +151,11 @@ begin
end else
WriteLn('No hyperlinks found.');
{$IFDEF Windows}
WriteLn;
WriteLn('Press ENTER to close...');
ReadLn;
{$ENDIF}
finally
// Clean up

View File

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

View File

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

View File

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

View File

@ -43,7 +43,7 @@ begin
MyWorksheet.WriteNumber(0, 1, 2.0); // B1
MyWorksheet.WriteNumber(0, 2, 3.0); // C1
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.WriteDateTime(5, 0, now);
@ -52,9 +52,9 @@ begin
MyWorksheet.WriteFont(0, 1, 'Times New Roman', 16, [], scRed);
// Show number formats
MyWorksheet.WriteUTF8Text(row, 0, 'Number formats:');
MyWorksheet.WriteText(row, 0, 'Number formats:');
inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfGeneral');
MyWorksheet.WriteText(row, 0, 'nfGeneral');
MyWorksheet.WriteNumber(row, 1, number1, nfGeneral);
MyWorksheet.WriteNumber(row, 2, number2, nfGeneral);
MyWorksheet.WriteNumber(row, 3, number3, nfGeneral);
@ -64,7 +64,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfGeneral);
MyWorksheet.WriteNumber(row, 8, number8, nfGeneral);
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, 2, number2, nfFixed, 0);
MyWorksheet.WriteNumber(row, 3, number3, nfFixed, 0);
@ -74,7 +74,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfFixed, 0);
MyWorksheet.WriteNumber(row, 8, number8, nfFixed, 0);
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, 2, number2, nfFixed, 2);
MyWorksheet.WriteNumber(row, 3, number3, nfFixed, 2);
@ -84,7 +84,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfFixed, 2);
MyWorksheet.WriteNumber(row, 8, number8, nfFixed, 2);
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, 2, number2, nfFixed, 3);
MyWorksheet.WriteNumber(row, 3, number3, nfFixed, 3);
@ -94,7 +94,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfFixed, 3);
MyWorksheet.WriteNumber(row, 8, number8, nfFixed, 3);
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, 2, number2, nfFixedTh, 0);
MyWorksheet.WriteNumber(row, 3, number3, nfFixedTh, 0);
@ -104,7 +104,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfFixedTh, 0);
MyWorksheet.WriteNumber(row, 8, number8, nfFixedTh, 0);
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, 2, number2, nfFixedTh, 2);
MyWorksheet.WriteNumber(row, 3, number3, nfFixedTh, 2);
@ -114,7 +114,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfFixedTh, 2);
MyWorksheet.WriteNumber(row, 8, number8, nfFixedTh, 2);
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, 2, number2, nfFixedTh, 3);
MyWorksheet.WriteNumber(row, 3, number3, nfFixedTh, 3);
@ -124,7 +124,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfFixedTh, 3);
MyWorksheet.WriteNumber(row, 8, number8, nfFixedTh, 3);
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, 2, number2, nfPercentage, 0);
MyWorksheet.WriteNumber(row, 3, number3, nfPercentage, 0);
@ -134,7 +134,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfPercentage, 0);
MyWorksheet.WriteNumber(row, 8, number8, nfPercentage, 0);
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, 2, number2, nfPercentage, 2);
MyWorksheet.WriteNumber(row, 3, number3, nfPercentage, 2);
@ -144,7 +144,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfPercentage, 2);
MyWorksheet.WriteNumber(row, 8, number8, nfPercentage, 2);
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, 2, number2, nfPercentage, 3);
MyWorksheet.WriteNumber(row, 3, number3, nfPercentage, 3);
@ -154,7 +154,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfPercentage, 3);
MyWorksheet.WriteNumber(row, 8, number8, nfPercentage, 3);
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, 2, number2, nfExp, 0);
MyWorksheet.WriteNumber(row, 3, number3, nfExp, 0);
@ -164,7 +164,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfExp, 0);
MyWorksheet.WriteNumber(row, 8, number8, nfExp, 0);
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, 2, number2, nfExp, 2);
MyWorksheet.WriteNumber(row, 3, number3, nfExp, 2);
@ -174,7 +174,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfExp, 2);
MyWorksheet.WriteNumber(row, 8, number8, nfExp, 2);
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, 2, number2, nfExp, 3);
MyWorksheet.WriteNumber(row, 3, number3, nfExp, 3);
@ -184,7 +184,7 @@ begin
MyWorksheet.WriteNumber(row, 7, number7, nfExp, 3);
MyWorksheet.WriteNumber(row, 8, number8, nfExp, 3);
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, 2, number2, nfCurrency, 2, '$');
MyWorksheet.WriteCurrency(row, 3, number3, nfCurrency, 2, '$');
@ -194,7 +194,7 @@ begin
MyWorksheet.WriteCurrency(row, 7, number7, nfCurrency, 2, '$');
MyWorksheet.WriteCurrency(row, 8, number8, nfCurrency, 2, '$');
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, 2, number2, 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, 8, number8, nfCurrencyRed, 2, '$', pcfCSV, ncfBCSVB);
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, 2, number2, nfFraction, '# ???/???');
MyWorksheet.WriteNumber(row, 3, number3, nfFraction, '# ???/???');
@ -215,74 +215,73 @@ begin
MyWorksheet.WriteNumber(row, 8, number8, nfFraction, '# ???/???');
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);
MyWorksheet.WriteUTF8Text(row, 0, 'nfShortDateTime');
MyWorksheet.WriteText(row, 0, 'nfShortDateTime');
MyWorksheet.WriteDateTime(row, 1, dt1, nfShortDateTime);
MyWorksheet.WriteDateTime(row, 2, dt2, nfShortDateTime);
inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfShortDate');
MyWorksheet.WriteText(row, 0, 'nfShortDate');
MyWorksheet.WriteDateTime(row, 1, dt1, nfShortDate);
MyWorksheet.WriteDateTime(row, 2, dt2, nfShortDate);
inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfLongDate');
MyWorksheet.WriteText(row, 0, 'nfLongDate');
MyWorksheet.WriteDateTime(row, 1, dt1, nfLongDate);
MyWorksheet.WriteDateTime(row, 2, dt2, nfLongDate);
inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfShortTime');
MyWorksheet.WriteText(row, 0, 'nfShortTime');
MyWorksheet.WriteDateTime(row, 1, dt1, nfShortTime);
MyWorksheet.WriteDateTime(row, 2, dt2, nfShortTime);
inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfLongTime');
MyWorksheet.WriteText(row, 0, 'nfLongTime');
MyWorksheet.WriteDateTime(row, 1, dt1, nfLongTime);
MyWorksheet.WriteDateTime(row, 2, dt2, nfLongTime);
inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfShortTimeAM');
MyWorksheet.WriteText(row, 0, 'nfShortTimeAM');
MyWorksheet.WriteDateTime(row, 1, dt1, nfShortTimeAM);
MyWorksheet.WriteDateTime(row, 2, dt2, nfShortTimeAM);
inc(row);
MyWorksheet.WriteUTF8Text(row, 0, 'nfLongTimeAM');
MyWorksheet.WriteText(row, 0, 'nfLongTimeAM');
MyWorksheet.WriteDateTime(row, 1, dt1, nfLongTimeAM);
MyWorksheet.WriteDateTime(row, 2, dt2, nfLongTimeAM);
inc(row,2);
MyWorksheet.WriteUTF8Text(row, 0, 'Some custom formats');
MyWorksheet.WriteText(row, 0, 'Some custom formats');
inc(row);
// 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)
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, 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.WriteUTF8Text(row, 4, 'This format is not displayed correctly by Open/LibreOffice.');
MyWorksheet.WriteText(row, 3, 'The semicolon must be escaped otherwise it would be misunderstood as a section separator.');
MyWorksheet.WriteText(row, 4, 'This format is not displayed correctly by Open/LibreOffice.');
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, 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.WriteUTF8Text(row, 4, 'This format is not displayed correctly by Open/LibreOffice.');
MyWorksheet.WriteText(row, 3, 'The semicolon must be escaped otherwise it would be misunderstood as a section separator.');
MyWorksheet.WriteText(row, 4, 'This format is not displayed correctly by Open/LibreOffice.');
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, 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);
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, 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);
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, 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
MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet 2');
// Save the spreadsheet to a file
MyWorkbook.WriteToFile(MyDir + 'test.ods',
sfOpenDocument);
MyWorkbook.WriteToFile(MyDir + 'test.ods', sfOpenDocument);
MyWorkbook.Free;
end.

View File

@ -50,7 +50,7 @@ begin
begin
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
WriteLn(' Formula: ', CurCell^.FormulaValue)
@ -60,5 +60,11 @@ begin
// Finalization
MyWorkbook.Free;
{$IFDEF WINDOWS}
WriteLn;
WriteLn('Press ENTER to quit...');
ReadLn;
{$ENDIF}
end.

View File

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

View File

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

View File

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

View File

@ -7,12 +7,20 @@ object FPSChartForm: TFPSChartForm
ClientHeight = 382
ClientWidth = 697
OnCreate = FormCreate
LCLVersion = '1.5'
LCLVersion = '1.7'
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
Height = 264
Top = 112
Width = 336
Height = 263
Top = 111
Width = 337
AxisList = <
item
Minors = <>
@ -34,23 +42,39 @@ object FPSChartForm: TFPSChartForm
Title.Text.Strings = (
'TAChart'
)
ParentColor = False
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Top = 8
BorderSpacing.Right = 8
BorderSpacing.Bottom = 8
object MyChartBarSeries1: TBarSeries
BarBrush.Color = clRed
Source = FPSChartSource
end
end
object WorksheetGrid: TsWorksheetGrid
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = editXAxis
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Bevel1
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
Left = 8
Height = 264
Top = 112
Height = 263
Top = 111
Width = 336
FrozenCols = 0
FrozenRows = 0
ReadFormulas = False
TextOverflow = True
WorkbookSource = WorksheetGrid.internal
Anchors = [akTop, akLeft, akRight, akBottom]
AutoAdvance = aaDown
BorderSpacing.Left = 8
BorderSpacing.Top = 8
BorderSpacing.Bottom = 8
ColCount = 27
DefaultColWidth = 64
DefaultRowHeight = 22
ExtendedSelect = False
Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goColSizing, goEditing, goThumbTracking]
RowCount = 101
@ -70,6 +94,7 @@ object FPSChartForm: TFPSChartForm
Height = 42
Top = 4
Width = 678
Anchors = [akTop, akLeft, akRight]
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.'
ParentColor = False
@ -147,6 +172,15 @@ object FPSChartForm: TFPSChartForm
TabOrder = 6
Text = 'B3:B14'
end
object Bevel1: TBevel
AnchorSideLeft.Control = Owner
AnchorSideLeft.Side = asrCenter
Left = 344
Height = 50
Top = 83
Width = 8
Shape = bsSpacer
end
object FPSChartSource: TsWorksheetChartSource
PointsNumber = 5
YFirstCellCol = 1

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -192,7 +192,7 @@ begin
begin
for i:=0 to ExportFields.Count-1 do
begin
FSheet.WriteUTF8Text(FRow,i,ExportFields[i].ExportedName);
FSheet.WriteText(FRow,i,ExportFields[i].ExportedName);
end;
inc(FRow);
end;
@ -304,13 +304,13 @@ begin
else if Field.Datatype in [ftBCD,ftCurrency,ftFloat,ftFMTBcd] then
FSheet.WriteCurrency(FRow, EF.Index, Field.AsFloat)
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
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
let ftWideMemo end up at the right place }
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
FSheet.WriteBoolValue(FRow, EF.Index, Field.AsBoolean)
else if Field.DataType in DateFieldTypes then
@ -327,7 +327,7 @@ begin
FSheet.WriteDateTime(FRow, EF.Index, Field.AsDateTime, nfShortDateTime);
end
else //fallback to string
FSheet.WriteUTF8Text(FRow, EF.Index, Field.AsString);
FSheet.WriteText(FRow, EF.Index, Field.AsString);
end;
end;

View File

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

View File

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

View File

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

View File

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

View File

@ -54,13 +54,13 @@ type
}
{@@ The record TRow contains information about a spreadsheet row:
@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 Row The index of the row (beginning with 0)
@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
row record. }
TRow = record
Row: Cardinal;
Height: Single; // in "lines"
Height: Single;
end;
{@@ Pointer to a TRow record }
@ -68,11 +68,11 @@ type
{@@ The record TCol contains information about a spreadsheet column:
@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. }
TCol = record
Col: Cardinal;
Width: Single; // in "characters". Excel uses the width of char "0" in 1st font
Width: Single;
end;
{@@ Pointer to a TCol record }
@ -428,9 +428,11 @@ type
function GetCellCountInRow(ARow: Cardinal): Cardinal;
function GetCellCountInCol(ACol: Cardinal): Cardinal;
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 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 DeleteRow(ARow: Cardinal);
procedure InsertCol(ACol: Cardinal);
@ -440,9 +442,11 @@ type
procedure RemoveCol(ACol: Cardinal);
procedure RemoveRow(ARow: Cardinal);
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 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
procedure Sort(const ASortParams: TsSortParams;
@ -491,12 +495,12 @@ type
procedure UnmergeCells(ARange: String); overload;
{ 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;
out ARow1, ACol1, ARow2, ACol2: Cardinal;
out ARowOffs1, AColOffs1, ARowOffs2, AColOffs2: 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 GetImageCount: Integer;
procedure RemoveAllImages;
@ -650,6 +654,7 @@ type
FLockCount: Integer;
FLog: TStringList;
FSearchEngine: TObject;
FUnits: TsSizeUnits;
{ Setter/Getter }
function GetErrorMsg: String;
@ -784,6 +789,7 @@ type
procedure RemoveAllEmbeddedObj;
{ Utilities }
function ConvertUnits(AValue: Double; AFromUnits, AToUnits: TsSizeUnits): Double;
procedure DisableNotifications;
procedure EnableNotifications;
function NotificationsEnabled: Boolean;
@ -806,6 +812,7 @@ type
property VirtualColCount: cardinal read FVirtualColCount write SetVirtualColCount;
property VirtualRowCount: cardinal read FVirtualRowCount write SetVirtualRowCount;
property Options: TsWorkbookOptions read FOptions write FOptions;
property Units: TsSizeUnits read FUnits;
{@@ This event fires whenever a new worksheet is added }
property OnAddWorksheet: TsWorksheetEvent read FOnAddWorksheet write FOnAddWorksheet;
@ -1029,8 +1036,8 @@ begin
FPageLayout := TsPageLayout.Create(self);
FDefaultColWidth := 12;
FDefaultRowHeight := 1;
FDefaultColWidth := ptsToMM(72); // Excel: about 72 pts
FDefaultRowHeight := ptsToMM(15); // Excel: 15pts
FFirstRowIndex := UNASSIGNED_ROW_COL_INDEX;
FFirstColIndex := UNASSIGNED_ROW_COL_INDEX;
@ -3336,16 +3343,15 @@ end;
procedure TsWorksheet.CalcImageCell(AIndex: Integer; x, y, AWidth, AHeight: Double;
out ARow, ACol: Cardinal; out ARowOffs, AColOffs, AScaleX, AScaleY: Double);
// All lengths are in workbook units!
var
colW, rowH, sum: Double;
factor: Double;
embobj: TsEmbeddedObj;
begin
factor := FWorkbook.GetDefaultFont.Size/2; // Width of "0" character in pts
ACol := 0;
sum := 0;
repeat
colW := ptsToMM(GetColWidth(ACol) * factor);
colW := GetColWidth(ACol, FWorkbook.Units);;
sum := sum + colW;
inc(ACol);
until sum > x;
@ -3353,11 +3359,10 @@ begin
AColOffs := x - sum;
dec(ACol);
factor := FWorkbook.GetDefaultFont.Size; // Height of line in pts
ARow := 0;
sum := 0;
repeat
rowH := ptsToMM(CalcRowHeight(ARow) * factor); // row height in mm
rowH := CalcRowHeight(ARow);
sum := sum + rowH;
inc(ARow);
until sum > y;
@ -3377,32 +3382,33 @@ end;
@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 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 AColOffs1 Distance between the left edge of image and column 1, in mm
@param ARowOffs2 Distance between the bottom edge of image and top of row 2, in mm
@param AColOffs2 Distance between the right edge of image and left of col 2, in mm
@param x Absolute coordinate of left edge of image, in mm
@param y Absolute coordinate of top edge of image, in mm
@param AWidth Width of the image, in mm
@param AHeight Height of the image, 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
@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
@param x Absolute coordinate of left edge of image
@param y Absolute coordinate of top edge of image
@param AWidth Width of the image
@param AHeight Height of the image
All dimensions are in workbook units
-------------------------------------------------------------------------------}
procedure TsWorksheet.CalcImageExtent(AIndex: Integer;
out ARow1, ACol1, ARow2, ACol2: Cardinal;
out ARowOffs1, AColOffs1, ARowOffs2, AColOffs2: Double;
out x,y, AWidth, AHeight: Double); // mm
out x,y, AWidth, AHeight: Double);
var
img: TsImage;
obj: TsEmbeddedObj;
colW, rowH: Double;
totH, totW: Double;
r, c: Integer;
factor: Double;
begin
img := GetImage(AIndex);
ARow1 := img.Row;
ACol1 := img.Col;
ARowOffs1 := img.OffsetX; // millimeters
ARowOffs1 := img.OffsetX;
AColOffs1 := img.OffsetY;
obj := FWorkbook.GetEmbeddedObj(img.Index);
@ -3410,11 +3416,10 @@ begin
AHeight := obj.ImageHeight * img.ScaleY;
// Find x coordinate of left image edge, in inches.
factor := FWorkbook.GetDefaultFont.Size/2; // Width of "0" character in pts
x := AColOffs1;
for c := 0 to ACol1-1 do
begin
colW := ptsToMM(GetColWidth(c) * factor); // in mm
colW := GetColWidth(c, FWorkbook.Units);
x := x + colW;
end;
@ -3423,7 +3428,7 @@ begin
ACol2 := ACol1;
while (totW < AWidth) do
begin
colW := ptsToMM(GetColWidth(ACol2) * factor);
colW := GetColWidth(ACol2, FWorkbook.Units);
totW := totW + colW;
if totW >= AWidth then
begin
@ -3434,11 +3439,10 @@ begin
end;
// Find y coordinate of top image edge, in inches.
factor := FWorkbook.GetDefaultFont.Size; // Height of line in pts
y := ARowOffs1;
for r := 0 to ARow1 - 1 do
begin
rowH := ptsToMM(CalcRowHeight(r) * factor); // row height in mm
rowH := CalcRowHeight(r);
y := y + rowH;
end;
@ -3447,7 +3451,7 @@ begin
ARow2 := ARow1;
while (totH < AHeight) do
begin
rowH := ptsToMM(CalcRowHeight(ARow2) * factor);
rowH := CalcRowHeight(ARow2);
totH := totH + rowH;
if totH >= AHeight then
begin
@ -3466,10 +3470,10 @@ end;
@param AFileName Name of the image file
@param AOffsetX The image is offset horizontally from the left edge of
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
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 AScaleY Vertical scaling factor of the image
@return Index into the internal image list.
@ -3501,10 +3505,10 @@ end;
@param AStream Stream which contains the image data
@param AOffsetX The image is offset horizontally from the left edge of
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
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 AScaleY Vertical scaling factor of the image
@return Index into the internal image list.
@ -3536,6 +3540,7 @@ begin
img^.Index := AImageIndex;
Result := FImages.Add(img);
end;
{@@ ----------------------------------------------------------------------------
Removes an image from the internal image list.
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
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
@return Row height in line count of the default font.
@return Row height in workbook units
-------------------------------------------------------------------------------}
function TsWorksheet.CalcAutoRowHeight(ARow: Cardinal): Single;
var
cell: PCell;
h0: Single;
begin
Result := 0;
h0 := Workbook.GetDefaultFontSize;
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
{
if Result = 0 then
Result := DefaultRowHeight;
}
end;
function TsWorksheet.CalcRowHeight(ARow: Cardinal): Single;
// In workbook units
begin
Result := CalcAutoRowHeight(ARow);
if Result = 0 then
@ -6326,10 +6327,11 @@ end;
Returns the width of the given column. If there is no column record then
the default column width is returned.
@param ACol Index of the column considered
@return Width of the column (in count of "0" characters of the default font)
@param ACol Index of the column considered
@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
col: PCol;
begin
@ -6342,17 +6344,24 @@ begin
Result := col^.Width
else
Result := FDefaultColWidth;
Result := FWorkbook.ConvertUnits(Result, FWorkbook.Units, AUnits);
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
default row height is returned
@param ARow Index of the row considered
@return Height of the row (in line count of the default font).
@param ARow Index of the row considered
@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
row: PRow;
begin
@ -6365,9 +6374,15 @@ begin
Result := row^.Height
else
Result := FDefaultRowHeight;
Result := FWorkbook.ConvertUnits(Result, FWorkbook.Units, AUnits);
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
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.
@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);
var
@ -6763,17 +6779,23 @@ end;
does not yet exist.
@param ARow Index of the row to be considered
@param AHeight Row height to be assigned to the row. The row height is
expressed as the line count of the default font size.
@param AHeight Row height to be assigned to the row.
@param AUnits Units measuring the row height.
-------------------------------------------------------------------------------}
procedure TsWorksheet.WriteRowHeight(ARow: Cardinal; AHeight: Single);
procedure TsWorksheet.WriteRowHeight(ARow: Cardinal; AHeight: Single;
AUnits: TsSizeUnits);
var
AElement: PRow;
begin
if ARow = UNASSIGNED_ROW_COL_INDEX then
exit;
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;
{@@ ----------------------------------------------------------------------------
@ -6784,7 +6806,8 @@ end;
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 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);
var
@ -6799,19 +6822,24 @@ end;
does not yet exist.
@param ACol Index of the column to be considered
@param AWidth Width to be assigned to the column. The column width is
expressed as the count of "0" characters of the default font.
@param AWidth Width to be assigned to the column.
@param AUnits Units used for parameter AWidth.
-------------------------------------------------------------------------------}
procedure TsWorksheet.WriteColWidth(ACol: Cardinal; AWidth: Single);
procedure TsWorksheet.WriteColWidth(ACol: Cardinal; AWidth: Single;
AUnits: TsSizeUnits);
var
AElement: PCol;
begin
if ACol = UNASSIGNED_ROW_COL_INDEX then
exit;
AElement := GetCol(ACol);
AElement^.Width := AWidth;
AElement^.Width := FWorkbook.ConvertUnits(AWidth, AUnits, FWorkbook.FUnits);
end;
procedure TsWorksheet.WriteColWidth(ACol: Cardinal; AWidth: Single);
begin
WriteColWidth(ACol, AWidth, suChars);
end;
{------------------------------------------------------------------------------}
{ TsWorkbook }
@ -6869,6 +6897,53 @@ begin
TsWorksheet(sheet).CalcFormulas;
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.
-------------------------------------------------------------------------------}
@ -6926,6 +7001,7 @@ begin
FWorksheets := TFPList.Create;
FLog := TStringList.Create;
FFormatID := sfidUnknown;
FUnits := suMillimeters; // Units for column width and row height
FormatSettings := UTF8FormatSettings;
FormatSettings.ShortDateFormat := MakeShortDateFormat(FormatSettings.ShortDateFormat);
@ -8314,6 +8390,8 @@ var
rdest, cdest: Integer; // row and column index at destination
nselS, nselD: Integer; // count of selected blocks
begin
Unused(ATransposed);
if AStream = nil then
exit;
@ -8452,13 +8530,13 @@ begin
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.
Image dimensions are converted to workbook units.
-------------------------------------------------------------------------------}
function TsWorkbook.AddEmbeddedObj(const AFileName: String): Integer;
var
obj: TsEmbeddedObj = nil;
w, h: Double;
begin
if not FileExists(AFileName) then
begin
@ -8469,8 +8547,11 @@ begin
obj := TsEmbeddedObj.Create;
if obj.LoadFromFile(AFileName) then
begin
obj.ImageWidth := ConvertUnits(obj.ImageWidth, suInches, FUnits);
obj.ImageHeight := ConvertUnits(obj.ImageHeight, suInches, FUnits);
Result := FEmbeddedObjList.Add(obj)
else
end else
begin
AddErrorMsg(rsFileFormatNotSupported, [AFileName]);
obj.Free;
@ -8486,7 +8567,6 @@ function TsWorkbook.AddEmbeddedObj(AStream: TStream;
const AName: String = ''): Integer;
var
obj: TsEmbeddedObj = nil;
w, h: Double;
begin
obj := TsEmbeddedObj.Create;
if obj.LoadFromStream(AStream, AName) then

View File

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

View File

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

View File

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

View File

@ -83,18 +83,33 @@ const
{@@ Index of italic default font in workbook's font list - not used directly }
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
unique value simplifies many things... }
FPS_LINE_ENDING = #10;
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>.
NOTE: When adding or rearranging items

View File

@ -1530,6 +1530,7 @@ begin
Result := true;
end;
{@@ ----------------------------------------------------------------------------
Excel's unit of row heights is "twips", i.e. 1/20 point.
Converts Twips to points.
@ -1682,8 +1683,10 @@ end;
@return Value converted to millimeters
-------------------------------------------------------------------------------}
function PtsToMM(AValue: Double): Double;
const
PTS = 25.4 / 72.0;
begin
Result := AValue / 72 * 25.4;
Result := AValue * PTS;
end;
{@@ ----------------------------------------------------------------------------
@ -2122,6 +2125,14 @@ end;
{@@ ----------------------------------------------------------------------------
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;
AOffsetX, AOffsetY, AScaleX, AScaleY: Double);
@ -2143,8 +2154,6 @@ begin
with AImage do
begin
Index := -1;
//ScaleX := 1.0;
//ScaleY := 1.0;
end;
end;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -363,10 +363,12 @@ begin
end;
procedure TsSpreadBIFF2Reader.ReadColWidth(AStream: TStream);
const
EPS = 1E-3;
var
c, c1, c2: Cardinal;
w: Word;
col: TCol;
colwidth: Single;
begin
// read column start and end index of column range
c1 := AStream.ReadByte;
@ -374,22 +376,25 @@ begin
// read col width in 1/256 of the width of "0" character
w := WordLEToN(AStream.ReadWord);
// 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.
if not SameValue(col.Width, FWorksheet.DefaultColWidth) then
if not SameValue(colwidth, FWorksheet.DefaultColWidth, EPS) then
for c := c1 to c2 do
FWorksheet.WriteColInfo(c, col);
FWorksheet.WriteColWidth(c, colwidth, FWorkbook.Units);
end;
procedure TsSpreadBIFF2Reader.ReadDefRowHeight(AStream: TStream);
var
hw: word;
h : Single;
begin
hw := WordLEToN(AStream.ReadWord);
FWorksheet.DefaultRowHeight := FWorkbook.ConvertUnits(
TwipsToPts(hw and $8000), suPoints, FWorkbook.Units);
{
h := TwipsToPts(hw and $8000) / FWorkbook.GetDefaultFontSize;
if h > ROW_HEIGHT_CORRECTION then
FWorksheet.DefaultRowHeight := h - ROW_HEIGHT_CORRECTION;
}
end;
procedure TsSpreadBIFF2Reader.ReadFONT(AStream: TStream);
@ -789,12 +794,16 @@ begin
begin
lRow := FWorksheet.GetRow(WordLEToN(rowrec.RowIndex));
// 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.
lRow^.Height := TwipsToPts(h and $7FFF) / Workbook.GetFont(0).Size;
if lRow^.Height > ROW_HEIGHT_CORRECTION then
lRow^.Height := lRow^.Height - ROW_HEIGHT_CORRECTION
else
lRow^.Height := 0;
}
end;
end;
@ -1227,7 +1236,7 @@ begin
{ Column width }
{ 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);
{ Write out }
@ -1780,7 +1789,8 @@ begin
{ Default height for unused rows, in twips = 1/20 of a point
Bits 0-14: Default height for unused rows, in twips
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)));
end;
@ -1964,7 +1974,6 @@ var
containsXF: Boolean;
rowheight: Word;
w: Word;
h: Single;
begin
if (ARowIndex >= FLimitations.MaxRowCount) or (AFirstColIndex >= FLimitations.MaxColCount)
or (ALastColIndex >= FLimitations.MaxColCount)
@ -1988,14 +1997,17 @@ begin
AStream.WriteWord(WordToLE(Word(ALastColIndex) + 1));
{ 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
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
if (ARow^.Height = 0) then
rowheight := 0
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;
AStream.WriteWord(WordToLE(w));

View File

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

View File

@ -1399,7 +1399,7 @@ const
var
c, c1, c2: Cardinal;
w: Word;
col: TCol;
colwidth: Double;
begin
// read column start and end index of column range
c1 := WordLEToN(AStream.ReadWord);
@ -1407,11 +1407,11 @@ begin
// read col width in 1/256 of the width of "0" character
w := WordLEToN(AStream.ReadWord);
// 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
if not SameValue(col.Width, FWorksheet.DefaultColWidth, EPS) then
if not SameValue(colwidth, FWorksheet.DefaultColWidth, EPS) then
for c := c1 to c2 do
FWorksheet.WriteColInfo(c, col);
FWorksheet.WriteColWidth(c, colwidth, FWorkbook.Units);
end;
{@@ ----------------------------------------------------------------------------
@ -1511,9 +1511,12 @@ end;
Reads the default column width
-------------------------------------------------------------------------------}
procedure TsSpreadBIFFReader.ReadDefColWidth(AStream: TStream);
var
w: Word;
begin
// 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;
{@@ ----------------------------------------------------------------------------
@ -1523,16 +1526,14 @@ end;
procedure TsSpreadBIFFReader.ReadDefRowHeight(AStream: TStream);
var
hw: Word;
h: Single;
begin
// Options
AStream.ReadWord;
// Height, in Twips (1/20 pt).
hw := WordLEToN(AStream.ReadWord);
h := TwipsToPts(hw) / FWorkbook.GetDefaultFontSize;
if h > ROW_HEIGHT_CORRECTION then
FWorksheet.DefaultRowHeight := h - ROW_HEIGHT_CORRECTION;
FWorksheet.DefaultRowHeight := FWorkbook.ConvertUnits(
TwipsToPts(hw), suPoints, FWorkbook.Units);
end;
{@@ ----------------------------------------------------------------------------
@ -2089,13 +2090,8 @@ begin
if rowrec.Flags and $00000040 <> 0 then begin
lRow := FWorksheet.GetRow(WordLEToN(rowrec.RowIndex));
// 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;
lRow^.Height := TwipsToPts(h) / FWorkbook.GetDefaultFontSize;
if lRow^.Height > ROW_HEIGHT_CORRECTION then
lRow^.Height := lRow^.Height - ROW_HEIGHT_CORRECTION
else
lRow^.Height := 0;
lRow^.Height := FWorkbook.ConvertUnits(TwipsToPts(h), suPoints, FWorkbook.Units);
end;
end;
@ -3183,7 +3179,7 @@ begin
rec.EndCol := WordToLE(ACol^.Col);
{ 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.XFIndex := WordToLE(15); // Index of XF record, not used
@ -3309,13 +3305,16 @@ end;
-------------------------------------------------------------------------------}
procedure TsSpreadBIFFWriter.WriteDefaultColWidth(AStream: TStream;
AWorksheet: TsWorksheet);
var
colwidth: Single;
begin
{ BIFF record header }
WriteBIFFHeader(AStream, INT_EXCEL_ID_DEFCOLWIDTH, 2);
{ Column width in characters, using the width of the zero character
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;
{@@ ----------------------------------------------------------------------------
@ -3327,7 +3326,7 @@ end;
procedure TsSpreadBIFFWriter.WriteDefaultRowHeight(AStream: TStream;
AWorksheet: TsWorksheet);
var
h: Single;
h: Double;
begin
{ BIFF record header }
WriteBIFFHeader(AStream, INT_EXCEL_ID_DEFROWHEIGHT, 4);
@ -3340,7 +3339,7 @@ begin
AStream.WriteWord(WordToLE($0001));
{ 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)));
end;
@ -4243,7 +4242,6 @@ var
spaceabove, spacebelow: Boolean;
colindex: Cardinal;
rowheight: Word;
h: Single;
fmt: PsCellFormat;
begin
if (ARowIndex >= FLimitations.MaxRowCount) or
@ -4287,14 +4285,13 @@ begin
AStream.WriteWord(WordToLE(Word(ALastColIndex) + 1));
{ 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
rowheight := PtsToTwips((ASheet.DefaultRowHeight + ROW_HEIGHT_CORRECTION) * h)
rowheight := PtsToTwips(FWorkbook.ConvertUnits(ASheet.DefaultRowHeight, FWorkbook.Units, suPoints))
else
if (ARow^.Height = 0) then
rowheight := 0
else
rowheight := PtsToTwips((ARow^.Height + ROW_HEIGHT_CORRECTION)*h);
rowheight := PtsToTwips(FWorkbook.ConvertUnits(ARow^.Height, FWorkbook.Units, suPoints));
w := rowheight and $7FFF;
AStream.WriteWord(WordToLE(w));

View File

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

View File

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