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

一、安装所需库

# 主要库
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年保障性住房体系中,公租房与其他保障房类型有何区别与联系?
养老“互转”政策中,对于个人缴费和财政补贴部分如何处理?
养老“互转”政策中,对于个人缴费和财政补贴部分如何处理?
崇左市网站优化推广服务&AI数字人视频制作,专业团队
崇左市网站优化推广服务&AI数字人视频制作,专业团队
自由职业者或灵活就业人员,是否可以为自己设立交通通讯补贴以降低税负?
自由职业者或灵活就业人员,是否可以为自己设立交通通讯补贴以降低税负?
2026年,社会舆论和年轻人对彩礼“限高”政策的普遍看法是什么?
2026年,社会舆论和年轻人对彩礼“限高”政策的普遍看法是什么?
计算经济补偿金时,工资基数是指应发工资还是实发工资?
计算经济补偿金时,工资基数是指应发工资还是实发工资?
到2026年,社保“第六险”的评估标准是否更加统一和规范了?
到2026年,社保“第六险”的评估标准是否更加统一和规范了?
贷款期间房产信息变更,讲解信息修改及二次抵押备案调整流程
贷款期间房产信息变更,讲解信息修改及二次抵押备案调整流程
从千兆宽带降级到百兆,运营商要求缴纳高额设备调测费是否合理?
从千兆宽带降级到百兆,运营商要求缴纳高额设备调测费是否合理?
2026年新的食品标识规定,是否让预制菜配料表更透明易懂?
2026年新的食品标识规定,是否让预制菜配料表更透明易懂?
智能汽车记录的行车轨迹信息是否属于个人隐私信息范畴
智能汽车记录的行车轨迹信息是否属于个人隐私信息范畴
如何区分是为了实际需求购物,还是为了短暂的情绪抚慰而进行消费?
如何区分是为了实际需求购物,还是为了短暂的情绪抚慰而进行消费?
2026年,企业的加班审批制度如果过于严格,是否会催生更多隐形加班?
2026年,企业的加班审批制度如果过于严格,是否会催生更多隐形加班?
企业内部非正式的社交活动,如何可能加深某些群体的“隐性”排斥感?
企业内部非正式的社交活动,如何可能加深某些群体的“隐性”排斥感?
对于有过敏性鼻炎的人,在特定季节应如何护理以减少鼻子出血风险?
对于有过敏性鼻炎的人,在特定季节应如何护理以减少鼻子出血风险?
小满节气“苦菜秀”的说法从何而来,这种植物背后有哪些有趣的故事与文化?
小满节气“苦菜秀”的说法从何而来,这种植物背后有哪些有趣的故事与文化?
对维修基金的使用情况有疑问,业主可以通过哪些合法途径进行监督?
对维修基金的使用情况有疑问,业主可以通过哪些合法途径进行监督?
2026年国际原油市场价格波动,主要受全球哪些非政治性供需因素影响?
2026年国际原油市场价格波动,主要受全球哪些非政治性供需因素影响?