乐于分享
好东西不私藏

Word处理——python-docx文档创建

Word处理——python-docx文档创建

一、python-docx概述

python-docx是Python中处理Word文档(.docx)最常用的库,支持创建、修改和读取Word文档。

# 安装
pip install python-docx

# 基本使用
from docx import Document

# 创建新文档
doc = Document()
doc.add_paragraph('Hello, World!')
doc.save('hello.docx')

二、文档创建基础

2.1 创建文档对象

from docx import Document

# 创建空白文档
doc = Document()

# 基于模板创建
doc = Document('template.docx')

# 保存文档
doc.save('output.docx')

2.2 添加段落

from docx import Document

doc = Document()

# 添加段落
p1 = doc.add_paragraph('这是第一段')
p2 = doc.add_paragraph('这是第二段')

# 添加带格式的段落
p3 = doc.add_paragraph('这是带格式的段落')
p3.style = 'Heading 1'# 标题样式

# 添加多个段落
for i inrange(5):
    doc.add_paragraph(f'段落 {i+1}')

doc.save('paragraphs.docx')

2.3 添加标题

from docx import Document

doc = Document()

# 添加标题
doc.add_heading('一级标题', level=1)
doc.add_heading('二级标题', level=2)
doc.add_heading('三级标题', level=3)
doc.add_heading('四级标题', level=4)

# 添加带内容的标题
doc.add_heading('第一章 概述', level=1)
doc.add_paragraph('这是概述内容...')

doc.save('headings.docx')

三、文本格式化

3.1 字体样式

from docx import Document
from docx.shared import Pt, RGBColor

doc = Document()

# 添加段落
p = doc.add_paragraph()

# 添加带格式的文本
run = p.add_run('这是粗体文本')
run.bold = True

run = p.add_run('这是斜体文本')
run.italic = True

run = p.add_run('这是下划线文本')
run.underline = True

# 组合样式
run = p.add_run('这是粗体斜体文本')
run.bold = True
run.italic = True

# 设置字体大小
run = p.add_run('这是大号文本')
run.font.size = Pt(24)

# 设置字体颜色
run = p.add_run('这是红色文本')
run.font.color.rgb = RGBColor(25500)

# 设置字体名称
run = p.add_run('这是微软雅黑字体')
run.font.name = '微软雅黑'

doc.save('font_styles.docx')

3.2 对齐方式

from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH

doc = Document()

# 左对齐
p1 = doc.add_paragraph('左对齐文本')
p1.alignment = WD_ALIGN_PARAGRAPH.LEFT

# 居中对齐
p2 = doc.add_paragraph('居中对齐文本')
p2.alignment = WD_ALIGN_PARAGRAPH.CENTER

# 右对齐
p3 = doc.add_paragraph('右对齐文本')
p3.alignment = WD_ALIGN_PARAGRAPH.RIGHT

# 两端对齐
p4 = doc.add_paragraph('两端对齐文本')
p4.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY

# 分散对齐
p5 = doc.add_paragraph('分散对齐文本')
p5.alignment = WD_ALIGN_PARAGRAPH.DISTRIBUTE

doc.save('alignment.docx')

3.3 行距和缩进

from docx import Document
from docx.shared import Inches, Pt

doc = Document()

# 设置行距
p = doc.add_paragraph('这是设置了行距的段落')
p.paragraph_format.line_spacing = Pt(24)  # 1.5倍行距

# 设置段前段后
p.paragraph_format.space_before = Pt(12)
p.paragraph_format.space_after = Pt(12)

# 设置缩进
p.paragraph_format.left_indent = Inches(0.5)   # 左缩进
p.paragraph_format.right_indent = Inches(0.5)  # 右缩进
p.paragraph_format.first_line_indent = Inches(0.5)  # 首行缩进

doc.save('paragraph_format.docx')

四、表格操作

4.1 创建表格

from docx import Document

doc = Document()

