xlsxwriter:如何在单元格中居中放置图像

时间:2018-07-21 18:13:37

标签: python xlsxwriter

我分别使用set_column和set_row设置列和行的大小,如下所示:

my_worksheet.set_column('A:KK', 17)
my_worksheet.set_row(0, 99.6)

我有以下代码可将任意大小的图像打印到单元格上:

width, height = im.size
# Calculate scale: Problematic
x_scale = IMAGE_CELL_SIZE_PX[0]/float(width) 
y_scale = (IMAGE_CELL_SIZE_PX[1] - 5.0)/float(height)
# Calculate offset: Problematic
x_offset = ((IMAGE_CELL_SIZE_PX[0] - width) / 2.0) / x_scale
y_offset = ((IMAGE_CELL_SIZE_PX[1] - 5 - height) / 2.0) / y_scale
worksheet.insert_image(row, col, image_path, {'x_offset': x_offset, 'y_offset': y_offset, 'x_scale': x_scale, 'y_scale': y_scale})

问题是它不起作用。图像尺寸错误,并且图片大多数时候都偏离中心。就像我错过了一个学期。 主要问题是我找不到一种以与机器无关的方式将像素从像素转换为Excel和xlsxwriter长度单位的方法。

我只能通过采用excel单位的set_column设置单元格的宽度,而且我知道图像的尺寸以像素为单位(来自Pillow Image.size)。显然,两者之间的转换取决于机器。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用worksheet._size_col()worksheet._size_row()see here in the code)将基于列或行零的索引转换为像素大小。

要注意的另一件事是Excel根据96的DPI缩放图像。如果图像具有另一个DPI,则应该考虑缩放。这就是XlsxWriter中发生internally以说明Excel缩放的情况:

    # Scale by non 96dpi resolutions.
    width *= 96.0 / x_dpi
    height *= 96.0 / y_dpi