fpspreadsheet: Support defined names in ods files. No formula support so far.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9398 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
parent
19e94158df
commit
7735590b99
@ -231,6 +231,7 @@ type
|
|||||||
public
|
public
|
||||||
procedure CopyFrom(AItem: TsDefinedName);
|
procedure CopyFrom(AItem: TsDefinedName);
|
||||||
function RangeAsString: String;
|
function RangeAsString: String;
|
||||||
|
function RangeAsString_ODS: String;
|
||||||
property Name: String read FName;
|
property Name: String read FName;
|
||||||
property Range: TsCellRange read FRange write FRange;
|
property Range: TsCellRange read FRange write FRange;
|
||||||
property SheetName1: String read FSheet1 write FSheet1;
|
property SheetName1: String read FSheet1 write FSheet1;
|
||||||
@ -1850,11 +1851,19 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
// Test!$C$3
|
||||||
function TsDefinedName.RangeAsString: String;
|
function TsDefinedName.RangeAsString: String;
|
||||||
begin
|
begin
|
||||||
Result := GetCellRangeString(FSheet1, FSheet2, FRange.Row1, FRange.Col1, FRange.Row2, FRange.Col2, [], true);
|
Result := GetCellRangeString(FSheet1, FSheet2, FRange.Row1, FRange.Col1, FRange.Row2, FRange.Col2, [], true);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
// $Test.$C$3
|
||||||
|
function TsDefinedName.RangeAsString_ODS: String;
|
||||||
|
begin
|
||||||
|
Result := Format('$%s.%s', [FSheet1, GetCellString(FRange.Row1, FRange.Col1, [])]);
|
||||||
|
if (FSheet1 <> FSheet2) or (FRange.Row1 <> FRange.Row2) or (FRange.Col1 <> FRange.Col2) then
|
||||||
|
Result := Format('%s:$%s.%s', [Result, FSheet2, GetCellString(FRange.Row2, FRange.Col2, [])]);
|
||||||
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{ TsDefinedNames }
|
{ TsDefinedNames }
|
||||||
|
@ -42,7 +42,7 @@ uses
|
|||||||
laz2_xmlread, laz2_DOM,
|
laz2_xmlread, laz2_DOM,
|
||||||
avglvltree, math, dateutils, contnrs,
|
avglvltree, math, dateutils, contnrs,
|
||||||
{$IFDEF FPS_PATCHED_ZIPPER} fpszipper, {$ELSE} zipper, {$ENDIF}
|
{$IFDEF FPS_PATCHED_ZIPPER} fpszipper, {$ELSE} zipper, {$ENDIF}
|
||||||
fpstypes, fpsReaderWriter, fpsUtils, fpsHeaderFooterParser,
|
fpsTypes, fpsReaderWriter, fpsUtils, fpsClasses, fpsHeaderFooterParser,
|
||||||
fpsNumFormat, fpsXMLCommon,
|
fpsNumFormat, fpsXMLCommon,
|
||||||
{$IFDEF FPS_CHARTS} fpsChart, {$ENDIF}
|
{$IFDEF FPS_CHARTS} fpsChart, {$ENDIF}
|
||||||
fpsPagelayout;
|
fpsPagelayout;
|
||||||
@ -160,6 +160,7 @@ type
|
|||||||
procedure ReadColumnStyle(AStyleNode: TDOMNode);
|
procedure ReadColumnStyle(AStyleNode: TDOMNode);
|
||||||
procedure ReadConditionalFormats(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
|
procedure ReadConditionalFormats(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
|
||||||
procedure ReadDateMode(SpreadSheetNode: TDOMNode);
|
procedure ReadDateMode(SpreadSheetNode: TDOMNode);
|
||||||
|
procedure ReadDefinedNames(ANode: TDOMNode);
|
||||||
procedure ReadDocumentProtection(ANode: TDOMNode);
|
procedure ReadDocumentProtection(ANode: TDOMNode);
|
||||||
procedure ReadFont(ANode: TDOMNode; var AFontName: String;
|
procedure ReadFont(ANode: TDOMNode; var AFontName: String;
|
||||||
var AFontSize: Single; var AFontStyle: TsFontStyles; var AFontColor: TsColor;
|
var AFontSize: Single; var AFontStyle: TsFontStyles; var AFontColor: TsColor;
|
||||||
@ -290,6 +291,7 @@ type
|
|||||||
function WriteConditionalStyleXMLAsString(ACFIndex: Integer): String;
|
function WriteConditionalStyleXMLAsString(ACFIndex: Integer): String;
|
||||||
function WriteDefaultFontXMLAsString: String;
|
function WriteDefaultFontXMLAsString: String;
|
||||||
function WriteDefaultGraphicStyleXMLAsString: String; overload;
|
function WriteDefaultGraphicStyleXMLAsString: String; overload;
|
||||||
|
function WriteDefinedNameXMLAsString(ADefinedName: TsDefinedName): String;
|
||||||
function WriteDocumentProtectionXMLAsString: String;
|
function WriteDocumentProtectionXMLAsString: String;
|
||||||
function WriteFontStyleXMLAsString(const AFormat: TsCellFormat): String; overload;
|
function WriteFontStyleXMLAsString(const AFormat: TsCellFormat): String; overload;
|
||||||
function WriteHeaderFooterFontXMLAsString(AFont: TsHeaderFooterFont): String;
|
function WriteHeaderFooterFontXMLAsString(AFont: TsHeaderFooterFont): String;
|
||||||
@ -334,6 +336,7 @@ type
|
|||||||
|
|
||||||
{ Routines to write those files }
|
{ Routines to write those files }
|
||||||
procedure WriteContent;
|
procedure WriteContent;
|
||||||
|
procedure WriteDefinedNames(AStream: TStream);
|
||||||
procedure WriteMetaInfManifest;
|
procedure WriteMetaInfManifest;
|
||||||
procedure WriteMeta;
|
procedure WriteMeta;
|
||||||
procedure WriteMimetype;
|
procedure WriteMimetype;
|
||||||
@ -380,7 +383,7 @@ implementation
|
|||||||
uses
|
uses
|
||||||
StrUtils, Variants, LazFileUtils, URIParser, LazUTF8,
|
StrUtils, Variants, LazFileUtils, URIParser, LazUTF8,
|
||||||
{%H-}fpsPatches,
|
{%H-}fpsPatches,
|
||||||
fpsStrings, fpsStreams, fpsCrypto, fpsClasses, fpSpreadsheet,
|
fpsStrings, fpsStreams, fpsCrypto, fpSpreadsheet,
|
||||||
fpsExprParser, fpsImages,
|
fpsExprParser, fpsImages,
|
||||||
{$IFDEF FPS_CHARTS}
|
{$IFDEF FPS_CHARTS}
|
||||||
fpsOpenDocumentChart,
|
fpsOpenDocumentChart,
|
||||||
@ -2628,6 +2631,39 @@ begin
|
|||||||
raise EFPSpreadsheetReader.CreateFmt('Spreadsheet file corrupt: cannot handle null-date format %s', [NullDateSetting]);
|
raise EFPSpreadsheetReader.CreateFmt('Spreadsheet file corrupt: cannot handle null-date format %s', [NullDateSetting]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TsSpreadOpenDocReader.ReadDefinedNames(ANode: TDOMNode);
|
||||||
|
var
|
||||||
|
book: TsWorkbook;
|
||||||
|
nodeName: String;
|
||||||
|
defName: String;
|
||||||
|
defAddr: String;
|
||||||
|
r1, c1, r2, c2: Cardinal;
|
||||||
|
sheet1, sheet2: String;
|
||||||
|
flags: TsRelFlags;
|
||||||
|
begin
|
||||||
|
if ANode = nil then
|
||||||
|
exit;
|
||||||
|
|
||||||
|
ANode := ANode.FindNode('table:named-expressions');
|
||||||
|
if ANode = nil then
|
||||||
|
exit;
|
||||||
|
|
||||||
|
book := TsWorkbook(FWorkbook);
|
||||||
|
ANode := ANode.FirstChild;
|
||||||
|
while ANode <> nil do
|
||||||
|
begin
|
||||||
|
nodeName := ANode.NodeName;
|
||||||
|
if nodeName = 'table:named-range' then
|
||||||
|
begin
|
||||||
|
defName := GetAttrValue(ANode, 'table:name');
|
||||||
|
defAddr := GetAttrValue(ANode, 'table:cell-range-address');
|
||||||
|
if TryStrToCellRange_ODS(defAddr, sheet1, sheet2, r1, c1, r2, c2, flags) then
|
||||||
|
book.DefinedNames.Add(defName, sheet1, sheet2, r1, c1, r2, c2);
|
||||||
|
end;
|
||||||
|
ANode := ANode.NextSibling;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TsSpreadOpenDocReader.ReadDocumentProtection(ANode: TDOMNode);
|
procedure TsSpreadOpenDocReader.ReadDocumentProtection(ANode: TDOMNode);
|
||||||
var
|
var
|
||||||
cinfo: TsCryptoInfo;
|
cinfo: TsCryptoInfo;
|
||||||
@ -3154,6 +3190,7 @@ begin
|
|||||||
TableNode := TableNode.NextSibling;
|
TableNode := TableNode.NextSibling;
|
||||||
end; //while Assigned(TableNode)
|
end; //while Assigned(TableNode)
|
||||||
|
|
||||||
|
ReadDefinedNames(SpreadSheetNode);
|
||||||
FreeAndNil(Doc);
|
FreeAndNil(Doc);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -6659,6 +6696,8 @@ begin
|
|||||||
for i := 0 to (Workbook as TsWorkbook).GetWorksheetCount - 1 do
|
for i := 0 to (Workbook as TsWorkbook).GetWorksheetCount - 1 do
|
||||||
WriteWorksheet(FSContent, i);
|
WriteWorksheet(FSContent, i);
|
||||||
|
|
||||||
|
WriteDefinedNames(FSContent);
|
||||||
|
|
||||||
AppendToStream(FSContent,
|
AppendToStream(FSContent,
|
||||||
'</office:spreadsheet>' +
|
'</office:spreadsheet>' +
|
||||||
'</office:body>' +
|
'</office:body>' +
|
||||||
@ -6666,6 +6705,23 @@ begin
|
|||||||
);
|
);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TsSpreadOpenDocWriter.WriteDefinedNames(AStream: TStream);
|
||||||
|
var
|
||||||
|
book: TsWorkbook;
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
book := TsWorkbook(FWorkbook);
|
||||||
|
if book.DefinedNames.Count = 0 then
|
||||||
|
exit;
|
||||||
|
|
||||||
|
AppendToStream(AStream, '<table:named-expressions>');
|
||||||
|
|
||||||
|
for i := 0 to book.DefinedNames.Count-1 do
|
||||||
|
AppendToStream(AStream, WriteDefinedNameXMLAsString(book.DefinedNames[i]));
|
||||||
|
|
||||||
|
AppendToStream(AStream, '</table:named-expressions>');
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TsSpreadOpenDocWriter.WriteWorksheet(AStream: TStream;
|
procedure TsSpreadOpenDocWriter.WriteWorksheet(AStream: TStream;
|
||||||
ASheetIndex: Integer);
|
ASheetIndex: Integer);
|
||||||
begin
|
begin
|
||||||
@ -8691,6 +8747,17 @@ begin
|
|||||||
Result := '';
|
Result := '';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TsSpreadOpenDocWriter.WriteDefinedNameXMLAsString(ADefinedName: TsDefinedName): String;
|
||||||
|
begin
|
||||||
|
Result := Format(
|
||||||
|
'<table:named-range ' +
|
||||||
|
'table:name="%s" ' +
|
||||||
|
'table:base-cell-address="$%s.$A$1" ' +
|
||||||
|
'table:cell-range-address="%s" />',
|
||||||
|
[ ADefinedName.Name, ADefinedName.SheetName1, ADefinedName.RangeAsString_ODS ]
|
||||||
|
);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TsSpreadOpenDocWriter.WriteError(AStream: TStream;
|
procedure TsSpreadOpenDocWriter.WriteError(AStream: TStream;
|
||||||
const ARow, ACol: Cardinal; const AValue: TsErrorValue; ACell: PCell);
|
const ARow, ACol: Cardinal; const AValue: TsErrorValue; ACell: PCell);
|
||||||
var
|
var
|
||||||
|
Loading…
Reference in New Issue
Block a user