# 创建表格(3行4列)
table = doc.add_table(rows=3, cols=4)

# 填充数据
data = [
    ['姓名''年龄''城市''职业'],
    ['张三''25''北京''工程师'],
    ['李四''30''上海''设计师']
]

for i, row_data inenumerate(data):
    row = table.rows[i]
for j, value inenumerate(row_data):
        row.cells[j].text = value

doc.save('table_basic.docx')

4.2 表格样式

from docx import Document
from docx.enum.table import WD_ALIGN_VERTICAL, WD_TABLE_ALIGNMENT
from docx.enum.text import WD_ALIGN_PARAGRAPH

doc = Document()

# 创建表格
table = doc.add_table(rows=4, cols=3)
table.style = 'Light Grid Accent 1'# 应用样式

# 填充数据
headers = ['产品''价格''库存']
data = [
    ['产品A''100''50'],
    ['产品B''200''30'],
    ['产品C''150''40']
]

# 表头
for i, header inenumerate(headers):
    cell = table.rows[0].cells[i]
    cell.text = header
    cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER

# 设置背景色
from docx.oxml import OxmlElement
    shading = OxmlElement('w:shd')
    shading.set('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}val''solid')
    shading.set('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}color''auto')
    shading.set('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}fill''4472C4')
    cell._tc.get_or_add_tcPr().append(shading)

# 数据行
for i, row_data inenumerate(data):
    row = table.rows[i+1]
for j, value inenumerate(row_data):
        cell = row.cells[j]
        cell.text = value
        cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER

# 设置列宽
for col in table.columns:
for cell in col.cells:
        cell.width = Inches(2)

# 设置表格对齐
table.alignment = WD_TABLE_ALIGNMENT.CENTER

doc.save('table_styled.docx')

4.3 合并单元格

from docx import Document

doc = Document()

# 创建表格
table = doc.add_table(rows=4, cols=4)

# 合并单元格(水平合并)
table.cell(00).merge(table.cell(03))
table.cell(00).text = '合并标题'

# 合并单元格(垂直合并)
table.cell(10).merge(table.cell(30))
table.cell(10).text = '垂直合并'

# 填充其他数据
for i inrange(14):
for j inrange(14):
        table.cell(i, j).text = f'({i},{j})'

doc.save('table_merged.docx')

五、图片和形状

5.1 插入图片

from docx import Document
from docx.shared import Inches

doc = Document()

# 插入图片
doc.add_picture('image.jpg', width=Inches(4))

# 插入带标题的图片
doc.add_paragraph('图1:示例图片')
p = doc.add_paragraph()
r = p.add_run()
r.add_picture('image.jpg', width=Inches(3))

# 设置图片位置(通过表格)
table = doc.add_table(rows=1, cols=1)
table.cell(00).add_paragraph().add_run().add_picture('image.jpg', width=Inches(5))

doc.save('images.docx')

5.2 添加形状

from docx import Document
from docx.oxml import OxmlElement
from docx.oxml.ns import qn

doc = Document()

# 添加形状(通过底层XML)
defadd_shape(doc, shape_type, x, y, width, height):
"""添加形状"""
# 创建形状对象
    shape = OxmlElement('w:drawing')

# 设置形状属性
    inline = OxmlElement('wp:inline')
    extent = OxmlElement('wp:extent')
    extent.set(qn('cx'), str(width * 12700))
    extent.set(qn('cy'), str(height * 12700))
    inline.append(extent)

# 设置位置
    position = OxmlElement('wp:positionV')
    position.set(qn('relativeFrom'), 'paragraph')
    position.text = str(y)
    inline.append(position)

# 添加形状
    shape.append(inline)

# 添加到段落
    p = doc.add_paragraph()
    p._element.append(shape)

# 添加矩形
add_shape(doc, 'rect'0010050)

doc.save('shapes.docx')

六、样式和模板

6.1 自定义样式

from docx import Document
from docx.shared import Pt, RGBColor

