fpspreadsheet: the xlsx writer now can write an image hyperlink.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6672 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz 2018-10-05 16:31:14 +00:00
parent 48d37a6351
commit 693ab2f3eb

View File

@ -3977,6 +3977,9 @@ var
roffs1, coffs1, roffs2, coffs2: Double;
x, y, w, h: Double;
descr: String;
hlink: String;
xdr_cNvPr: String;
rId: Integer;
book: TsWorkbook;
sheet: TsWorksheet absolute AWorksheet;
begin
@ -3995,6 +3998,7 @@ begin
'xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">');
// Repeat for each image
rId := 1;
for i:=0 to sheet.GetImageCount - 1 do
begin
img := sheet.GetImage(i);
@ -4008,6 +4012,24 @@ begin
descr := ExtractFileName(book.GetEmbeddedObj(img.index).Filename);
if descr = '' then descr := 'image';
// This part defines the relationship to the graphic and, if available, to
// a hyperlink.
xdr_cNvPr := Format('id="%d" name="Graphic %d" descr="%s"', [i+3,i+2, descr]);
if img.HyperlinkTarget <> '' then begin
hlink := Format('<a:hlinkClick xmlns:r="%s" r:id="rId%d" ', [
SCHEMAS_DOC_RELS, rId
]);
inc(rId);
if img.HyperlinkToolTip <> '' then
hlink := hlink + Format('tooltip="%s" ', [img.HyperlinkToolTip]);
hlink := hlink + '/>';
xdr_cNvPr := '<xdr:cNvPr ' + xdr_cNvPr + '>' +
hlink +
'</xdr:cNvPr>';
end else
xdr_cNvPr := '<xdr:cNvPr ' + xdr_cNvPr + ' />';
AppendToStream(FSDrawings[FCurSheetNum],
'<xdr:twoCellAnchor editAs="oneCell">');
AppendToStream(FSDrawings[FCurSheetNum], Format(
@ -4033,13 +4055,13 @@ begin
AppendToStream(FSDrawings[FCurSheetNum], Format(
'<xdr:pic>'+
'<xdr:nvPicPr>'+
'<xdr:cNvPr id="%d" name="Grafik %d" descr="%s"/>'+ // 1, 2, orig file name
xdr_cNvPr +
'<xdr:cNvPicPr>'+
'<a:picLocks noChangeAspect="1"/>'+
'</xdr:cNvPicPr>'+
'</xdr:nvPicPr>'+
'<xdr:blipFill>'+
'<a:blip xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" r:embed="rId%d" cstate="print"/>'+ // 1
'<a:blip xmlns:r="%s" r:embed="rId%d" cstate="print"/>'+
'<a:stretch>'+
'<a:fillRect/>'+
'</a:stretch>'+
@ -4055,13 +4077,14 @@ begin
'</xdr:spPr>'+
'</xdr:pic>' +
'<xdr:clientData/>', [
i+2, i+1, descr,
i+1,
// i + 3, i+2, descr,
SCHEMAS_DOC_RELS, rId,
mmToEMU(x), mmToEMU(y),
mmToEMU(w), mmToEMU(h)
]));
AppendToStream(FSDrawings[FCurSheetNum],
'</xdr:twoCellAnchor>');
inc(rId, 1);
end;
AppendToStream(FSDrawings[FCurSheetNum],
'</xdr:wsDr>');
@ -4075,6 +4098,9 @@ var
i: Integer;
ext: String;
img: TsImage;
rId: Integer;
hlink, target, bookmark: String;
u: TURI;
sheet: TsWorksheet absolute AWorksheet;
begin
if (sheet.GetImageCount = 0) then
@ -4089,14 +4115,35 @@ begin
'<Relationships xmlns="' + SCHEMAS_RELS + '">' + LineEnding);
// Repeat for each image
rId := 1;
for i:=0 to sheet.GetImageCount - 1 do
begin
img := sheet.GetImage(i);
if img.HyperlinkTarget <> '' then begin
SplitHyperlink(img.HyperlinkTarget, target, bookmark);
if (target <> '') and (pos('file:', target) = 0) then
begin
u := ParseURI(target);
if u.Protocol = '' then
target := '../' + target;
end;
if (bookmark <> '') then
target := target + '#' + bookmark;
AppendToStream(FSDrawingsRels[FCurSheetNum], Format(
' <Relationship Id="rId%d" Type="%s" Target="%s" TargetMode="External"/>' + LineEnding, [
rId, SCHEMAS_HYPERLINK, target
]));
inc(rId);
end;
ext := GetImageTypeExt((FWorkbook as TsWorkbook).GetEmbeddedObj(img.Index).Imagetype);
AppendToStream(FSDrawingsRels[FCurSheetNum], Format(
' <Relationship Id="rId%d" Type="%s" Target="../media/image%d.%s"/>' + LineEnding, [
i+1, SCHEMAS_IMAGE, img.Index+1, ext
' <Relationship Id="rId%d" Type="%s" Target="../media/image%d.%s"/>' + LineEnding, [
rId, SCHEMAS_IMAGE, img.Index+1, ext
]));
inc(rId);
end;
AppendToStream(FSDrawingsRels[FCurSheetNum],