欢迎光临本地信息咨询网
详情描述

一、安装所需库

# 主要库
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文档自动化的主要操作场景,可以根据实际需求进行调整和扩展。

相关帖子
办理过桥垫资需要哪些资料?必备材料清单请收好
办理过桥垫资需要哪些资料?必备材料清单请收好
未来的人脸识别技术,在准确性和速度上可能会有哪些新的突破?
未来的人脸识别技术,在准确性和速度上可能会有哪些新的突破?
子女正在读大学,在计算家庭人口和收入时有哪些特殊的规定与考量?
子女正在读大学,在计算家庭人口和收入时有哪些特殊的规定与考量?
两代人对于冠姓权的执念差距为啥这么大,独生子女家庭尤其容易卡在这?
两代人对于冠姓权的执念差距为啥这么大,独生子女家庭尤其容易卡在这?
2026年保障性住房体系中,公租房与其他保障房类型有何区别与联系?
2026年保障性住房体系中,公租房与其他保障房类型有何区别与联系?
养老“互转”政策中,对于个人缴费和财政补贴部分如何处理?
养老“互转”政策中,对于个人缴费和财政补贴部分如何处理?
马上消费金融利率,安逸花借款利息计算
马上消费金融利率,安逸花借款利息计算
在涉及遗产继承或抚养权纠纷时,出生医学证明能提供怎样的法律依据?
在涉及遗产继承或抚养权纠纷时,出生医学证明能提供怎样的法律依据?
智能玩具联网功能背后的数据安全与儿童隐私保护,家长应了解哪些知识?
智能玩具联网功能背后的数据安全与儿童隐私保护,家长应了解哪些知识?
个人债务优化重组申请流程有哪些步骤?从申请到落地全解析
个人债务优化重组申请流程有哪些步骤?从申请到落地全解析
更年期后,女性在职业生涯和个人兴趣发展上可能迎来哪些新机遇?
更年期后,女性在职业生涯和个人兴趣发展上可能迎来哪些新机遇?
汽车贷款期限包含宽限期吗?还款日与期限的计算
汽车贷款期限包含宽限期吗?还款日与期限的计算
除了便捷性,预制菜在执行的食品安全标准上与餐厅现做菜有何异同?
除了便捷性,预制菜在执行的食品安全标准上与餐厅现做菜有何异同?
写字楼门店抵押贷款负债率高怎么办?降低负债率提高批贷成功率
写字楼门店抵押贷款负债率高怎么办?降低负债率提高批贷成功率
商铺门面房抵押贷款保险必须买吗?财产保险与抵押贷款保险区别
商铺门面房抵押贷款保险必须买吗?财产保险与抵押贷款保险区别
面对2026年的市场环境,独立开发者应聚焦解决用户的哪些痛点?
面对2026年的市场环境,独立开发者应聚焦解决用户的哪些痛点?
别墅抵押贷款LPR怎么影响利率?LPR调整与月供变化关系解读
别墅抵押贷款LPR怎么影响利率?LPR调整与月供变化关系解读
如何通过角色扮演类玩具,有效培养孩子的同理心与情绪管理能力?
如何通过角色扮演类玩具,有效培养孩子的同理心与情绪管理能力?
过桥垫资让与担保效力?名为买卖实为借贷
过桥垫资让与担保效力?名为买卖实为借贷
别墅抵押贷款可以抵押给典当行吗?典当行别墅抵押贷款利弊
别墅抵押贷款可以抵押给典当行吗?典当行别墅抵押贷款利弊
公司经营贷款集团授信流程,企业集团统一授信
公司经营贷款集团授信流程,企业集团统一授信