XlsxWriter:工作表对象定位

XlsxWriter 根据对象尺寸、图像 DPI,以及用户指定的缩放比例计算精确坐标,将图像、图表和文本框定位到工作表中。计算还考虑对象跨越行列的高度与宽度,因此即使底层行列改变尺寸或被隐藏,对象仍可保持原始大小。

例如:

import xlsxwriter

workbook = xlsxwriter.Workbook('image.xlsx')
worksheet = workbook.add_worksheet()

# Original image.
worksheet.insert_image('B2', 'logo.png')

# Same size as original, despite row/col changes.
worksheet.insert_image('E8', 'logo.png')

# Make column F narrower.
worksheet.set_column('F:F', 2)

# Hide row 10 (zero indexed).
worksheet.set_row(9, None, None, {'hidden': True})

workbook.close()

可以看到,第二张图跨越了尺寸改变的行列,但两张插入图片的尺寸仍相同。

不过,有两种情况下,图像比例可能随行列变化而改变,下面分别介绍。

自动调整行高导致对象缩放

图片如果跨越某行,而该行因更大字号或自动换行而改变默认高度,图像缩放可能受影响。Excel 加载文件时会根据文本自动计算行高,XlsxWriter 创建文件时无法知道这个高度,因此对象看起来可能尺寸不正确。例如:

import xlsxwriter

workbook = xlsxwriter.Workbook('image.xlsx')
worksheet = workbook.add_worksheet()
wrap_format = workbook.add_format({'text_wrap': True})

worksheet.write('A9', 'Some text that wraps', wrap_format)

worksheet.insert_image('B2', 'logo.png')
worksheet.insert_image('B8', 'logo.png')

workbook.close()

第二张图因为行高自动调整而相对第一张发生畸变。为避免这种情况,如果某行跨越插入对象,应使用 set_row() 明确设置行高。

随单元格移动和改变大小的对象定位

Excel 在工作表中提供三种对象定位选项,见原图。

XlsxWriter 的图像、图表与文本框通过 object_position 参数模拟这些选项:

worksheet.insert_image('B3', 'python.png', {'object_position': 1})

object_position 可取以下值,按顺序对应1到4:

  • 1:随单元格移动并调整大小。
  • 2:随单元格移动,但不调整大小。
  • 3:不随单元格移动,也不调整大小。
  • 4:与选项1相同,但 XlsxWriter 在对象插入之后才应用隐藏单元格的设置。

选项4在 Excel 中显示为选项1,但对象尺寸会考虑隐藏行列。因此可以让图片随其所在单元格隐藏,例如配合自动筛选。示例:

import xlsxwriter

workbook = xlsxwriter.Workbook('image.xlsx')
worksheet = workbook.add_worksheet()

worksheet.insert_image('B2', 'logo.png')
worksheet.insert_image('B9', 'logo.png', {'object_position': 4})

# Hide some rows.
for row in range(1, 13):
    worksheet.set_row(row, None, None, {'hidden': True})

workbook.close()

第一张图在隐藏行上方仍可见,第二张则随行隐藏。在 Excel 中取消隐藏这些行,会重新显示第二张图。

图像尺寸与 DPI

Excel 导入图像时会考虑 DPI,即每英寸点数,并以96 DPI 为基准确定尺寸。72 DPI 的图导入后可能稍大,200 DPI 的图可能约缩小一半。XlsxWriter 同样读取插入图像的 DPI,并按 Excel 的方式存储图像尺寸。无法判断 DPI 时,默认使用96。

报告图片插入问题

XlsxWriter 为了与 Excel 完全一致地插入图像做了大量工作,尽管计算方式和单位复杂。已有80多个测试用例,将结果与 Excel 创建的文件比较,验证处理是否正确。这是原文对项目自身测试的描述。

报告问题前,请先检查同一图片在 Excel 中的表现,而不是 OpenOffice、LibreOffice 或其他第三方应用。如果确实报告,请使用 GitHub 上的 XlsxWriter Issue tracker,并附上可展示问题的图片。(Issue tracker is on GitHub)

_images/object_position1.png
_images/object_position2.png
_images/object_position3.png
_images/object_position4.png

来源:XlsxWriter:工作表对象定位。John McNamara 与 XlsxWriter 贡献者,BSD 2-Clause 许可。 本文依据本批次转载授权译为中文,原始代码与示例输出保留。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容