一、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(255, 0, 0)
# 设置字体名称
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(0, 0).merge(table.cell(0, 3))
table.cell(0, 0).text = '合并标题'
# 合并单元格(垂直合并)
table.cell(1, 0).merge(table.cell(3, 0))
table.cell(1, 0).text = '垂直合并'
# 填充其他数据
for i inrange(1, 4):
for j inrange(1, 4):
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(0, 0).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', 0, 0, 100, 50)
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(0, 0, 255)
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(128, 128, 128)
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(128, 128, 128)
# 分隔线
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(0, 0)
cell.text = '内容'
# 6. 样式
doc.add_paragraph('文本').style = 'Heading 1'
# 7. 保存
doc.save('output.docx')python-docx提供了完整的Word文档创建功能,包括文本、表格、图片、样式等。掌握这些基本操作可以满足大部分文档生成需求。对于复杂模板和批量生成场景,结合数据驱动的方式可以大幅提高效率。
夜雨聆风