我正在尝试复制和自动化工作中的一种常用做法:我试图在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”。我还没有找到让它接受(或从中转换)像素坐标的任何方法。但是,如果我能做到这一点,那么我想我可以将单元格中的图像和文本格式化为清晰/可以接受(如果不是很漂亮)的水平。
openpyxl.drawing.image 和 openpyxl.worksheet.worksheet 都不具有我可以看到的绝对锚点方法。 openpyxl.drawing.spreadsheet_drawing 可以,但是我不确定是否或如何使用它。
有没有办法做到这一点?还是我有另一种无法实现这一目标的方法?
答案 0 :(得分:2)
(编辑:这是在python 3.7和openpyxl 2.6.1中使用的)
因此,我打开了将输出excel文件重命名为zip文件的操作,并在其中找到“ drawing1.xml”,可以看到它正在使用OneCellAnchor。因此,按照查理的建议,我更深入地研究了openpyxl代码,发现有一个我可以使用的AbsoluteAnchor类。要设置位置,我需要导入XDR坐标,然后从utils.units导入一些从像素/厘米到EMU的转换功能(excel测量单位?)。然后,我只是将图像锚定为绝对,并给出了位置和“ ext”(尺寸)。
abc <- data.frame(a=1:3)
for (i in 1:10){
abc <- abc %>%
add_column(!! paste0("new",i) := 1:nrow(.))
}
但是这仍然很麻烦,因为我需要知道我想放置的每个图像的绝对坐标...理想情况下,我仍然希望将其锚定到单元格上,但是能够在其中精细移动它一个细胞。从那时起,我注意到OneCellAnchor具有offset参数。这是完美的,然后我使用测量的默认excel单元的厘米高度和宽度制作了lambda函数。
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
positie = XDRPoint2D(p2e(500), p2e(500))
size = XDRPositiveSize2D(p2e(h), p2e(w))
img.anchor = AbsoluteAnchor(pos=position, ext=size)
ws.add_image(img)
wb.save('test.xlsx')
哪个产生:
完美!正是我想要的精度:)