简介:本文深入探讨如何使用Python操作Word文档(.docx)中的表格与文字,涵盖环境配置、基础操作、进阶技巧及实际应用场景,为开发者提供系统性解决方案。
python-docx是操作Word文档的核心库,通过pip安装:
pip install python-docx
该库支持Word 2007及以上版本的.docx格式,但不兼容旧版.doc文件。安装后可通过import docx验证是否成功。
Word文档由三层结构组成:
通过Document()创建新文档或Document("file.docx")加载现有文档,建立操作入口。
from docx import Documentdoc = Document()# 方式1:指定行列数创建空表table = doc.add_table(rows=3, cols=2)# 方式2:从二维列表创建带内容的表data = [["姓名", "年龄"], ["张三", "25"], ["李四", "30"]]table = doc.add_table(rows=len(data), cols=len(data[0]))for i, row in enumerate(data):for j, cell in enumerate(row):table.cell(i, j).text = cell# 方式3:复制现有表格结构source_table = doc.tables[0] # 假设已存在表格new_table = doc.add_table(rows=source_table.rows, cols=source_table.columns)# 需手动复制内容和格式
table.cell(row_idx, col_idx).text行操作:
# 添加行(在指定位置后插入)new_row = table.add_row()# 或在特定位置插入table.rows[1]._tr.addnext(new_row._tr)# 删除行(需谨慎操作DOM结构)tr = table.rows[2]._trtr.getparent().remove(tr)
cell = table.cell(0, 0)cell.merge(table.cell(1, 1)) # 合并(0,0)到(1,1)
from docx.shared import Pt, RGBColorfrom docx.enum.table import WD_TABLE_ALIGNMENT# 设置表格对齐方式table.alignment = WD_TABLE_ALIGNMENT.CENTER# 设置单元格样式for row in table.rows:for cell in row.cells:# 设置字体for paragraph in cell.paragraphs:for run in paragraph.runs:run.font.name = "微软雅黑"run.font.size = Pt(12)run.font.color.rgb = RGBColor(0x42, 0x24, 0xE9)# 设置背景色shading = cell._element.xpath(".//w:shd")[0]shading.set(docx.oxml.ns.qn("w:fill"), "D3D3D3")
def replace_text_in_table(doc, old_text, new_text):for table in doc.tables:for row in table.rows:for cell in row.cells:if old_text in cell.text:cell.text = cell.text.replace(old_text, new_text)# 处理替换后格式丢失问题for paragraph in cell.paragraphs:if old_text in paragraph.text:inline = paragraph.runsfor i in range(len(inline)):if old_text in inline[i].text:text = inline[i].text.replace(old_text, new_text)inline[i].text = ""inline[i].add_text(text)
from docx.shared import Inches# 插入带格式的文字doc.add_paragraph("标题", style="Heading 1")# 表格内文字格式cell = table.cell(0, 0)cell.text = "" # 清空默认段落para = cell.add_paragraph("重要数据")para.alignment = WD_ALIGN_PARAGRAPH.CENTERrun = para.add_run()run.add_text("(单位:万元)")run.font.italic = True
def sync_table_data(master_table, slave_tables):header = [cell.text for cell in master_table.rows[0].cells]for table in slave_tables:# 同步表头for i, text in enumerate(header):if i < len(table.rows[0].cells):table.cell(0, i).text = text# 同步数据(示例:同步第二列)for row_idx in range(1, min(len(master_table.rows), len(table.rows))):master_value = master_table.cell(row_idx, 1).textif row_idx < len(table.rows):table.cell(row_idx, 1).text = master_value
def generate_sales_report(data, output_path):doc = Document()# 添加标题doc.add_heading("销售数据报表", level=0)# 创建表格table = doc.add_table(rows=len(data)+1, cols=4)table.style = "Table Grid"# 写入表头headers = ["日期", "产品", "销量", "金额"]for i, header in enumerate(headers):table.cell(0, i).text = header# 写入数据for row_idx, item in enumerate(data, start=1):table.cell(row_idx, 0).text = item["date"]table.cell(row_idx, 1).text = item["product"]table.cell(row_idx, 2).text = str(item["quantity"])table.cell(row_idx, 3).text = str(item["amount"])# 添加统计行stats_row = table.add_row()stats_row.cells[0].text = "合计"# 计算合计逻辑...doc.save(output_path)
{{table_data}})使用Python替换占位符为实际表格:
def fill_template(template_path, output_path, table_data):doc = Document(template_path)for para in doc.paragraphs:if "{{table_data}}" in para.text:# 获取插入位置pos = para.text.index("{{table_data}}")front_text = para.text[:pos]back_text = para.text[pos+len("{{table_data}}"):]# 创建表格并插入table = doc.add_table(rows=len(table_data), cols=len(table_data[0]))# 填充表格数据...# 重建段落(因add_table会创建新段落)p = para._elementp.getparent().remove(p)new_p = p.addnext(docx.oxml.shared.OxmlElement("w:p"))new_p.append(docx.oxml.shared.OxmlElement("w:r"))new_p[0].append(docx.oxml.shared.OxmlElement("w:t"))new_p[0][0].text = front_textdoc.save(output_path)
run = paragraph.add_run(“中文内容”)
run.font.name = “微软雅黑”
run._element.rPr.rFonts.set(docx.oxml.ns.qn(“w:eastAsia”), “微软雅黑”)
run.font.size = Pt(12)
### 5.2 表格跨页断裂```python# 设置表格属性防止跨页断裂tbl = table._tbltblPr = tbl.get_or_add_tblPr()tblLayout = tblPr.get_or_add_tblLayout()tblLayout.set(docx.oxml.ns.qn("w:type"), "fixed")cantSplit = tblPr.get_or_add_tblCellMar()cantSplit.set(docx.oxml.ns.qn("w:cantSplit"), "1")
通过系统掌握这些技术点,开发者可以高效实现Word文档的自动化生成与处理,特别适用于财务报表、合同文档、数据分析报告等需要大量表格操作的场景。实际开发中,建议结合具体业务需求构建工具库,持续提升处理效率。