doc = Document()

# 创建自定义样式
styles = doc.styles

# 创建段落样式
style = styles.add_style('CustomParagraph'1)  # 1表示段落样式
style.font.name = '微软雅黑'
style.font.size = Pt(12)
style.font.color.rgb = RGBColor(00255)
style.paragraph_format.space_before = Pt(6)
style.paragraph_format.space_after = Pt(6)

# 应用样式
p = doc.add_paragraph('这是自定义样式段落')
p.style = 'CustomParagraph'

doc.save('custom_style.docx')

6.2 使用模板

from docx import Document
from docx.shared import Inches, Pt

defcreate_document_from_template(template_path, output_path, data):
"""从模板创建文档"""
# 加载模板
    doc = Document(template_path)

# 替换文本
for key, value in data.items():
for paragraph in doc.paragraphs:
if key in paragraph.text:
                paragraph.text = paragraph.text.replace(key, str(value))

for table in doc.tables:
for row in table.rows:
for cell in row.cells:
if key in cell.text:
                        cell.text = cell.text.replace(key, str(value))

    doc.save(output_path)

# 使用
template_data = {
'{name}''张三',
'{date}''2024-01-01',
'{title}''工作报告'
}

create_document_from_template('template.docx''report.docx', template_data)

七、实战案例

7.1 报告生成器

from docx import Document
from docx.shared import Inches, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from datetime import datetime

classReportGenerator:
"""Word报告生成器"""

def__init__(self):
self.doc = Document()

defadd_title(self, title):
"""添加标题"""
        p = self.doc.add_heading(title, level=1)
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER

defadd_subtitle(self, subtitle):
"""添加副标题"""
        p = self.doc.add_paragraph(subtitle)
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        p.runs[0].font.size = Pt(14)
        p.runs[0].font.color.rgb = RGBColor(128128128)

defadd_section(self, title, content):
"""添加章节"""
self.doc.add_heading(title, level=2)
self.doc.add_paragraph(content)

defadd_table(self, data, headers):
"""添加表格"""
        table = self.doc.add_table(rows=1, cols=len(headers))
        table.style = 'Light Grid Accent 1'

# 表头
for i, header inenumerate(headers):
            table.rows[0].cells[i].text = header
            table.rows[0].cells[i].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER

# 数据
for row_data in data:
            row = table.add_row()
for i, value inenumerate(row_data):
                row.cells[i].text = str(value)

defadd_image(self, image_path, caption=None):
"""添加图片"""
self.doc.add_picture(image_path, width=Inches(5))
if caption:
            p = self.doc.add_paragraph(caption)
            p.alignment = WD_ALIGN_PARAGRAPH.CENTER

defadd_footer(self):
"""添加页脚"""
        section = self.doc.sections[0]
        footer = section.footer
        p = footer.paragraphs[0]
        p.text = f'报告生成时间: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}'
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER

defsave(self, filename):
"""保存报告"""
self.add_footer()
self.doc.save(filename)

# 使用
report = ReportGenerator()
report.add_title('2024年度销售报告')
report.add_subtitle('销售部')
report.add_section('概述''本报告总结了2024年度的销售业绩...')
report.add_table(
    [['Q1''100万''80万'], ['Q2''120万''90万']],
    ['季度''销售额''成本']
)
report.add_image('chart.png''图1:销售趋势图')
report.save('sales_report.docx')

7.2 批量生成文档

from docx import Document
import os

classBatchDocumentGenerator:
"""批量文档生成器"""

def__init__(self, template_path):
self.template_path = template_path

defgenerate_from_data(self, data_list, output_dir):
"""从数据生成文档"""
ifnot os.path.exists(output_dir):
            os.makedirs(output_dir)

for data in data_list:
# 加载模板
            doc = Document(self.template_path)

# 替换文本
for key, value in data.items():
self._replace_text(doc, key, value)

