Python办公自动化实战:用docx库生成带自定义宽度表格的Word报告(附完整代码)
·
Python办公自动化实战:用docx库生成带自定义宽度表格的Word报告
在数据驱动的办公场景中,将结构化数据自动转化为格式规范的Word文档是高频需求。想象一下这样的场景:每月底需要从ERP系统导出销售数据,手动复制粘贴到Word模板中调整格式,耗时且容易出错。而Python的docx库正是解决这类重复劳动的利器,特别是当需要生成包含复杂表格的报告时。
1. 环境准备与基础配置
开始前需要安装python-docx库,推荐使用虚拟环境隔离依赖:
pip install python-docx
基础文档创建时,中文字体处理是个容易被忽视的关键点。默认生成的文档使用英文字体,中文会显示为等线体,这不符合国内办公场景的要求。正确的初始化方式应该包含字体配置:
from docx import Document
from docx.oxml.ns import qn
from docx.shared import Pt, Cm
def init_doc():
doc = Document()
# 设置中英文字体
doc.styles['Normal'].font.name = '宋体'
doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
# 设置字号为小四
doc.styles['Normal'].font.size = Pt(12)
return doc
注意:Windows系统需要确保已安装相应字体,Mac系统可能需要额外处理字体映射
2. 表格创建与样式控制
创建表格时,直接使用 add_table 方法会生成一个自动调整宽度的表格。要精确控制表格外观,需要理解几个关键参数:
style: 预定义的表格样式,如'Table Grid'会显示所有边框线alignment: 控制表格在页面中的水平位置autofit: 是否允许自动调整列宽
推荐的生产级表格创建代码如下:
from docx.enum.table import WD_TABLE_ALIGNMENT
def create_formatted_table(doc, rows, cols, col_widths):
table = doc.add_table(rows=rows, cols=cols, style='Table Grid')
table.alignment = WD_TABLE_ALIGNMENT.CENTER
# 设置列宽
for col_idx, width in enumerate(col_widths):
for row_idx in range(rows):
table.cell(row_idx, col_idx).width = Cm(width)
return table
实际使用时,可以这样创建一个3列4行的表格,列宽分别为4cm、6cm、3cm:
doc = init_doc()
table = create_formatted_table(doc, 4, 3, [4, 6, 3])
3. 动态数据填充技巧
从数据库或Excel导入数据后,高效填充到表格中需要一些技巧。以下是几种常见场景的处理方法:
3.1 基础数据填充
data = [
["产品", "季度销量", "增长率"],
["A产品", "1200", "15%"],
["B产品", "980", "8%"],
["C产品", "1500", "22%"]
]
for row_idx, row_data in enumerate(data):
for col_idx, cell_data in enumerate(row_data):
table.cell(row_idx, col_idx).text = cell_data
3.2 带格式的数字填充
当需要控制数字的小数位数或百分比格式时:
from docx.shared import RGBColor
def format_number(cell, value, is_percent=False):
cell.text = f"{value:.2f}%" if is_percent else f"{value:,.2f}"
if is_percent and value > 0:
cell.paragraphs[0].runs[0].font.color.rgb = RGBColor(0, 176, 80)
elif is_percent and value < 0:
cell.paragraphs[0].runs[0].font.color.rgb = RGBColor(255, 0, 0)
3.3 合并单元格处理
制作复杂表头时经常需要合并单元格:
def merge_cells(table, start_row, end_row, start_col, end_col):
for row in range(start_row, end_row):
for col in range(start_col, end_col):
if row > start_row or col > start_col:
table.cell(row, col).merge(table.cell(start_row, start_col))
4. 高级样式与批量生成
4.1 交替行颜色设置
提高表格可读性的有效方法是设置斑马纹:
def set_zebra_stripe(table, even_color, odd_color):
for row_idx, row in enumerate(table.rows):
for cell in row.cells:
shading = cell._element.tcPr.get_or_add_shd()
shading.fill = even_color if row_idx % 2 == 0 else odd_color
调用示例:
set_zebra_stripe(table, "D9EAD3", "FFFFFF") # 浅绿与白色交替
4.2 批量生成多表格报告
当需要生成包含多个数据集的报告时,可以抽象出报告生成器类:
class ReportGenerator:
def __init__(self):
self.doc = init_doc()
def add_section(self, title, data, col_widths):
self.doc.add_heading(title, level=2)
table = create_formatted_table(self.doc, len(data), len(data[0]), col_widths)
# 填充数据...
self.doc.add_paragraph() # 添加空行分隔
def save(self, filename):
self.doc.save(filename)
使用示例:
generator = ReportGenerator()
generator.add_section("销售数据", sales_data, [3, 2, 2, 3])
generator.add_section("库存数据", inventory_data, [4, 3, 3])
generator.save("月度报告.docx")
4.3 添加页眉页脚
专业报告通常需要页眉页脚:
def add_header_footer(doc, header_text, footer_text):
section = doc.sections[0]
header = section.header
footer = section.footer
header_para = header.paragraphs[0]
header_para.text = header_text
header_para.style = doc.styles["Header"]
footer_para = footer.paragraphs[0]
footer_para.text = footer_text
footer_para.style = doc.styles["Footer"]
在实际项目中,我经常遇到需要根据数据长度动态调整行高的情况。一个实用的技巧是通过计算文本长度来估算需要的行高:
def auto_adjust_row_height(table, min_height=1.0):
for row in table.rows:
max_lines = max(
len(cell.text) // 30 for cell in row.cells
) # 假设每行约30个字符
row.height = Cm(min_height + max_lines * 0.5)
更多推荐

所有评论(0)