fpspreadsheet: Support image scaling factor when reading images from xlsx.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8328 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2022-06-26 17:38:08 +00:00
parent 78332efef7
commit 93b4393d86

View File

@ -2663,6 +2663,9 @@ var
data: TEmbeddedObjData; data: TEmbeddedObjData;
SheetRels: TStrings; SheetRels: TStrings;
sheetData: TSheetData; sheetData: TSheetData;
w, h: Double;
img: TsEmbeddedObj;
scaleX, scaleY: Double;
begin begin
SheetRels := TStringList.Create; SheetRels := TStringList.Create;
try try
@ -2735,11 +2738,27 @@ begin
data := TEmbeddedObjData(FEmbeddedObjList[i]); data := TEmbeddedObjData(FEmbeddedObjList[i]);
sheet := TsWorksheet(data.Worksheet); sheet := TsWorksheet(data.Worksheet);
if (sheet <> nil) and (data.ImgIndex > -1) then if (sheet <> nil) and (data.ImgIndex > -1) then
begin
img := TsWorkbook(FWorkbook).GetEmbeddedObj(data.ImgIndex);
w := -data.FromColOffs + data.ToColOffs;
h := -data.FromRowOffs + data.ToRowOffs;
for j := data.FromCol to data.ToCol-1 do
w := w + sheet.GetColWidth(j, suMillimeters);
for j := data.FromRow to data.ToRow-1 do
h := h + sheet.GetRowHeight(j, suMillimeters);
scaleX := w / img.ImageWidth;
scaleY := h / img.ImageHeight;
// Scale factor calculation is very inaccurate. We try to round to integers
if (scaleX > 0.99) and SameValue(scaleX, round(scaleX), 0.01) then
scaleX := round(scaleX);
if (scaleY > 0.99) and SameValue(scaleY, round(scaleY), 0.01) then
scaleY := round(scaleY);
sheet.WriteImage(data.FromRow, data.FromCol, sheet.WriteImage(data.FromRow, data.FromCol,
data.ImgIndex, data.ImgIndex,
data.FromRowOffs, data.FromColOffs data.FromRowOffs, data.FromColOffs,
scaleX, scaleY
); );
// to do: ScaleX, ScaleY, ASize end;
end; end;
finally finally
doc.Free; doc.Free;