fpspreadsheet: Done - Excel2003/XML format passes all tests.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7058 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2019-07-19 22:42:59 +00:00
parent 4fc6f4949a
commit cb76d86aff
2 changed files with 50 additions and 15 deletions

View File

@ -109,6 +109,8 @@ type
const AValue: TDateTime; ACell: PCell); override; const AValue: TDateTime; ACell: PCell); override;
procedure WriteError(AStream: TStream; const ARow, ACol: Cardinal; procedure WriteError(AStream: TStream; const ARow, ACol: Cardinal;
const AValue: TsErrorValue; ACell: PCell); override; const AValue: TsErrorValue; ACell: PCell); override;
procedure WriteFormula(AStream: TStream; const ARow, ACol: Cardinal;
ACell: PCell); override;
procedure WriteLabel(AStream: TStream; const ARow, ACol: Cardinal; procedure WriteLabel(AStream: TStream; const ARow, ACol: Cardinal;
const AValue: string; ACell: PCell); override; const AValue: string; ACell: PCell); override;
procedure WriteNumber(AStream: TStream; const ARow, ACol: Cardinal; procedure WriteNumber(AStream: TStream; const ARow, ACol: Cardinal;
@ -1407,11 +1409,19 @@ begin
ANode := ANode.NextSibling; ANode := ANode.NextSibling;
end; end;
// The ScalingFactor is always written to the xml file. This makes TsPageLayout if hasFitToPage then begin
// automatically remove the poFitPages option which is restored here. // The ScalingFactor is always written to the xml file. This makes TsPageLayout
if hasFitToPage and (sheet.PageLayout.ScalingFactor <> 100) then begin // automatically remove the poFitPages option which is restored here.
sheet.PageLayout.ScalingFactor := 100; if (sheet.PageLayout.ScalingFactor <> 100) then begin
sheet.Pagelayout.Options := sheet.PageLayout.Options + [poFitPages]; sheet.PageLayout.ScalingFactor := 100;
sheet.Pagelayout.Options := sheet.PageLayout.Options + [poFitPages];
end;
// When FitToPages is active, but FitWidthToPages and/or FitHeightToPages
// are not specified, they should be set to 1
if sheet.PageLayout.FitWidthToPages = 0 then
sheet.PageLayout.FitWidthToPages := 1;
if sheet.PageLayout.FitHeightToPages = 0 then
sheet.PageLayout.FitHeightToPages := 1;
end; end;
end; end;
@ -1774,6 +1784,8 @@ begin
WriteNumber(AStream, ACell^.Row, ACell^.Col, ACell^.NumberValue, ACell); WriteNumber(AStream, ACell^.Row, ACell^.Col, ACell^.NumberValue, ACell);
cctUTF8String: cctUTF8String:
WriteLabel(AStream, ACell^.Row, ACell^.Col, ACell^.UTF8StringValue, ACell); WriteLabel(AStream, ACell^.Row, ACell^.Col, ACell^.UTF8StringValue, ACell);
cctFormula:
WriteFormula(AStream, ACell^.Row, ACell^.Col, ACell);
end; end;
if (FWorksheet as TsWorksheet).ReadComment(ACell) <> '' then if (FWorksheet as TsWorksheet).ReadComment(ACell) <> '' then
@ -1973,6 +1985,32 @@ begin
'</ExcelWorkbook>' + LF); '</ExcelWorkbook>' + LF);
end; end;
procedure TsSpreadExcelXMLWriter.WriteFormula(AStream: TStream;
const ARow, ACol: Cardinal; ACell: PCell);
var
xmlnsStr: String;
dataTagStr: String;
begin
if ACell^.ContentType <> cctFormula then
raise Exception.Create('WriteFormula called for calculated cell.');
xmlnsStr := ' xmlns="http://www.w3.org/TR/REC-html40"';
dataTagStr := ''; // or 'ss:' -- to do...
AppendToStream(AStream, Format(CELL_INDENT +
'<Cell%s%s%s%s%s>' + LF + VALUE_INDENT + // colIndex, style, formula, hyperlink, merge
'<%sData%s>'+ // "ss:", data type, "xmlns=.."
'</%sData>' + LF + CELL_INDENT + // "ss:"
'%s' + // Comment
'</Cell>' + LF, [
GetIndexStr(ACell^.Col, FPrevCol), GetStyleStr(ACell^.FormatIndex), GetFormulaStr(ACell),
GetHyperlinkStr(ACell), GetMergeStr(ACell),
dataTagStr, xmlnsStr,
dataTagStr,
GetCommentStr(ACell)
]));
end;
procedure TsSpreadExcelXMLWriter.WriteLabel(AStream: TStream; const ARow, procedure TsSpreadExcelXMLWriter.WriteLabel(AStream: TStream; const ARow,
ACol: Cardinal; const AValue: string; ACell: PCell); ACol: Cardinal; const AValue: string; ACell: PCell);
const const
@ -2367,12 +2405,10 @@ begin
// Protection // Protection
s := ''; s := '';
if FWorkbook.IsProtected then begin if not (cpLockCell in fmt^.Protection) then
if not (cpLockCell in fmt^.Protection) then s := s + 'ss:Protected="0" ';
s := s + 'ss:Protected="0" '; if cpHideFormulas in fmt^.Protection then
if cpHideFormulas in fmt^.Protection then s := s + 'x:HideFormula="1" ';
s := s + 'x:HideFormula="1" ';
end;
if s <> '' then if s <> '' then
AppendToStream(AStream, INDENT3 + AppendToStream(AStream, INDENT3 +
'<Protection ' + s + '/>' + LF); '<Protection ' + s + '/>' + LF);

