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

一、安装所需库

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

相关帖子
参与以旧换新时,如何准确评估自己旧车的残值以免在置换中吃亏?
参与以旧换新时,如何准确评估自己旧车的残值以免在置换中吃亏?
申请保障性住房的完整流程是什么,从提交到入住大概需要多久?
申请保障性住房的完整流程是什么,从提交到入住大概需要多久?
除了注意用眼习惯,还有哪些全身性的健康因素会影响到眼睛状态?
除了注意用眼习惯,还有哪些全身性的健康因素会影响到眼睛状态?
选择智能垃圾箱时,如何根据家庭、社区或市政等不同场景进行匹配?
选择智能垃圾箱时,如何根据家庭、社区或市政等不同场景进行匹配?
崇左市开源网站二次开发-小视频制作,定制建站
崇左市开源网站二次开发-小视频制作,定制建站
扬州市救护车转院转运回家&长途跨省救护车转运24小时电话
扬州市救护车转院转运回家&长途跨省救护车转运24小时电话
高效管理你的Linux系统: Debian操作系统常用命令指南
高效管理你的Linux系统: Debian操作系统常用命令指南
长期受噪音困扰影响休息,如何进行自我心理调节与舒缓?
长期受噪音困扰影响休息,如何进行自我心理调节与舒缓?
济南市网站建设服务%精准获客系统,高端网站开发设计
济南市网站建设服务%精准获客系统,高端网站开发设计
如果社保已经断缴了,在2026年还有没有机会进行补缴操作?
如果社保已经断缴了,在2026年还有没有机会进行补缴操作?
湛江市企业网站建设公司&做网站公司,收费标准
湛江市企业网站建设公司&做网站公司,收费标准
2026年通过哪些官方或正规的线上平台,可以查询到可靠的跨境招聘信息?
2026年通过哪些官方或正规的线上平台,可以查询到可靠的跨境招聘信息?
杭州市救护车长途跨省护送病人出院@120救护车一次多少钱
杭州市救护车长途跨省护送病人出院@120救护车一次多少钱
黄石市专业网站设计制作%定制化网站建设,小程序开发
黄石市专业网站设计制作%定制化网站建设,小程序开发
在马路上看到哪些问题可以通过随手拍上报并获得奖励?
在马路上看到哪些问题可以通过随手拍上报并获得奖励?
2026年异地销户是否支持线上办理,话费余额如何处理?
2026年异地销户是否支持线上办理,话费余额如何处理?
web面试常问http缓存解析相关
web面试常问http缓存解析相关
徐州市长途救护车出租&重症急救车出租,转院接送
徐州市长途救护车出租&重症急救车出租,转院接送
外卖骑手在等待取餐时,平台系统是如何自动识别和记录等时时间的?
外卖骑手在等待取餐时,平台系统是如何自动识别和记录等时时间的?
收到莫名消费短信,如何立即采取措施防止个人账户资金被他人继续使用?
收到莫名消费短信,如何立即采取措施防止个人账户资金被他人继续使用?