# 保存文档
            filename = f"{data.get('name''document')}.docx"
            filepath = os.path.join(output_dir, filename)
            doc.save(filepath)
print(f"生成: {filepath}")

def_replace_text(self, doc, key, value):
"""替换文本"""
# 替换段落
for paragraph in doc.paragraphs:
if key in paragraph.text:
for run in paragraph.runs:
if key in run.text:
                        run.text = run.text.replace(key, str(value))

# 替换表格
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
if key in cell.text:
for paragraph in cell.paragraphs:
for run in paragraph.runs:
if key in run.text:
                                    run.text = run.text.replace(key, str(value))

# 使用
data_list = [
    {'name''张三''{name}''张三''{date}''2024-01-01''{title}''个人报告'},
    {'name''李四''{name}''李四''{date}''2024-01-02''{title}''个人报告'},
]

generator = BatchDocumentGenerator('template.docx')
generator.generate_from_data(data_list, './output')

7.3 简历生成器

from docx import Document
from docx.shared import Inches, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH

classResumeGenerator:
"""简历生成器"""

def__init__(self, data):
self.doc = Document()
self.data = data
self._create_resume()

def_create_resume(self):
"""创建简历"""
# 姓名
        p = self.doc.add_paragraph()
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run = p.add_run(self.data.get('name''姓名'))
        run.font.size = Pt(24)
        run.font.bold = True

# 联系方式
        p = self.doc.add_paragraph()
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        contact = f"{self.data.get('phone''')} | {self.data.get('email''')}"
        run = p.add_run(contact)
        run.font.size = Pt(10)
        run.font.color.rgb = RGBColor(128128128)

# 分隔线
self.doc.add_paragraph('_' * 50)

# 教育背景
self._add_section('教育背景'self.data.get('education', []))

# 工作经历
self._add_section('工作经历'self.data.get('experience', []))

# 技能
self._add_section('技能'self.data.get('skills', []))

def_add_section(self, title, items):
"""添加章节"""
# 标题
        p = self.doc.add_paragraph()
        run = p.add_run(title)
        run.font.bold = True
        run.font.size = Pt(14)

# 内容
ifisinstance(items, list):
for item in items:
ifisinstance(item, str):
self.doc.add_paragraph(f'• {item}')
elifisinstance(item, dict):
                    p = self.doc.add_paragraph()
                    p.add_run(item.get('title''')).bold = True
                    p.add_run(f" - {item.get('date''')}")
self.doc.add_paragraph(item.get('description'''))

defsave(self, filename):
"""保存简历"""
self.doc.save(filename)

# 使用
resume_data = {
'name''张三',
'phone''13800138000',
'email''zhangsan@example.com',
'education': [
        {'title''北京大学''date''2016-2020''description''计算机科学'},
    ],
'experience': [
        {'title''软件工程师''date''2020-至今''description''负责Python开发'},
    ],
'skills': ['Python''Django''数据分析']
}

resume = ResumeGenerator(resume_data)
resume.save('resume.docx')

八、总结

# 快速参考

# 1. 创建文档
from docx import Document
doc = Document()

# 2. 添加内容
doc.add_paragraph('段落')
doc.add_heading('标题', level=1)
doc.add_table(rows=3, cols=3)
doc.add_picture('image.jpg')

# 3. 文本格式
run = p.add_run('文本')
run.bold = True
run.italic = True
run.underline = True
run.font.size = Pt(12)

# 4. 段落格式
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.paragraph_format.line_spacing = Pt(24)

# 5. 表格
table = doc.add_table(rows=3, cols=3)
cell = table.cell(00)
cell.text = '内容'

# 6. 样式
doc.add_paragraph('文本').style = 'Heading 1'

# 7. 保存
doc.save('output.docx')

python-docx提供了完整的Word文档创建功能,包括文本、表格、图片、样式等。掌握这些基本操作可以满足大部分文档生成需求。对于复杂模板和批量生成场景,结合数据驱动的方式可以大幅提高效率。