View File

@ -94,7 +94,6 @@ type
procedure TestWriteRead_OOXML_WorksheetProtection_Objects; procedure TestWriteRead_OOXML_WorksheetProtection_Objects;
procedure TestWriteRead_OOXML_CellProtection; procedure TestWriteRead_OOXML_CellProtection;
procedure TestWriteRead_OOXML_Passwords; procedure TestWriteRead_OOXML_Passwords;
{ Excedl2003/XML protection tests } { Excedl2003/XML protection tests }
@ -116,6 +115,7 @@ type
procedure TestWriteRead_XML_WorksheetProtection_SelectLockedCells; procedure TestWriteRead_XML_WorksheetProtection_SelectLockedCells;
procedure TestWriteRead_XML_WorksheetProtection_SelectUnlockedCells; procedure TestWriteRead_XML_WorksheetProtection_SelectUnlockedCells;
procedure TestWriteRead_XML_WorksheetProtection_Objects; procedure TestWriteRead_XML_WorksheetProtection_Objects;
procedure TestWriteRead_XML_CellProtection; procedure TestWriteRead_XML_CellProtection;
//procedure TestWriteRead_XML_Passwords; // not allowed //procedure TestWriteRead_XML_Passwords; // not allowed
@ -130,7 +130,6 @@ type
procedure TestWriteRead_ODS_WorksheetProtection_SelectUnlockedCells; procedure TestWriteRead_ODS_WorksheetProtection_SelectUnlockedCells;
procedure TestWriteRead_ODS_CellProtection; procedure TestWriteRead_ODS_CellProtection;
procedure TestWriteRead_ODS_Passwords; procedure TestWriteRead_ODS_Passwords;
end; end;
@ -314,10 +313,10 @@ begin
// A1 --> lock cell // A1 --> lock cell
cell := Myworksheet.WriteText(0, 0, 'Protected'); cell := Myworksheet.WriteText(0, 0, 'Protected');
MyWorksheet.WriteCellProtection(cell, [cpLockCell]); MyWorksheet.WriteCellProtection(cell, [cpLockCell]);
// B1 --> not protected at all // A2 --> not protected at all
cell := MyWorksheet.WriteText(1, 0, 'Not protected'); cell := MyWorksheet.WriteText(1, 0, 'Not protected');
MyWorksheet.WriteCellProtection(cell, []); MyWorksheet.WriteCellProtection(cell, []);
// A2 --> lock cell & hide formulas // B1 --> lock cell & hide formulas
cell := Myworksheet.WriteFormula(0, 1, '=A1'); cell := Myworksheet.WriteFormula(0, 1, '=A1');
MyWorksheet.WriteCellProtection(cell, [cpLockCell, cpHideFormulas]); MyWorksheet.WriteCellProtection(cell, [cpLockCell, cpHideFormulas]);
// B2 --> hide formula only // B2 --> hide formula only