本文目录导读:

我来详细介绍几种在Python中生成Word文档表格的方法:
使用 python-docx 库 (最常用)
安装
pip install python-docx
基本用法
from docx import Document
from docx.shared import Inches, Pt, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
def create_simple_table():
# 创建文档
doc = Document()
# 添加标题
doc.add_heading('员工信息表', level=1)
# 创建表格 (2行3列)
table = doc.add_table(rows=2, cols=3)
table.style = 'Table Grid' # 应用表格样式
# 填充表头
headers = ['姓名', '年龄', '部门']
for i, header in enumerate(headers):
cell = table.rows[0].cells[i]
cell.text = header
# 设置表头加粗
for paragraph in cell.paragraphs:
for run in paragraph.runs:
run.bold = True
# 填充数据
data = ['张三', '28', '技术部']
for i, value in enumerate(data):
table.rows[1].cells[i].text = value
doc.save('simple_table.docx')
create_simple_table()
从数据源创建表格
from docx import Document
from docx.shared import Pt, RGBColor
from docx.enum.table import WD_TABLE_ALIGNMENT
def create_from_data():
doc = Document()
doc.add_heading('销售数据报表', level=1)
# 准备数据
data = [
['产品', '销量', '单价', '总价'],
['手机', '100', '2999', '299900'],
['电脑', '50', '4999', '249950'],
['平板', '80', '1999', '159920'],
]
# 创建表格
table = doc.add_table(rows=len(data), cols=len(data[0]))
table.style = 'Light Grid Accent 1'
table.alignment = WD_TABLE_ALIGNMENT.CENTER
# 填充数据
for row_idx, row_data in enumerate(data):
for col_idx, cell_value in enumerate(row_data):
cell = table.rows[row_idx].cells[col_idx]
cell.text = str(cell_value)
doc.save('sales_table.docx')
create_from_data()
高级表格样式设置
from docx import Document
from docx.shared import Inches, Pt, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn, nsdecls
from docx.oxml import parse_xml
def create_styled_table():
doc = Document()
doc.add_heading('格式化表格', level=1)
# 创建表格
table = doc.add_table(rows=4, cols=4)
table.style = 'Table Grid'
# 设置列宽
for row in table.rows:
row.cells[0].width = Cm(3)
row.cells[1].width = Cm(4)
row.cells[2].width = Cm(3)
row.cells[3].width = Cm(4)
# 填充数据
headers = ['日期', '项目', '金额', '备注']
data = [
['2024-01-01', '项目A', '1000', '完成'],
['2024-01-02', '项目B', '2000', '进行中'],
['2024-01-03', '项目C', '3000', '待确认'],
]
# 设置表头样式
for i, header in enumerate(headers):
cell = table.rows[0].cells[i]
cell.text = header
cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
# 设置表头背景色
shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="4472C4"/>')
cell._tc.get_or_add_tcPr().append(shading)
# 设置字体颜色
for paragraph in cell.paragraphs:
for run in paragraph.runs:
run.font.color.rgb = RGBColor(255, 255, 255)
run.font.bold = True
# 填充数据行
for row_idx, row_data in enumerate(data, 1):
for col_idx, value in enumerate(row_data):
cell = table.rows[row_idx].cells[col_idx]
cell.text = value
cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
# 交替行背景色
if row_idx % 2 == 0:
shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="D9E2F3"/>')
cell._tc.get_or_add_tcPr().append(shading)
doc.save('styled_table.docx')
create_styled_table()
合并单元格
from docx import Document
from docx.shared import Pt
def create_merged_table():
doc = Document()
doc.add_heading('合并单元格表格', level=1)
# 创建表格 (5行4列)
table = doc.add_table(rows=5, cols=4)
table.style = 'Table Grid'
# 填充表头
headers = ['分类', '项目', '数值', '备注']
for i, header in enumerate(headers):
table.rows[0].cells[i].text = header
# 合并单元格示例
# 合并第一列的第2-4行
table.rows[1].cells[0].merge(table.rows[3].cells[0])
# 填充合并后的单元格
table.rows[1].cells[0].text = '总分类'
# 填充其他数据
data = [
['', '子项1', '100', '正常'],
['', '子项2', '200', '正常'],
['', '子项3', '300', '异常'],
]
for row_idx, row_data in enumerate(data, 1):
for col_idx, value in enumerate(row_data):
if col_idx > 0: # 跳过已合并的列
table.rows[row_idx].cells[col_idx].text = value
doc.save('merged_table.docx')
create_merged_table()
从Excel数据创建Word表格
from docx import Document
import pandas as pd
def create_from_excel():
doc = Document()
doc.add_heading('从Excel导入数据', level=1)
# 读取Excel数据 (假设有sales.xlsx文件)
df = pd.read_excel('sales.xlsx')
# 创建表格
table = doc.add_table(rows=len(df) + 1, cols=len(df.columns))
table.style = 'Light Grid Accent 1'
# 写入表头
for col_idx, column in enumerate(df.columns):
table.rows[0].cells[col_idx].text = str(column)
# 写入数据
for row_idx, row in df.iterrows():
for col_idx, value in enumerate(row):
table.rows[row_idx + 1].cells[col_idx].text = str(value)
doc.save('from_excel.docx')
# create_from_excel() # 取消注释使用
完整示例:生成复杂报表
from docx import Document
from docx.shared import Inches, Pt, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn, nsdecls
from docx.oxml import parse_xml
def create_complex_report():
doc = Document()
# 标题= doc.add_heading('季度销售报告', level=1)alignment = WD_ALIGN_PARAGRAPH.CENTER
# 副标题
subtitle = doc.add_paragraph('2024年第一季度')
subtitle.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 创建数据
headers = ['产品', '销量', '单价', '销售额', '利润率']
data = [
['手机', 1200, 2999, 3598800, '15%'],
['电脑', 800, 4999, 3999200, '12%'],
['平板', 1500, 1999, 2998500, '18%'],
['配件', 3000, 299, 897000, '25%'],
]
# 创建表格
table = doc.add_table(rows=len(data) + 2, cols=len(headers))
table.style = 'Table Grid'
table.alignment = WD_TABLE_ALIGNMENT.CENTER
# 设置表头
for i, header in enumerate(headers):
cell = table.rows[0].cells[i]
cell.text = header
cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
# 表头样式
shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="2F5496"/>')
cell._tc.get_or_add_tcPr().append(shading)
for paragraph in cell.paragraphs:
for run in paragraph.runs:
run.font.color.rgb = RGBColor(255, 255, 255)
run.font.bold = True
run.font.size = Pt(11)
# 填充数据
for row_idx, row_data in enumerate(data, 1):
for col_idx, value in enumerate(row_data):
cell = table.rows[row_idx].cells[col_idx]
cell.text = str(value)
cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
# 交替行颜色
if row_idx % 2 == 0:
shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="D6E4F0"/>')
cell._tc.get_or_add_tcPr().append(shading)
# 添加汇总行
total_row = len(data) + 1
table.rows[total_row].cells[0].text = '合计'
table.rows[total_row].cells[1].text = str(sum(row[1] for row in data))
table.rows[total_row].cells[3].text = str(sum(row[3] for row in data))
# 汇总行样式
for cell in table.rows[total_row].cells:
for paragraph in cell.paragraphs:
for run in paragraph.runs:
run.font.bold = True
run.font.color.rgb = RGBColor(47, 84, 150)
shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="B4C6E7"/>')
cell._tc.get_or_add_tcPr().append(shading)
# 保存文档
doc.save('complex_report.docx')
print("报告已生成:complex_report.docx")
create_complex_report()
注意事项
-
安装依赖:
pip install python-docx
-
表格样式:python-docx提供了多种内置样式,如:
Table Grid- 标准网格Light Grid Accent 1- 带颜色的网格Medium Shading 1 Accent 1- 中等阴影
-
性能考虑:处理大量数据时,逐行写入可能会较慢,可以考虑批量处理。
-
版本兼容性:确保python-docx版本兼容您的Word版本。
这些示例涵盖了从基础到高级的各种表格生成场景,可以根据实际需求选择合适的方案。