fpspreadsheet: xlsx reader adds header/footer images to PageLayout.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8335 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2022-07-03 18:02:59 +00:00
parent 8d501a99b2
commit 702fd643f3
3 changed files with 196 additions and 2 deletions

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
<MainUnitHasScaledStatement Value="False"/>
<LRSInOutputDirectory Value="False"/>
<CompatibilityMode Value="True"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="demo_read_headerfooter_images"/>
<UseAppBundle Value="False"/>
</General>
<BuildModes Count="1">
<Item1 Name="default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
</PublishOptions>
<RunParams>
<local>
<LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T &apos;Lazarus Run Output&apos; -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/>
</local>
<FormatVersion Value="2"/>
<Modes Count="1">
<Mode0 Name="default">
<local>
<LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T &apos;Lazarus Run Output&apos; -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/>
</local>
</Mode0>
</Modes>
</RunParams>
<RequiredPackages Count="1">
<Item1>
<PackageName Value="LazUtils"/>
</Item1>
</RequiredPackages>
<Units Count="1">
<Unit0>
<Filename Value="demo_read_headerfooter_images.lpr"/>
<IsPartOfProject Value="True"/>
</Unit0>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="demo_read_headerfooter_images"/>
</Target>
<SearchPaths>
<IncludeFiles Value="..\..\..\source"/>
<OtherUnitFiles Value="..\..\..\source\common"/>
<UnitOutputDirectory Value="..\..\lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Parsing>
<SyntaxOptions>
<UseAnsiStrings Value="False"/>
</SyntaxOptions>
</Parsing>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
<UseExternalDbgSyms Value="True"/>
</Debugging>
</Linking>
</CompilerOptions>
</CONFIG>

View File

@ -0,0 +1,98 @@
program demo_read_headerfooter_images;
{$mode delphi}{$H+}
uses
Classes, SysUtils, fpstypes, fpspreadsheet, fpsallformats, fpsutils,
fpsImages, fpsPageLayout;
var
workbook: TsWorkbook;
worksheet: TsWorksheet;
i: Integer;
hfs: TsHeaderFooterSectionIndex;
img: TsEmbeddedObj;
const
FILE_NAME = 'hfimg';
function hfsToStr(idx: TsHeaderFooterSectionIndex): String;
begin
case idx of
hfsLeft: Result := 'left';
hfsCenter: Result := 'center';
hfsRight: Result := 'right';
end;
end;
begin
Writeln('Starting program "demo_read_headerfooter_images"...');
WriteLn;
// Create the spreadsheet
workbook := TsWorkbook.Create;
try
workbook.ReadFromFile(FILE_NAME + '.xlsx', sfOOXML);
for i := 0 to workbook.GetWorksheetCount-1 do
begin
worksheet := workbook.GetWorksheetByIndex(i);
WriteLn('Worksheet "', worksheet.Name, '", PageLayout:');
WriteLn(' HeaderMargin: ', worksheet.Pagelayout.HeaderMargin:6:1, ' mm');
WriteLn(' TopMargin : ', worksheet.Pagelayout.TopMargin:6:1, ' mm');
WriteLn(' Headers:');
WriteLn(' first page: ', worksheet.PageLayout.Headers[0]);
WriteLn(' odd or all pages: ', worksheet.PageLayout.Headers[1]);
WriteLn(' even pages:', worksheet.PageLayout.Headers[2]);
for hfs in TsHeaderFooterSectionIndex do
begin
Write(' Images ', hfsToStr(hfs), ': ');
if worksheet.PageLayout.HeaderImages[hfs].Index = -1 then
WriteLn('(none)')
else
begin
img := workbook.GetEmbeddedObj(worksheet.PageLayout.HeaderImages[hfs].Index);
if img = nil then
WriteLn('image not found')
else
WriteLn(img.FileName);
end;
end;
WriteLn(' Footers:');
WriteLn(' first page: ', worksheet.PageLayout.Footers[0]);
WriteLn(' odd or all pages: ', worksheet.PageLayout.Footers[1]);
WriteLn(' even pages: ', worksheet.PageLayout.Footers[2]);
for hfs in TsHeaderFooterSectionIndex do
begin
Write (' Images ', hfsToStr(hfs), ': ');
if worksheet.PageLayout.FooterImages[hfs].Index = -1 then
WriteLn('(none)')
else
begin
img := workbook.GetEmbeddedObj(worksheet.PageLayout.FooterImages[hfs].Index);
if img = nil then
WriteLn('image not found')
else
WriteLn(img.FileName);
end;
end;
WriteLn;
end;
if workbook.ErrorMsg <> '' then
WriteLn(workbook.ErrorMsg);
WriteLn('Finished.');
if ParamCount = 0 then
begin
{$IFDEF MSWINDOWS}
WriteLn('Press [ENTER] to close this program...');
ReadLn;
{$ENDIF}
end;
finally
workbook.Free;
end;
end.

View File

@ -402,7 +402,7 @@ type
FromRow, FromCol, ToRow, ToCol: Cardinal;
FromRowOffs, FromColOffs, ToRowOffs, ToColOffs: Double;
// This part is for header/footer images.
// ... to be completed ...
HFImgPosition: string; // 'LH', 'CH', 'RH', 'LF', 'CF', 'RF';
end;
THyperlinkListData = class
@ -2662,6 +2662,7 @@ var
w, h: Double;
img: TsEmbeddedObj;
scaleX, scaleY: Double;
pageIdx: Integer;
begin
doc := nil;
j := 1;
@ -2719,7 +2720,24 @@ begin
img := TsWorkbook(FWorkbook).GetEmbeddedObj(data.ImgIndex);
if data.IsHeaderFooter then
begin
// to do: add header/footer processing here.
if data.HFImgPosition <> '' then
begin
pageIdx := HEADER_FOOTER_INDEX_ALL; // wp: Don't know which is the correct index...
case data.HFImgPosition[2] of
'H':
case data.HFImgPosition[1] of
'L': sheet.PageLayout.AddHeaderImage(pageIdx, hfsLeft, data.ImgIndex);
'C': sheet.PageLayout.AddHeaderImage(pageIdx, hfsCenter, data.ImgIndex);
'R': sheet.PageLayout.AddHeaderImage(pageIdx, hfsRight, data.ImgIndex);
end;
'F':
case data.HFImgPosition[1] of
'L': sheet.PageLayout.AddFooterImage(pageIdx, hfsLeft, data.ImgIndex);
'C': sheet.PageLayout.AddFooterImage(pageIdx, hfsCenter, data.ImgIndex);
'R': sheet.PageLayout.AddFooterImage(pageIdx, hfsRight, data.ImgIndex);
end;
end;
end;
end else
begin
w := -data.FromColOffs + data.ToColOffs;
@ -4030,13 +4048,18 @@ var
relID: String;
title: String;
data: TEmbeddedObjData;
id: String;
begin
ANode := ANode.FirstChild;
while Assigned(ANode) do
begin
id := '';
relID := '';
title := '';
nodeName := ANode.NodeName;
if nodeName = 'v:shape' then
begin
id := GetAttrValue(ANode, 'id');
node := ANode.FirstChild;
while Assigned(node) do
begin
@ -4065,6 +4088,7 @@ begin
data.ImgIndex := -1;
data.Worksheet := AWorksheet;
data.IsHeaderFooter := true;
data.HFImgPosition := id;
FEmbeddedObjList.Add(data);
end;
end;