diff --git a/components/fpspreadsheet/examples/other/header_footer_images/demo_read_headerfooter_images.lpi b/components/fpspreadsheet/examples/other/header_footer_images/demo_read_headerfooter_images.lpi new file mode 100644 index 000000000..11e6b0ef7 --- /dev/null +++ b/components/fpspreadsheet/examples/other/header_footer_images/demo_read_headerfooter_images.lpi @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + <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 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/> + </local> + <FormatVersion Value="2"/> + <Modes Count="1"> + <Mode0 Name="default"> + <local> + <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -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> diff --git a/components/fpspreadsheet/examples/other/header_footer_images/demo_read_headerfooter_images.lpr b/components/fpspreadsheet/examples/other/header_footer_images/demo_read_headerfooter_images.lpr new file mode 100644 index 000000000..ab3bd48de --- /dev/null +++ b/components/fpspreadsheet/examples/other/header_footer_images/demo_read_headerfooter_images.lpr @@ -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. + diff --git a/components/fpspreadsheet/source/common/xlsxooxml.pas b/components/fpspreadsheet/source/common/xlsxooxml.pas index cd8c3e300..a8212fc8a 100644 --- a/components/fpspreadsheet/source/common/xlsxooxml.pas +++ b/components/fpspreadsheet/source/common/xlsxooxml.pas @@ -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;