一、安装所需库
# 主要库
pip install python-docx # 创建和编辑.docx文件
pip install docx2pdf # Word转PDF
pip install pywin32 # Windows下使用COM接口(需要安装Office)
pip install python-docx-template # 使用模板
二、创建和编辑Word文档
1. 基本文档创建
from docx import Document
from docx.shared import Inches, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
# 创建新文档
doc = Document()
# 添加标题
doc.add_heading('文档标题', level=0)
# 添加段落
p1 = doc.add_paragraph('这是第一个段落。')
p2 = doc.add_paragraph('这是第二个段落。')
# 设置段落对齐方式
p1.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 保存文档
doc.save('demo.docx')
2. 文本格式化
from docx import Document
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_BREAK
doc = Document()
# 添加带格式的段落
p = doc.add_paragraph()
run = p.add_run('加粗文本')
run.bold = True
run = p.add_run(' 红色文本')
run.font.color.rgb = RGBColor(255, 0, 0)
run = p.add_run(' 大号字体')
run.font.size = Pt(16)
# 添加换行符
p.add_run().add_break(WD_BREAK.LINE)
# 添加分页符
doc.add_page_break()
3. 添加表格
from docx import Document
doc = Document()
# 添加表格(3行4列)
table = doc.add_table(rows=3, cols=4)
# 填充表头
header_cells = table.rows[0].cells
header_cells[0].text = '姓名'
header_cells[1].text = '年龄'
header_cells[2].text = '职位'
header_cells[3].text = '部门'
# 填充数据行
data = [
['张三', '30', '工程师', '技术部'],
['李四', '28', '设计师', '设计部']
]
for i, row_data in enumerate(data, start=1):
row_cells = table.rows[i].cells
for j, cell_value in enumerate(row_data):
row_cells[j].text = str(cell_value)
doc.save('表格文档.docx')
4. 插入图片
from docx import Document
from docx.shared import Inches
doc = Document()
doc.add_heading('带图片的文档', 0)
# 插入图片
doc.add_picture('image.jpg', width=Inches(4.0))
# 带标题的图片
doc.add_paragraph('图1:示例图片').alignment = 1 # 居中对齐
doc.save('图片文档.docx')
三、读取和修改现有文档
1. 读取文档内容
from docx import Document
doc = Document('existing.docx')
# 读取所有段落
for paragraph in doc.paragraphs:
print(paragraph.text)
# 读取所有表格
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
print(cell.text)
# 读取所有章节
for section in doc.sections:
print(f"页边距: {section.left_margin.inches}")
2. 查找和替换文本
from docx import Document
def replace_text_in_doc(file_path, old_text, new_text):
doc = Document(file_path)
# 在段落中替换
for paragraph in doc.paragraphs:
if old_text in paragraph.text:
inline = paragraph.runs
for i in range(len(inline)):
if old_text in inline[i].text:
inline[i].text = inline[i].text.replace(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)
doc.save('modified.docx')
# 使用示例
replace_text_in_doc('template.docx', '{公司名称}', 'ABC科技有限公司')
四、批量处理文档
1. 批量替换(邮件合并)
from docx import Document
import os
def batch_replace_documents(template_path, data_list, output_dir='output'):
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for i, data in enumerate(data_list):
doc = Document(template_path)
# 替换所有占位符
for paragraph in doc.paragraphs:
for key, value in data.items():
if f'{{{key}}}' in paragraph.text:
paragraph.text = paragraph.text.replace(f'{{{key}}}', str(value))
# 保存新文档
output_path = os.path.join(output_dir, f'文档_{i+1}.docx')
doc.save(output_path)
print(f'已生成: {output_path}')
# 使用示例
data_list = [
{'姓名': '张三', '职位': '工程师', '日期': '2024-01-15'},
{'姓名': '李四', '职位': '设计师', '日期': '2024-01-15'},
]
batch_replace_documents('template.docx', data_list)
2. 文档合并
from docx import Document
def merge_documents(file_paths, output_path='merged.docx'):
master_doc = Document()
for file_path in file_paths:
sub_doc = Document(file_path)
# 添加原文档的所有元素
for element in sub_doc.element.body:
master_doc.element.body.append(element)
master_doc.save(output_path)
print(f'文档合并完成: {output_path}')
# 使用示例
merge_documents(['doc1.docx', 'doc2.docx', 'doc3.docx'])
五、使用模板生成文档
from docxtpl import DocxTemplate
import datetime
# 准备数据
context = {
'company_name': 'ABC科技有限公司',
'date': datetime.datetime.now().strftime('%Y年%m月%d日'),
'items': [
{'name': '产品A', 'price': 100, 'quantity': 2},
{'name': '产品B', 'price': 200, 'quantity': 1},
{'name': '产品C', 'price': 150, 'quantity': 3},
],
'total': 0 # 将自动计算
}
# 计算总额
context['total'] = sum(item['price'] * item['quantity'] for item in context['items'])
# 加载模板并渲染
doc = DocxTemplate('invoice_template.docx')
doc.render(context)
# 保存生成的文档
doc.save('invoice_final.docx')
六、Word转PDF
方法1:使用docx2pdf(需要安装Office)
from docx2pdf import convert
# 单个文件转换
convert('input.docx', 'output.pdf')
# 批量转换
convert('input_folder/', 'output_folder/')
方法2:使用comtypes(Windows)
import comtypes.client
import os
def convert_word_to_pdf(docx_path, pdf_path):
word = comtypes.client.CreateObject('Word.Application')
word.Visible = False
doc = word.Documents.Open(docx_path)
doc.SaveAs(pdf_path, FileFormat=17) # 17对应PDF格式
doc.Close()
word.Quit()
七、实际应用示例
1. 自动生成报告
from docx import Document
from docx.shared import Inches, Pt
from datetime import datetime
class ReportGenerator:
def __init__(self, title):
self.doc = Document()
self.title = title
self.setup_document()
def setup_document(self):
# 添加标题
self.doc.add_heading(self.title, 0)
# 添加生成日期
date_str = datetime.now().strftime('%Y年%m月%d日 %H:%M:%S')
self.doc.add_paragraph(f'生成时间: {date_str}')
def add_section(self, title, content, level=1):
self.doc.add_heading(title, level=level)
self.doc.add_paragraph(content)
def add_table_from_data(self, data, headers):
table = self.doc.add_table(rows=len(data)+1, cols=len(headers))
# 设置表头
header_row = table.rows[0]
for i, header in enumerate(headers):
header_row.cells[i].text = header
# 填充数据
for i, row_data in enumerate(data, start=1):
row_cells = table.rows[i].cells
for j, value in enumerate(row_data):
row_cells[j].text = str(value)
def save(self, filename):
self.doc.save(filename)
print(f'报告已保存: {filename}')
# 使用示例
generator = ReportGenerator('月度销售报告')
generator.add_section('概述', '本月销售额显著增长...')
generator.add_section('详细数据', '具体数据如下:')
data = [
['产品A', 15000, 120],
['产品B', 23000, 85],
['产品C', 18000, 110]
]
generator.add_table_from_data(data, ['产品名称', '销售额', '销售数量'])
generator.save('月度销售报告.docx')
2. 文档批处理脚本
import os
from pathlib import Path
from docx import Document
class DocumentBatchProcessor:
def __init__(self, input_dir, output_dir):
self.input_dir = Path(input_dir)
self.output_dir = Path(output_dir)
self.output_dir.mkdir(exist_ok=True)
def process_all_documents(self, processing_func):
"""处理目录中的所有Word文档"""
for docx_file in self.input_dir.glob('*.docx'):
try:
doc = Document(docx_file)
# 应用处理函数
processing_func(doc)
# 保存到输出目录
output_path = self.output_dir / f'processed_{docx_file.name}'
doc.save(output_path)
print(f'已处理: {docx_file.name}')
except Exception as e:
print(f'处理失败 {docx_file.name}: {e}')
@staticmethod
def add_watermark(doc, text='机密'):
"""添加水印"""
for section in doc.sections:
section.header.paragraphs[0].text = text
@staticmethod
def update_company_info(doc, old_name, new_name):
"""更新公司信息"""
for paragraph in doc.paragraphs:
if old_name in paragraph.text:
paragraph.text = paragraph.text.replace(old_name, new_name)
# 使用示例
processor = DocumentBatchProcessor('input', 'output')
# 批量添加水印
processor.process_all_documents(
lambda doc: processor.add_watermark(doc, '内部使用')
)
# 批量更新公司名称
processor.process_all_documents(
lambda doc: processor.update_company_info(doc, '旧公司', '新公司')
)
八、注意事项
文件格式:python-docx仅支持.docx格式,不支持.doc格式
兼容性:确保目标计算机已安装相应字体
性能:处理大型文档时注意内存使用
备份:处理重要文档前先备份原文件
错误处理:添加适当的异常处理机制
这些方法涵盖了Word文档自动化的主要操作场景,可以根据实际需求进行调整和扩展。