fpspreadsheet: Suppress filler columns in xlsx files by reading the dimensions attribute.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5755 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2017-02-18 19:01:22 +00:00
parent 7e91f6373f
commit b00e9fa332

View File

@ -61,6 +61,7 @@ type
FSharedFormulaBaseList: TFPList; FSharedFormulaBaseList: TFPList;
FPalette: TsPalette; FPalette: TsPalette;
FThemeColors: array of TsColor; FThemeColors: array of TsColor;
FLastRow, FLastCol: Cardinal;
FWrittenByFPS: Boolean; FWrittenByFPS: Boolean;
procedure ApplyCellFormatting(ACell: PCell; XfIndex: Integer); procedure ApplyCellFormatting(ACell: PCell; XfIndex: Integer);
procedure ApplyHyperlinks(AWorksheet: TsWorksheet); procedure ApplyHyperlinks(AWorksheet: TsWorksheet);
@ -74,6 +75,7 @@ type
procedure ReadComments(ANode: TDOMNode; AWorksheet: TsWorksheet); procedure ReadComments(ANode: TDOMNode; AWorksheet: TsWorksheet);
procedure ReadDateMode(ANode: TDOMNode); procedure ReadDateMode(ANode: TDOMNode);
procedure ReadDefinedNames(ANode: TDOMNode); procedure ReadDefinedNames(ANode: TDOMNode);
procedure ReadDimension(ANode: TDOMNode; AWorksheet: TsWorksheet);
procedure ReadFileVersion(ANode: TDOMNode); procedure ReadFileVersion(ANode: TDOMNode);
procedure ReadFills(ANode: TDOMNode); procedure ReadFills(ANode: TDOMNode);
function ReadFont(ANode: TDOMNode): Integer; function ReadFont(ANode: TDOMNode): Integer;
@ -1065,8 +1067,8 @@ begin
end else end else
lCol.FormatIndex := 0; lCol.FormatIndex := 0;
if (lCol.ColWidthType = cwtCustom) or(lCol.FormatIndex > 0) then if (lCol.ColWidthType = cwtCustom) or (lCol.FormatIndex > 0) then
for col := col1 to col2 do for col := col1 to Min(col2, FLastCol) do
AWorksheet.WriteColInfo(col, lCol); AWorksheet.WriteColInfo(col, lCol);
end; end;
colNode := colNode.NextSibling; colNode := colNode.NextSibling;
@ -1221,6 +1223,23 @@ begin
end; end;
end; end;
procedure TsSpreadOOXMLReader.ReadDimension(ANode: TDOMNode;
AWorksheet: TsWorksheet);
var
ref: String;
r1, c1: Cardinal;
begin
FLastRow := MaxInt;
FLastCol := MaxInt;
if ANode = nil then
exit;
ref := GetAttrValue(ANode, 'ref');
if ref <> '' then
ParseCellRangeString(ref, r1, c1, FLastRow, FLastCol);
end;
procedure TsSpreadOOXMLReader.ReadFileVersion(ANode: TDOMNode); procedure TsSpreadOOXMLReader.ReadFileVersion(ANode: TDOMNode);
begin begin
FWrittenByFPS := GetAttrValue(ANode, 'appName') = 'fpspreadsheet'; FWrittenByFPS := GetAttrValue(ANode, 'appName') = 'fpspreadsheet';
@ -2210,6 +2229,7 @@ begin
FSharedFormulaBaseList.Clear; FSharedFormulaBaseList.Clear;
// Sheet data, formats, etc. // Sheet data, formats, etc.
ReadDimension(Doc.DocumentElement.FindNode('dimension'), FWorksheet);
ReadSheetViews(Doc.DocumentElement.FindNode('sheetViews'), FWorksheet); ReadSheetViews(Doc.DocumentElement.FindNode('sheetViews'), FWorksheet);
ReadSheetFormatPr(Doc.DocumentElement.FindNode('sheetFormatPr'), FWorksheet); ReadSheetFormatPr(Doc.DocumentElement.FindNode('sheetFormatPr'), FWorksheet);
ReadCols(Doc.DocumentElement.FindNode('cols'), FWorksheet); ReadCols(Doc.DocumentElement.FindNode('cols'), FWorksheet);