关于Python-docx操作excel的一些记录

本文介绍了如何使用Python-docx库创建和编辑Word文档,特别是用于生成客户端性能测试报告。通过添加标题、段落、表格等元素,实现了数据对比和展示。此外,还详细讲解了如何设置表格样式,包括添加背景色、合并单元格以及设置单元格文字颜色。最后,提到了调整页面纸张大小的方法,以满足不同报告需求。

背景

最近在做客户端性能测试的提效工作,会把当前版本的性能数据与上个版本的性能数据进行对比,然后把对比结论以及数据,放到docx文档上,自动生成一个性能报告,就学习了相关Python-docx的相关操作,记录如下。

基本介绍

python-docx 是用于创建可修改 微软 Word 的一个 python 库,提供全套的 Word 操作,是最常用的 Word 工具。可以对文档进行更改,包含段落、分页符、表格、图片、标题、样式等几乎所有的word文档中能常用的功能都包含了。只能解析docx文件,解析不了doc文件。python-docx将整个文章看做是一个Document对象,其基本结构如下:

  • 每个Document包含许多个代表“段落”的Paragraph对象,存放在document.paragraphs
  • 每个Paragraph都有许多个代表"行内元素"的Run对象,存放在paragraph.runs

基本的一些使用

from docx import Document as Doc
from docx.document import Document
import os

doc: Document = Doc()

word_path = os.getcwd()
doc.save(os.path.join(word_path, 'demo.docx'))

上面代码,我们引入python-docx 最核心的对象Document,它对应的就是一个word文件,可以通过这个对象来操作word里的一切内容。

  • 标题
doc.add_
在使用 `python-docx` 库处理 Word 文档时,设置表格的列宽以自适应内容是一个常见的需求。然而,`python-docx` 并没有直接提供自动调整列宽的功能,因此需要通过手动计算内容宽度并设置每个列的宽度来实现类似的效果。 ### 手动计算内容宽度并设置列宽 以下是一个示例代码,展示如何根据表格中每一列的最大内容宽度来设置列宽: ```python from docx import Document from docx.shared import Cm def auto_adjust_table_width(table): # 获取表格的列数 num_cols = len(table.columns) # 初始化每列的最大宽度列表 max_col_widths = [0] * num_cols # 遍历表格的所有行和单元格,计算每列的最大内容长度 for row in table.rows: for col_idx, cell in enumerate(row.cells): # 计算当前单元格文本的长度(可以考虑更复杂的逻辑,如字符宽度) text_length = len(cell.text) # 更新对应列的最大宽度 if text_length > max_col_widths[col_idx]: max_col_widths[col_idx] = text_length # 将最大内容长度转换为厘米,并设置每列的宽度 for col_idx in range(num_cols): # 假设每个字符大约占 0.25 厘米,可以根据实际字体大小进行调整 width_in_cm = max_col_widths[col_idx] * 0.25 for cell in table.columns[col_idx].cells: cell.width = Cm(width_in_cm) # 创建一个文档对象 doc = Document() # 添加一个示例表格 table = doc.add_table(rows=3, cols=3) table.style = 'Table Grid' # 填充表格内容 for i in range(3): for j in range(3): table.cell(i, j).text = f"Row {i+1}, Col {j+1}" # 自动调整表格列宽 auto_adjust_table_width(table) # 保存文档 doc.save("adjusted_table.docx") ``` ### 说明 - **字符宽度估算**:上述代码假设每个字符大约占用 0.25 厘米的宽度。这个值可以根据实际使用的字体大小进行调整。如果你使用的是等宽字体(如 Courier),可以使用固定的字符宽度;如果是非等宽字体(如 Times New Roman 或 Arial),可能需要更复杂的逻辑来计算每个字符的实际宽度。 - **遍历所有单元格**:为了确保每列的宽度能够适应该列中最长的内容,代码会遍历整个表格的所有单元格,并记录每列的最大文本长度。 - **设置单元格宽度**:`python-docx` 允许通过 `cell.width` 属性来设置每个单元格的宽度。虽然不能直接对整列设置宽度,但可以通过遍历该列的所有单元格来实现相同的效果[^2]。 - **注意事项**:由于 `python-docx` 的限制,某些高级功能(如自动调整列宽)并不直接支持。如果需要更复杂的功能,可以考虑结合底层 XML 操作或使用其他库(如 `openpyxl` 处理 Excel 文件后再导出为 Word)。 ### 进一步优化 - **多语言支持**:如果表格中包含中文或其他非英文字符,建议根据字符的实际显示宽度进行调整。例如,中文字符通常比英文字符宽,因此可以将中文字符的宽度设为 0.4 厘米,而英文字符保持 0.25 厘米。 - **动态字体支持**:如果你希望根据不同的字体大小动态调整列宽,可以在代码中引入字体大小参数,并根据字体大小调整字符宽度的比例。 - **使用表格样式**:你还可以结合 `python-docx` 提供的表格样式功能,使表格看起来更加美观和专业[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测试老憨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值