(编辑:这是使用 Python 3.7 和 openpyxl 2.6.1)
因此,我打开将输出 excel 文件重命名为 zip 文件,并在那里找到“drawing1.xml”,我可以看到它正在使用 OneCellAnchor。因此,按照 Charlie 的建议,我深入研究了 openpyxl 代码,发现有一个我可以使用的 AbsoluteAnchor 类。为了设置位置,我需要导入 XDR 坐标,然后从 utils.units 中导入一些从像素/厘米到 EMU 的转换函数(excel 测量单位?)。然后我将图像锚点设置为绝对并给出位置和“ext”(尺寸)。
from openpyxl import Workbook
from openpyxl.drawing.image import Image
from openpyxl.drawing.spreadsheet_drawing import AbsoluteAnchor
from openpyxl.drawing.xdr import XDRPoint2D, XDRPositiveSize2D
from openpyxl.utils.units import pixels_to_EMU, cm_to_EMU
wb = Workbook()
ws = wb.active
img = Image('image.png')
p2e = pixels_to_EMU
h, w = img.height, img.width
position = XDRPoint2D(p2e(500), p2e(500))
size = XDRPositiveSize2D(p2e(w), p2e(h))
img.anchor = AbsoluteAnchor(pos=position, ext=size)
ws.add_image(img)
wb.save('test.xlsx')
但这仍然很麻烦,因为我需要知道我想要放置的每个图像的绝对坐标...理想情况下,我仍然希望它锚定到一个单元格,但随后能够在单元格内更精细地移动它。就在那时我注意到 OneCellAnchor 有一个偏移量参数。这太完美了,然后我用测量的默认 Excel 单元格的厘米高度和宽度制作了 lambda 函数。
from openpyxl.drawing.spreadsheet_drawing import OneCellAnchor, AnchorMarker
c2e = cm_to_EMU
# Calculated number of cells width or height from cm into EMUs
cellh = lambda x: c2e((x * 49.77)/99)
cellw = lambda x: c2e((x * (18.65-1.71))/10)
# Want to place image in row 5 (6 in excel), column 2 (C in excel)
# Also offset by half a column.
column = 2
coloffset = cellw(0.5)
row = 5
rowoffset = cellh(0.5)
marker = AnchorMarker(col=column, colOff=coloffset, row=row, rowOff=rowoffset)
img.anchor = OneCellAnchor(_from=marker, ext=size)
ws.add_image(img)
wb.save('test.xlsx')
其产生:
完美的!正是我正在寻找的精度:)