Python脚本如何生成Word文档表格

wen 实用脚本 1

本文目录导读:

Python脚本如何生成Word文档表格

  1. 使用 python-docx 库 (最常用)
  2. 从数据源创建表格
  3. 高级表格样式设置
  4. 合并单元格
  5. 从Excel数据创建Word表格
  6. 完整示例:生成复杂报表
  7. 注意事项

我来详细介绍几种在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()

注意事项

  1. 安装依赖

    pip install python-docx
  2. 表格样式:python-docx提供了多种内置样式,如:

    • Table Grid - 标准网格
    • Light Grid Accent 1 - 带颜色的网格
    • Medium Shading 1 Accent 1 - 中等阴影
  3. 性能考虑:处理大量数据时,逐行写入可能会较慢,可以考虑批量处理。

  4. 版本兼容性:确保python-docx版本兼容您的Word版本。

这些示例涵盖了从基础到高级的各种表格生成场景,可以根据实际需求选择合适的方案。

抱歉,评论功能暂时关闭!