You've already forked lazarus-ccr
fpspreadsheet: Infrastructure for writing of number formats to ods files. Fixed and exponential formats ok, percentage not working. Others not yet implemented.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3174 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -17,8 +17,19 @@ var
|
|||||||
MyWorkbook: TsWorkbook;
|
MyWorkbook: TsWorkbook;
|
||||||
MyWorksheet: TsWorksheet;
|
MyWorksheet: TsWorksheet;
|
||||||
MyDir: string;
|
MyDir: string;
|
||||||
|
number1, number2, number3, number4,
|
||||||
|
number5, number6, number7, number8: Double;
|
||||||
|
row: Integer;
|
||||||
begin
|
begin
|
||||||
MyDir := ExtractFilePath(ParamStr(0));
|
MyDir := ExtractFilePath(ParamStr(0));
|
||||||
|
number1 := 1.23456789;
|
||||||
|
number2 := -number1;
|
||||||
|
number3 := 0.123456789;
|
||||||
|
number4 := -number3;
|
||||||
|
number5 := 10000*number1;
|
||||||
|
number6 := -10000*number1;
|
||||||
|
number7 := 1/number3;
|
||||||
|
number8 := -1/number3;
|
||||||
|
|
||||||
// Create the spreadsheet
|
// Create the spreadsheet
|
||||||
MyWorkbook := TsWorkbook.Create;
|
MyWorkbook := TsWorkbook.Create;
|
||||||
@ -37,6 +48,140 @@ begin
|
|||||||
MyWorksheet.WriteUsedFormatting(0, 0, [uffBold]);
|
MyWorksheet.WriteUsedFormatting(0, 0, [uffBold]);
|
||||||
MyWorksheet.WriteFont(0, 1, 'Times New Roman', 16, [], scRed);
|
MyWorksheet.WriteFont(0, 1, 'Times New Roman', 16, [], scRed);
|
||||||
|
|
||||||
|
// Show number formats
|
||||||
|
row := 7;
|
||||||
|
MyWorksheet.WriteUTF8Text(row, 0, 'Number formats:');
|
||||||
|
inc(row);
|
||||||
|
MyWorksheet.WriteUTF8Text(row, 0, 'nfGeneral');
|
||||||
|
MyWorksheet.WriteNumber(row, 1, number1, nfGeneral);
|
||||||
|
MyWorksheet.WriteNumber(row, 2, number2, nfGeneral);
|
||||||
|
MyWorksheet.WriteNumber(row, 3, number3, nfGeneral);
|
||||||
|
MyWorksheet.WriteNumber(row, 4, number4, nfGeneral);
|
||||||
|
MyWorksheet.WriteNumber(row, 5, number5, nfGeneral);
|
||||||
|
MyWorksheet.WriteNumber(row, 6, number6, nfGeneral);
|
||||||
|
MyWorksheet.WriteNumber(row, 7, number7, nfGeneral);
|
||||||
|
MyWorksheet.WriteNumber(row, 8, number8, nfGeneral);
|
||||||
|
inc(row);
|
||||||
|
MyWorksheet.WriteUTF8Text(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);
|
||||||
|
MyWorksheet.WriteNumber(row, 4, number4, nfFixed, 0);
|
||||||
|
MyWorksheet.WriteNumber(row, 5, number5, nfFixed, 0);
|
||||||
|
MyWorksheet.WriteNumber(row, 6, number6, nfFixed, 0);
|
||||||
|
MyWorksheet.WriteNumber(row, 7, number7, nfFixed, 0);
|
||||||
|
MyWorksheet.WriteNumber(row, 8, number8, nfFixed, 0);
|
||||||
|
inc(row);
|
||||||
|
MyWorksheet.WriteUTF8Text(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);
|
||||||
|
MyWorksheet.WriteNumber(row, 4, number4, nfFixed, 2);
|
||||||
|
MyWorksheet.WriteNumber(row, 5, number5, nfFixed, 2);
|
||||||
|
MyWorksheet.WriteNumber(row, 6, number6, nfFixed, 2);
|
||||||
|
MyWorksheet.WriteNumber(row, 7, number7, nfFixed, 2);
|
||||||
|
MyWorksheet.WriteNumber(row, 8, number8, nfFixed, 2);
|
||||||
|
inc(row);
|
||||||
|
MyWorksheet.WriteUTF8Text(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);
|
||||||
|
MyWorksheet.WriteNumber(row, 4, number4, nfFixed, 3);
|
||||||
|
MyWorksheet.WriteNumber(row, 5, number5, nfFixed, 3);
|
||||||
|
MyWorksheet.WriteNumber(row, 6, number6, nfFixed, 3);
|
||||||
|
MyWorksheet.WriteNumber(row, 7, number7, nfFixed, 3);
|
||||||
|
MyWorksheet.WriteNumber(row, 8, number8, nfFixed, 3);
|
||||||
|
inc(row);
|
||||||
|
MyWorksheet.WriteUTF8Text(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);
|
||||||
|
MyWorksheet.WriteNumber(row, 4, number4, nfFixedTh, 0);
|
||||||
|
MyWorksheet.WriteNumber(row, 5, number5, nfFixedTh, 0);
|
||||||
|
MyWorksheet.WriteNumber(row, 6, number6, nfFixedTh, 0);
|
||||||
|
MyWorksheet.WriteNumber(row, 7, number7, nfFixedTh, 0);
|
||||||
|
MyWorksheet.WriteNumber(row, 8, number8, nfFixedTh, 0);
|
||||||
|
inc(row);
|
||||||
|
MyWorksheet.WriteUTF8Text(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);
|
||||||
|
MyWorksheet.WriteNumber(row, 4, number4, nfFixedTh, 2);
|
||||||
|
MyWorksheet.WriteNumber(row, 5, number5, nfFixedTh, 2);
|
||||||
|
MyWorksheet.WriteNumber(row, 6, number6, nfFixedTh, 2);
|
||||||
|
MyWorksheet.WriteNumber(row, 7, number7, nfFixedTh, 2);
|
||||||
|
MyWorksheet.WriteNumber(row, 8, number8, nfFixedTh, 2);
|
||||||
|
inc(row);
|
||||||
|
MyWorksheet.WriteUTF8Text(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);
|
||||||
|
MyWorksheet.WriteNumber(row, 4, number4, nfFixedTh, 3);
|
||||||
|
MyWorksheet.WriteNumber(row, 5, number5, nfFixedTh, 3);
|
||||||
|
MyWorksheet.WriteNumber(row, 6, number6, nfFixedTh, 3);
|
||||||
|
MyWorksheet.WriteNumber(row, 7, number7, nfFixedTh, 3);
|
||||||
|
MyWorksheet.WriteNumber(row, 8, number8, nfFixedTh, 3);
|
||||||
|
inc(row);
|
||||||
|
MyWorksheet.WriteUTF8Text(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);
|
||||||
|
MyWorksheet.WriteNumber(row, 4, number4, nfPercentage, 0);
|
||||||
|
MyWorksheet.WriteNumber(row, 5, number5, nfPercentage, 0);
|
||||||
|
MyWorksheet.WriteNumber(row, 6, number6, nfPercentage, 0);
|
||||||
|
MyWorksheet.WriteNumber(row, 7, number7, nfPercentage, 0);
|
||||||
|
MyWorksheet.WriteNumber(row, 8, number8, nfPercentage, 0);
|
||||||
|
inc(row);
|
||||||
|
MyWorksheet.WriteUTF8Text(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);
|
||||||
|
MyWorksheet.WriteNumber(row, 4, number4, nfPercentage, 2);
|
||||||
|
MyWorksheet.WriteNumber(row, 5, number5, nfPercentage, 2);
|
||||||
|
MyWorksheet.WriteNumber(row, 6, number6, nfPercentage, 2);
|
||||||
|
MyWorksheet.WriteNumber(row, 7, number7, nfPercentage, 2);
|
||||||
|
MyWorksheet.WriteNumber(row, 8, number8, nfPercentage, 2);
|
||||||
|
inc(row);
|
||||||
|
MyWorksheet.WriteUTF8Text(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);
|
||||||
|
MyWorksheet.WriteNumber(row, 4, number4, nfPercentage, 3);
|
||||||
|
MyWorksheet.WriteNumber(row, 5, number5, nfPercentage, 3);
|
||||||
|
MyWorksheet.WriteNumber(row, 6, number6, nfPercentage, 3);
|
||||||
|
MyWorksheet.WriteNumber(row, 7, number7, nfPercentage, 3);
|
||||||
|
MyWorksheet.WriteNumber(row, 8, number8, nfPercentage, 3);
|
||||||
|
inc(row);
|
||||||
|
MyWorksheet.WriteUTF8Text(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);
|
||||||
|
MyWorksheet.WriteNumber(row, 4, number4, nfExp, 0);
|
||||||
|
MyWorksheet.WriteNumber(row, 5, number5, nfExp, 0);
|
||||||
|
MyWorksheet.WriteNumber(row, 6, number6, nfExp, 0);
|
||||||
|
MyWorksheet.WriteNumber(row, 7, number7, nfExp, 0);
|
||||||
|
MyWorksheet.WriteNumber(row, 8, number8, nfExp, 0);
|
||||||
|
inc(row);
|
||||||
|
MyWorksheet.WriteUTF8Text(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);
|
||||||
|
MyWorksheet.WriteNumber(row, 4, number4, nfExp, 2);
|
||||||
|
MyWorksheet.WriteNumber(row, 5, number5, nfExp, 2);
|
||||||
|
MyWorksheet.WriteNumber(row, 6, number6, nfExp, 2);
|
||||||
|
MyWorksheet.WriteNumber(row, 7, number7, nfExp, 2);
|
||||||
|
MyWorksheet.WriteNumber(row, 8, number8, nfExp, 2);
|
||||||
|
inc(row);
|
||||||
|
MyWorksheet.WriteUTF8Text(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);
|
||||||
|
MyWorksheet.WriteNumber(row, 4, number4, nfExp, 3);
|
||||||
|
MyWorksheet.WriteNumber(row, 5, number5, nfExp, 3);
|
||||||
|
MyWorksheet.WriteNumber(row, 6, number6, nfExp, 3);
|
||||||
|
MyWorksheet.WriteNumber(row, 7, number7, nfExp, 3);
|
||||||
|
MyWorksheet.WriteNumber(row, 8, number8, nfExp, 3);
|
||||||
|
|
||||||
// Creates a new worksheet
|
// Creates a new worksheet
|
||||||
MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet 2');
|
MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet 2');
|
||||||
|
|
||||||
|
@ -59,10 +59,10 @@ type
|
|||||||
{ TsSpreadOpenDocNumFormatParser }
|
{ TsSpreadOpenDocNumFormatParser }
|
||||||
TsSpreadOpenDocNumFormatParser = class(TsNumFormatParser)
|
TsSpreadOpenDocNumFormatParser = class(TsNumFormatParser)
|
||||||
protected
|
protected
|
||||||
function BuildXMLAsStringFromSection(ASection: Integer; AIndent: String;
|
function BuildXMLAsStringFromSection(ASection: Integer;
|
||||||
AFormatNo: Integer): String;
|
AIndent,AFormatName: String): String;
|
||||||
public
|
public
|
||||||
function BuildXMLAsString(AIndent: String; AFormatNo: Integer): String;
|
function BuildXMLAsString(AIndent,AFormatName: String): String;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TsSpreadOpenDocReader }
|
{ TsSpreadOpenDocReader }
|
||||||
@ -154,6 +154,7 @@ type
|
|||||||
// Helpers
|
// Helpers
|
||||||
procedure CreateNumFormatList; override;
|
procedure CreateNumFormatList; override;
|
||||||
procedure ListAllColumnStyles;
|
procedure ListAllColumnStyles;
|
||||||
|
procedure ListAllNumFormats; override;
|
||||||
procedure ListAllRowStyles;
|
procedure ListAllRowStyles;
|
||||||
// Routines to write those files
|
// Routines to write those files
|
||||||
procedure WriteMimetype;
|
procedure WriteMimetype;
|
||||||
@ -297,40 +298,45 @@ type
|
|||||||
|
|
||||||
procedure TsSpreadOpenDocNumFormatList.AddBuiltinFormats;
|
procedure TsSpreadOpenDocNumFormatList.AddBuiltinFormats;
|
||||||
begin
|
begin
|
||||||
// there are no built-in number formats which are silently assumed to exist.
|
AddFormat('N0', '', nfGeneral);
|
||||||
|
AddFormat('N1', '0', nfFixed);
|
||||||
|
AddFormat('N2', '0.00', nfFixed);
|
||||||
|
AddFormat('N3', '#,##0', nfFixedTh);
|
||||||
|
AddFormat('N4', '#,##0.00', nfFixed);
|
||||||
|
AddFormat('N10', '0%', nfPercentage);
|
||||||
|
AddFormat('N11', '0.00%', nfPercentage);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
{ TsSpreadOpenDocNumFormatParser }
|
{ TsSpreadOpenDocNumFormatParser }
|
||||||
|
|
||||||
function TsSpreadOpenDocNumFormatParser.BuildXMLAsString(AIndent: String;
|
function TsSpreadOpenDocNumFormatParser.BuildXMLAsString(AIndent,
|
||||||
AFormatNo: Integer): String;
|
AFormatName: String): String;
|
||||||
var
|
var
|
||||||
i, ns: Integer;
|
i, ns: Integer;
|
||||||
begin
|
begin
|
||||||
Result := '';
|
Result := '';
|
||||||
for i := Length(FSections)-1 downto 0 do
|
for i := Length(FSections)-1 downto 0 do
|
||||||
Result := Result + BuildXMLAsStringFromSection(i, AIndent, AFormatNo);
|
Result := Result + BuildXMLAsStringFromSection(i, AIndent, AFormatName);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TsSpreadOpenDocNumFormatParser.BuildXMLAsStringFromSection(
|
function TsSpreadOpenDocNumFormatParser.BuildXMLAsStringFromSection(
|
||||||
ASection: Integer; AIndent: String; AFormatNo: Integer): String;
|
ASection: Integer; AIndent,AFormatName: String): String;
|
||||||
var
|
var
|
||||||
nf : TsNumberFormat;
|
nf : TsNumberFormat;
|
||||||
decs: Byte;
|
decs: Byte;
|
||||||
|
expdig: Integer;
|
||||||
next: Integer;
|
next: Integer;
|
||||||
sGrouping: String;
|
sGrouping: String;
|
||||||
sColor: String;
|
sColor: String;
|
||||||
sStyleMap: String;
|
sStyleMap: String;
|
||||||
ns: Integer;
|
ns: Integer;
|
||||||
fmtName: String;
|
|
||||||
clr: TsColorvalue;
|
clr: TsColorvalue;
|
||||||
begin
|
begin
|
||||||
Result := '';
|
Result := '';
|
||||||
sGrouping := '';
|
sGrouping := '';
|
||||||
sColor := '';
|
sColor := '';
|
||||||
sStyleMap := '';
|
sStyleMap := '';
|
||||||
fmtName := Format('N%d', [AFormatNo]);
|
|
||||||
|
|
||||||
ns := Length(FSections);
|
ns := Length(FSections);
|
||||||
if (ns > 1) then begin
|
if (ns > 1) then begin
|
||||||
@ -338,20 +344,20 @@ begin
|
|||||||
case ns of
|
case ns of
|
||||||
2: sStyleMap := AIndent +
|
2: sStyleMap := AIndent +
|
||||||
' <style:map ' +
|
' <style:map ' +
|
||||||
'style:apply-style-name="' + fmtName + 'P0" ' +
|
'style:apply-style-name="' + AFormatName + 'P0" ' +
|
||||||
'style:condition="value()>=0" />' + LineEnding; // >= 0
|
'style:condition="value()>=0" />' + LineEnding; // >= 0
|
||||||
3: sStyleMap := AIndent +
|
3: sStyleMap := AIndent +
|
||||||
' <style:map '+
|
' <style:map '+
|
||||||
'style:apply-style-name="' + fmtName + 'P0" ' + // > 0
|
'style:apply-style-name="' + AFormatName + 'P0" ' + // > 0
|
||||||
'style:condition="value()>0" />' + LineEnding + AIndent +
|
'style:condition="value()>0" />' + LineEnding + AIndent +
|
||||||
' <style:map '+
|
' <style:map '+
|
||||||
'style:apply-style-name="' + fmtName + 'P1" ' + // < 0
|
'style:apply-style-name="' + AFormatName + 'P1" ' + // < 0
|
||||||
'style:condition="value()<0" />' + LineEnding;
|
'style:condition="value()<0" />' + LineEnding;
|
||||||
else
|
else
|
||||||
raise Exception.Create('At most 3 format sections allowed.');
|
raise Exception.Create('At most 3 format sections allowed.');
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
fmtName := fmtName + 'P' + IntToStr(ASection);
|
AFormatName := AFormatName + 'P' + IntToStr(ASection);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
with FSections[ASection] do begin
|
with FSections[ASection] do begin
|
||||||
@ -368,7 +374,7 @@ begin
|
|||||||
// nfFixed, nfFixedTh
|
// nfFixed, nfFixedTh
|
||||||
if (next = Length(Elements)) then begin
|
if (next = Length(Elements)) then begin
|
||||||
Result := AIndent +
|
Result := AIndent +
|
||||||
'<number:number-style style:name="' + fmtName + '">' + LineEnding +
|
'<number:number-style style:name="' + AFormatName + '">' + LineEnding +
|
||||||
sColor + AIndent +
|
sColor + AIndent +
|
||||||
' <number:number ' +
|
' <number:number ' +
|
||||||
'number:min-integer-digits="1" ' + sGrouping +
|
'number:min-integer-digits="1" ' + sGrouping +
|
||||||
@ -378,23 +384,47 @@ begin
|
|||||||
'</number:number-style>' + LineEnding;
|
'</number:number-style>' + LineEnding;
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
end;
|
|
||||||
|
|
||||||
// nfPercentage
|
// nfPercentage
|
||||||
if IsTokenAt(nftPercent, ASection, next) and (next+1 = Length(Elements))
|
if IsTokenAt(nftPercent, ASection, next) and (next+1 = Length(Elements))
|
||||||
then begin
|
then begin
|
||||||
Result := AIndent +
|
Result := AIndent +
|
||||||
'<number:percentage-style style:name="' + fmtName + '">' + LineEnding +
|
'<number:percentage-style style:name="' + AFormatName + '">' + LineEnding +
|
||||||
sColor + AIndent +
|
sColor + AIndent +
|
||||||
' <number:number ' +
|
' <number:number ' +
|
||||||
'number:min-integer-digits="1" ' + sGrouping +
|
'number:min-integer-digits="1" ' + sGrouping +
|
||||||
'number:decimal-places="' + IntToStr(decs) +
|
'number:decimal-places="' + IntToStr(decs) + '" />' + LineEnding + AIndent +
|
||||||
'" />' + LineEnding + AIndent +
|
|
||||||
' <number:text>%</number:text>' + LineEnding +
|
' <number:text>%</number:text>' + LineEnding +
|
||||||
sStyleMap + AIndent +
|
sStyleMap + AIndent +
|
||||||
'</number:percentage-style>' + LineEnding;
|
'</number:percentage-style>' + LineEnding;
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
// nfExp
|
||||||
|
if IsTokenAt(nftExpChar, ASection, next) then begin
|
||||||
|
if (next + 2 < Length(Elements)) and
|
||||||
|
IsTokenAt(nftExpSign, ASection, next+1) and
|
||||||
|
IsTokenAt(nftExpDigits, ASection, next+2)
|
||||||
|
then
|
||||||
|
expdig := Elements[next+2].IntValue
|
||||||
|
else
|
||||||
|
if (next + 1 < Length(Elements)) and
|
||||||
|
IsTokenAt(nftExpDigits, ASection, next+1)
|
||||||
|
then
|
||||||
|
expdig := Elements[next+1].IntValue
|
||||||
|
else
|
||||||
|
exit;
|
||||||
|
Result := AIndent +
|
||||||
|
'<number:number-style style:name="' + AFormatName + '">' + LineEnding +
|
||||||
|
sColor + AIndent +
|
||||||
|
' <number:scientific-number number:decimal-places="' + IntToStr(decs) +'" '+
|
||||||
|
'number:min-integer-digits="1" '+
|
||||||
|
'number:min-exponent-digits="' + IntToStr(expdig) +'" />' +
|
||||||
|
sStylemap + AIndent +
|
||||||
|
'</number:number-style>';
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// ... more to follow...
|
// ... more to follow...
|
||||||
@ -1850,6 +1880,24 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ Collects all number formats used in the workbook. Overrides the inherited
|
||||||
|
method to assign a unique name according to the OpenDocument syntax ("N<number>"
|
||||||
|
to the format items. }
|
||||||
|
procedure TsSpreadOpenDocWriter.ListAllNumFormats;
|
||||||
|
const
|
||||||
|
FMT_BASE = 1000; // Format number to start with. Not clear if this is correct...
|
||||||
|
var
|
||||||
|
n, i, j: Integer;
|
||||||
|
begin
|
||||||
|
n := NumFormatList.Count;
|
||||||
|
inherited ListAllNumFormats;
|
||||||
|
j := 0;
|
||||||
|
for i:=n to NumFormatList.Count-1 do begin
|
||||||
|
NumFormatList.Items[i].Name := Format('N%d', [FMT_BASE + j]);
|
||||||
|
inc(j);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TsSpreadOpenDocWriter.ListAllRowStyles;
|
procedure TsSpreadOpenDocWriter.ListAllRowStyles;
|
||||||
var
|
var
|
||||||
i, j, r: Integer;
|
i, j, r: Integer;
|
||||||
@ -2131,14 +2179,22 @@ function TsSpreadOpenDocWriter.WriteCellStylesXMLAsString: string;
|
|||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
s: String;
|
s: String;
|
||||||
|
fmtIndex: Integer;
|
||||||
|
fmt: String;
|
||||||
begin
|
begin
|
||||||
Result := '';
|
Result := '';
|
||||||
|
|
||||||
for i := 0 to Length(FFormattingStyles) - 1 do
|
for i := 0 to Length(FFormattingStyles) - 1 do
|
||||||
begin
|
begin
|
||||||
|
fmtIndex := NumFormatList.Find(FFormattingStyles[i].NumberFormatStr);
|
||||||
|
if fmtIndex <> -1
|
||||||
|
then fmt := 'style:data-style-name="' + NumFormatList[fmtIndex].Name +'"'
|
||||||
|
else fmt := '';
|
||||||
|
|
||||||
// Start and Name
|
// Start and Name
|
||||||
Result := Result +
|
Result := Result +
|
||||||
' <style:style style:name="ce' + IntToStr(i) + '" style:family="table-cell" style:parent-style-name="Default">' + LineEnding;
|
' <style:style style:name="ce' + IntToStr(i) + '" style:family="table-cell" ' +
|
||||||
|
'style:parent-style-name="Default" '+ fmt + '>' + LineEnding;
|
||||||
|
|
||||||
// Fields
|
// Fields
|
||||||
|
|
||||||
@ -2256,29 +2312,16 @@ function TsSpreadOpenDocWriter.WriteNumFormatsXMLAsString: String;
|
|||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
numFmtXML: String;
|
numFmtXML: String;
|
||||||
|
fmtItem: TsNumFormatData;
|
||||||
parser: TsSpreadOpenDocNumFormatParser;
|
parser: TsSpreadOpenDocNumFormatParser;
|
||||||
begin
|
begin
|
||||||
{
|
|
||||||
<number:number-style style:name="N2">
|
|
||||||
<number:number number:decimal-places="2" number:min-integer-digits="1" />
|
|
||||||
</number:number-style>
|
|
||||||
|
|
||||||
' <number:number-style style:name="N2">
|
|
||||||
<number:number number:min-integer-digits="1" number:grouping="true" number:decimal-places="2"/>
|
|
||||||
</number:number-style>
|
|
||||||
|
|
||||||
' <number:number-style style:name="N2">
|
|
||||||
<number:number number:decimal-places="2" number:min-integer-digits="1" />
|
|
||||||
</number:number-style>
|
|
||||||
}
|
|
||||||
Result := '';
|
Result := '';
|
||||||
|
|
||||||
ListAllNumFormats;
|
ListAllNumFormats;
|
||||||
|
|
||||||
for i:=0 to FNumFormatList.Count-1 do begin
|
for i:=0 to FNumFormatList.Count-1 do begin
|
||||||
parser := TsSpreadOpenDocNumFormatParser.Create(Workbook, FNumFormatList.Items[i].FormatString);
|
fmtItem := FNumFormatList.Items[i];
|
||||||
|
parser := TsSpreadOpenDocNumFormatParser.Create(Workbook, fmtItem.FormatString);
|
||||||
try
|
try
|
||||||
numFmtXML := parser.BuildXMLAsString(' ', 1000+i); //120+i); // Don't know where the user numbers start...
|
numFmtXML := parser.BuildXMLAsString(' ', fmtItem.Name);
|
||||||
if numFmtXML <> '' then
|
if numFmtXML <> '' then
|
||||||
Result := Result + numFmtXML;
|
Result := Result + numFmtXML;
|
||||||
finally
|
finally
|
||||||
|
Reference in New Issue
Block a user