python - 使用 openpyxl 可以实现更精确的图像放置吗? (像素坐标而不是单元坐标?)

标签 python openpyxl

我正在尝试复制和自动化工作中常用的实践:我正在尝试在 openpyxl 的单元格中放置多个图像和文本,但是我只能将图像锚定到单元格的左上角,并且没有找到比这更准确的定位方法。因此它们最终会与彼此和文本重叠。

from openpyxl import Workbook
from openpyxl.drawing.image import Image

wb = Workbook()
ws = wb.active
img = Image('image.png')
ws.add_image(img, 'B2') # img.anchor is now 'B2'
wb.save('test.xlsx')

在上面的例子中是“B2”。我还没有找到任何方法让它获取(或转换)像素坐标。但如果我能做到这一点,那么我想我可以将单元格内的图像和文本格式设置为清晰/可接受(如果不漂亮)的水平。

Mock example of eventual desired output

openpyxl.drawing.imageopenpyxl.worksheet.worksheet 都没有我可以看到的绝对锚定方法。 <强> openpyxl.drawing.spreadsheet_drawing 确实如此,但我不确定是否或如何使用它。

有办法做到这一点吗?还是我忽略了另一种方法来实现这一目标?

最佳答案

(编辑:这是使用 Python 3.7 和 openpyxl 2.6.1)

因此,我打开将输出 excel 文件重命名为 zip 文件,并在那里找到“drawing1.xml”,我可以看到它正在使用 OneCellAnchor。因此,按照 Charlie 的建议,我深入研究了 openpyxl 代码,发现有一个我可以使用的 AbsoluteAnchor 类。为了设置位置,我需要导入 XDR 坐标,然后从 utils.units 中导入一些从像素/厘米到 EMU 的转换函数(excel 测量单位?)。然后我将图像 anchor 设置为绝对并给出位置和“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')

产生:

enter image description here

完美!正是我正在寻找的精度:)

关于python - 使用 openpyxl 可以实现更精确的图像放置吗? (像素坐标而不是单元坐标?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55309671/

相关文章:

python - 如何用python比较不同列中的同一行?

通过条件给定的定界符将列表拆分为多个部分的 Pythonic 方法

python - 在 python 中读取 .xlsx 格式

python-2.7 - Openpyxl 更改图表的维度

python - 在 Python 3 中使用 OpenPyXL 复制整个列

python 将小时数组添加到日期时间

python - 如何以编程方式将单圈时间分组以最小化差异?

python - 将 Python 列表传递给嵌入式 Rust 函数

python - 如何知道 openpyxl 是否使用 defusedxml?

python - 使用 openpyxl 保存更改