9.4 Word 自动化


文章目录

  • 前言
  • [一、为什么需要自动化操作 Word?](#一、为什么需要自动化操作 Word?)
  • [二、创建和写入 Word 文档](#二、创建和写入 Word 文档)
    • [2.1 基本文档结构](#2.1 基本文档结构)
    • [2.2 标题和段落](#2.2 标题和段落)
    • [2.3 高级文本格式化](#2.3 高级文本格式化)
    • [2.4 创建和格式化表格](#2.4 创建和格式化表格)
    • [2.5 插入图片和分页](#2.5 插入图片和分页)
    • [2.6 自定义样式和模板](#2.6 自定义样式和模板)
  • [三、 读取和分析 Word 文档](#三、 读取和分析 Word 文档)
  • 四、实际应用示例
    • [4.1 自动生成报告](#4.1 自动生成报告)
    • [4.2 批量处理 Word 文档](#4.2 批量处理 Word 文档)
  • 总结

前言

本文主要介绍创建和写入 Word 文档、读取和分析 Word 文档及实际应用示例等知识点。


一、为什么需要自动化操作 Word?

Microsoft Word 是全球使用最广泛的文字处理工具之一。在日常工作中,我们经常需要处理各种 Word 文档,如报告、合同、简历、手册等。手动操作 Word 不仅效率低下,而且在处理大量文档或重复性任务时容易出错。

Python 的 python-docx 库为 Word 文档的自动化操作提供了强大的支持,能够实现:

  1. 批量生成标准格式的文档
  2. 自动填充模板内容
  3. 文档格式的统一调整
  4. 数据报表的自动生成

安装 python-docx

bash 复制代码
bash
# 安装 python-docx
pip install python-docx
# 如果下载速度慢,可以使用国内镜像
pip install python-docx -i https://pypi.tuna.tsinghua.edu.cn/simple

二、创建和写入 Word 文档

2.1 基本文档结构

python 复制代码
python
from docx import Document
from docx.shared import Pt, Inches, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING
from docx.enum.style import WD_STYLE_TYPE
import os

class WordDocumentCreator:
    """Word文档创建器"""
    
    def __init__(self, filename="demo.docx"):
        self.document = Document()
        self.filename = filename
        
    def save(self):
        """保存文档"""
        self.document.save(self.filename)
        print(f"文档已保存: {os.path.abspath(self.filename)}")
        return self.filename

# 创建文档实例
doc_creator = WordDocumentCreator("示例文档.docx")

2.2 标题和段落

python 复制代码
python
def add_titles_and_paragraphs(doc):
    """添加标题和段落"""
    
    # 添加文档标题(0级标题,最大)
    title = doc.add_heading('Python自动化办公:Word文档操作指南', 0)
    title.alignment = WD_ALIGN_PARAGRAPH.CENTER  # 居中
    
    # 添加作者信息
    doc.add_paragraph('作者:Python自动化团队')
    doc.add_paragraph('创建日期:2024年1月')
    doc.add_paragraph('-' * 50)  # 分隔线
    
    # 添加章节标题
    doc.add_heading('第一章:引言', 1)
    
    # 添加段落
    intro_para = doc.add_paragraph('在现代办公环境中,')
    intro_para.add_run('Microsoft Word').bold = True
    intro_para.add_run(' 是最常用的文档处理工具之一。然而,手动处理大量文档或重复性任务不仅耗时耗力,还容易出现错误。')
    
    # 添加另一个段落
    doc.add_paragraph('Python 的 python-docx 库为 Word 自动化提供了完整的解决方案,能够实现文档的创建、编辑、格式化等操作,极大提高了工作效率。')
    
    # 添加章节标题
    doc.add_heading('1.1 自动化办公的优势', 2)
    
    # 添加带项目符号的列表
    doc.add_paragraph('提高工作效率:自动化处理重复性任务', style='List Bullet')
    doc.add_paragraph('减少人为错误:确保文档格式和内容的一致性', style='List Bullet')
    doc.add_paragraph('批量处理能力:同时处理成百上千个文档', style='List Bullet')
    doc.add_paragraph('易于维护:修改模板即可更新所有生成的文档', style='List Bullet')
    
    # 添加带编号的列表
    doc.add_paragraph('安装 python-docx 库', style='List Number')
    doc.add_paragraph('了解基本文档结构', style='List Number')
    doc.add_paragraph('掌握文本格式化方法', style='List Number')
    doc.add_paragraph('学习表格和图片插入', style='List Number')
    
    return doc

# 应用函数
add_titles_and_paragraphs(doc_creator.document)

2.3 高级文本格式化

python 复制代码
python
def add_formatted_text(doc):
    """添加格式化文本"""
    
    # 添加章节标题
    doc.add_heading('第二章:文本格式化', 1)
    
    # 段落对齐示例
    doc.add_heading('2.1 段落对齐', 2)
    
    # 左对齐(默认)
    left_aligned = doc.add_paragraph('左对齐文本(默认对齐方式)')
    left_aligned.alignment = WD_ALIGN_PARAGRAPH.LEFT
    
    # 居中对齐
    center_aligned = doc.add_paragraph('居中对齐文本')
    center_aligned.alignment = WD_ALIGN_PARAGRAPH.CENTER
    
    # 右对齐
    right_aligned = doc.add_paragraph('右对齐文本')
    right_aligned.alignment = WD_ALIGN_PARAGRAPH.RIGHT
    
    # 两端对齐
    justified = doc.add_paragraph('两端对齐文本:Python 的 python-docx 库为 Word 文档操作提供了完整的解决方案,支持创建、编辑、格式化等各种操作。')
    justified.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
    
    # 字体格式示例
    doc.add_heading('2.2 字体格式', 2)
    
    para = doc.add_paragraph('字体格式示例:')
    
    # 加粗文本
    para.add_run(' 加粗文本').bold = True
    
    # 斜体文本
    para.add_run(' 斜体文本').italic = True
    
    # 下划线文本
    para.add_run(' 下划线文本').underline = True
    
    # 删除线文本
    run = para.add_run(' 删除线文本')
    run.font.strike = True
    
    # 上标和下标
    para.add_run(' 上标:X')
    superscript = para.add_run('2')
    superscript.font.superscript = True
    
    para.add_run(' 下标:H')
    subscript = para.add_run('2')
    subscript.font.subscript = True
    
    # 字体颜色
    para.add_run(' 红色文本').font.color.rgb = RGBColor(255, 0, 0)
    para.add_run(' 蓝色文本').font.color.rgb = RGBColor(0, 0, 255)
    para.add_run(' 绿色文本').font.color.rgb = RGBColor(0, 128, 0)
    
    # 字体大小
    doc.add_heading('2.3 字体大小', 2)
    
    size_para = doc.add_paragraph('不同字体大小:')
    
    sizes = [8, 10, 12, 14, 16, 18, 20, 24, 28, 36]
    for size in sizes:
        run = size_para.add_run(f' {size}pt')
        run.font.size = Pt(size)
        if size >= 18:
            run.bold = True
    
    # 行间距和段落间距
    doc.add_heading('2.4 段落格式', 2)
    
    spacing_para = doc.add_paragraph('这是单倍行距的段落。' * 5)
    spacing_para.paragraph_format.line_spacing = 1.0
    
    spacing_para = doc.add_paragraph('这是1.5倍行距的段落。' * 5)
    spacing_para.paragraph_format.line_spacing = 1.5
    
    spacing_para = doc.add_paragraph('这是2倍行距的段落。' * 5)
    spacing_para.paragraph_format.line_spacing = 2.0
    
    # 首行缩进
    indent_para = doc.add_paragraph('这是首行缩进2字符的段落。' * 3)
    indent_para.paragraph_format.first_line_indent = Cm(0.74)  # 2字符 ≈ 0.74cm
    
    return doc

add_formatted_text(doc_creator.document)

2.4 创建和格式化表格

python 复制代码
python
def add_tables(doc):
    """添加和格式化表格"""
    
    # 添加章节标题
    doc.add_heading('第三章:表格操作', 1)
    
    # 简单表格
    doc.add_heading('3.1 基本表格', 2)
    
    # 创建3行4列的表格
    table = doc.add_table(rows=4, cols=3)
    table.style = 'Light Grid Accent 1'  # 使用预定义样式
    
    # 设置表头
    headers = table.rows[0].cells
    headers[0].text = '序号'
    headers[1].text = '姓名'
    headers[2].text = '成绩'
    
    # 加粗表头
    for cell in headers:
        for paragraph in cell.paragraphs:
            for run in paragraph.runs:
                run.bold = True
    
    # 填充数据
    data = [
        [1, '张三', 85],
        [2, '李四', 92],
        [3, '王五', 78]
    ]
    
    for i, row_data in enumerate(data, start=1):
        row_cells = table.rows[i].cells
        row_cells[0].text = str(row_data[0])
        row_cells[1].text = row_data[1]
        row_cells[2].text = str(row_data[2])
    
    # 复杂表格示例
    doc.add_heading('3.2 复杂表格', 2)
    
    complex_table = doc.add_table(rows=6, cols=5)
    complex_table.style = 'Medium Shading 1 Accent 1'
    
    # 合并单元格示例
    # 合并第一行的前两个单元格作为标题
    complex_table.cell(0, 0).merge(complex_table.cell(0, 1))
    complex_table.cell(0, 0).text = '季度销售报表'
    complex_table.cell(0, 0).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
    
    # 设置列标题
    col_headers = ['季度', '产品A', '产品B', '产品C', '总计']
    for i, header in enumerate(col_headers):
        cell = complex_table.cell(1, i)
        cell.text = header
        cell.paragraphs[0].runs[0].bold = True
    
    # 填充数据
    quarterly_data = [
        ['Q1', 1250000, 980000, 750000, None],
        ['Q2', 1380000, 1050000, 820000, None],
        ['Q3', 1520000, 1120000, 910000, None],
        ['Q4', 1680000, 1280000, 1050000, None],
    ]
    
    for i, row_data in enumerate(quarterly_data, start=2):
        for j, value in enumerate(row_data):
            cell = complex_table.cell(i, j)
            if value is None:
                # 计算总计
                formula = f'=SUM(B{i+1}:D{i+1})'
                cell.text = formula
            else:
                if isinstance(value, int):
                    # 格式化数字
                    cell.text = f'¥{value:,}'
                else:
                    cell.text = str(value)
            
            # 右对齐数字
            if j > 0:
                cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.RIGHT
    
    # 添加汇总行
    summary_row = complex_table.add_row().cells
    summary_row[0].text = '年度总计'
    for j in range(1, 5):
        formula = f'=SUM({chr(65+j)}3:{chr(65+j)}6)'  # B3:B6, C3:C6, ...
        summary_row[j].text = formula
        summary_row[j].paragraphs[0].runs[0].bold = True
    
    # 表格格式调整
    doc.add_heading('3.3 表格格式控制', 2)
    
    # 创建自定义格式的表格
    custom_table = doc.add_table(rows=5, cols=4)
    
    # 手动设置表格样式
    for i, row in enumerate(custom_table.rows):
        for j, cell in enumerate(row.cells):
            cell.text = f'行{i+1}列{j+1}'
            
            # 交替行颜色
            if i % 2 == 0:
                # 设置背景色
                for paragraph in cell.paragraphs:
                    for run in paragraph.runs:
                        run.font.color.rgb = RGBColor(0, 0, 0)
            
            # 设置边框
            for paragraph in cell.paragraphs:
                paragraph.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER
    
    return doc

add_tables(doc_creator.document)

2.5 插入图片和分页

python 复制代码
python
def add_images_and_page_breaks(doc):
    """添加图片和分页符"""
    
    # 添加章节标题
    doc.add_heading('第四章:图片和分页', 1)
    
    # 添加分页符
    doc.add_page_break()
    
    # 图片操作
    doc.add_heading('4.1 插入图片', 2)
    
    # 检查示例图片是否存在
    sample_images = ['sample.jpg', 'example.png', 'demo.jpg']
    image_added = False
    
    for img_file in sample_images:
        if os.path.exists(img_file):
            try:
                # 插入图片(指定宽度)
                doc.add_paragraph('插入图片(宽度6厘米):')
                doc.add_picture(img_file, width=Cm(6))
                
                # 插入图片(指定高度)
                doc.add_paragraph('插入图片(高度4厘米):')
                doc.add_picture(img_file, height=Cm(4))
                
                # 插入图片并居中对齐
                doc.add_paragraph('居中对齐的图片:')
                picture_para = doc.add_paragraph()
                run = picture_para.add_run()
                run.add_picture(img_file, width=Cm(8))
                picture_para.alignment = WD_ALIGN_PARAGRAPH.CENTER
                
                image_added = True
                break
            except Exception as e:
                print(f"插入图片失败: {e}")
    
    if not image_added:
        # 如果没有找到图片文件,添加占位文本
        doc.add_paragraph('(此处应显示图片,但未找到示例图片文件)')
        doc.add_paragraph('请将图片文件重命名为 sample.jpg、example.png 或 demo.jpg 并放在当前目录下。')
    
    # 图片环绕文字示例
    doc.add_heading('4.2 图文混排', 2)
    
    # 创建图文混排段落
    mixed_para = doc.add_paragraph()
    
    # 添加文字
    mixed_para.add_run('左侧是文字,右侧是图片。这是一段示例文本,用于演示图文混排效果。' * 5)
    
    # 注意:python-docx 对图文混排的支持有限
    # 复杂的版面设计可能需要其他方法
    
    # 添加另一个分页符
    doc.add_page_break()
    
    # 添加附录
    doc.add_heading('附录', 1)
    doc.add_paragraph('本文档由 Python 脚本自动生成。')
    doc.add_paragraph(f'生成时间:{os.path.basename(doc_creator.filename)}')
    
    return doc

add_images_and_page_breaks(doc_creator.document)

2.6 自定义样式和模板

python 复制代码
python
def create_custom_styles(doc):
    """创建自定义样式"""
    
    # 获取样式对象
    styles = doc.styles
    
    # 创建自定义段落样式
    if 'MyHeading' not in styles:
        my_heading = styles.add_style('MyHeading', WD_STYLE_TYPE.PARAGRAPH)
        my_heading.font.name = '微软雅黑'
        my_heading.font.size = Pt(16)
        my_heading.font.bold = True
        my_heading.font.color.rgb = RGBColor(0, 51, 102)
        my_heading.paragraph_format.space_before = Pt(12)
        my_heading.paragraph_format.space_after = Pt(6)
    
    # 创建自定义正文样式
    if 'MyBody' not in styles:
        my_body = styles.add_style('MyBody', WD_STYLE_TYPE.PARAGRAPH)
        my_body.font.name = '宋体'
        my_body.font.size = Pt(11)
        my_body.paragraph_format.line_spacing = 1.5
        my_body.paragraph_format.first_line_indent = Cm(0.74)
    
    # 创建自定义强调样式
    if 'MyEmphasis' not in styles:
        my_emphasis = styles.add_style('MyEmphasis', WD_STYLE_TYPE.CHARACTER)
        my_emphasis.font.italic = True
        my_emphasis.font.color.rgb = RGBColor(220, 0, 0)
    
    # 应用自定义样式
    doc.add_paragraph('自定义标题样式', style='MyHeading')
    doc.add_paragraph('这是使用自定义正文样式的段落。' * 3, style='MyBody')
    
    para = doc.add_paragraph('这是包含')
    run = para.add_run('自定义强调样式')
    run.style = 'MyEmphasis'
    para.add_run('的文本。')
    
    return doc

# 在适当位置调用
# create_custom_styles(doc_creator.document)

三、 读取和分析 Word 文档

python 复制代码
python
class WordDocumentAnalyzer:
    """Word文档分析器"""
    
    def __init__(self, filepath):
        self.filepath = filepath
        self.document = Document(filepath)
        self.analysis_results = {}
    
    def analyze_document(self):
        """分析文档结构"""
        
        print("=" * 60)
        print(f"文档分析报告: {os.path.basename(self.filepath)}")
        print("=" * 60)
        
        # 分析段落
        paragraphs = list(self.document.paragraphs)
        self.analysis_results['paragraph_count'] = len(paragraphs)
        
        print(f"\n1. 段落分析:")
        print(f"   总段落数: {len(paragraphs)}")
        
        # 统计不同样式的段落
        style_count = {}
        for para in paragraphs:
            style = para.style.name if para.style else '无样式'
            style_count[style] = style_count.get(style, 0) + 1
        
        print(f"   段落样式分布:")
        for style, count in sorted(style_count.items()):
            print(f"     {style}: {count}个")
        
        # 分析标题结构
        print(f"\n2. 标题结构:")
        heading_levels = {}
        
        for para in paragraphs:
            if para.style.name.startswith('Heading'):
                level = para.style.name.replace('Heading ', '')
                heading_levels[level] = heading_levels.get(level, 0) + 1
                print(f"   {para.style.name}: {para.text}")
        
        self.analysis_results['heading_count'] = sum(heading_levels.values())
        
        # 分析表格
        tables = list(self.document.tables)
        self.analysis_results['table_count'] = len(tables)
        
        print(f"\n3. 表格分析:")
        print(f"   总表格数: {len(tables)}")
        
        for i, table in enumerate(tables, 1):
            print(f"\n   表格{i}: {len(table.rows)}行 × {len(table.columns)}列")
            
            # 显示表格内容(前3行)
            max_rows_to_show = min(3, len(table.rows))
            for row_idx in range(max_rows_to_show):
                row_data = []
                for cell in table.rows[row_idx].cells:
                    row_data.append(cell.text.strip())
                print(f"     第{row_idx+1}行: {' | '.join(row_data)}")
        
        # 分析图片
        image_count = 0
        for rel in self.document.part.rels.values():
            if "image" in rel.target_ref:
                image_count += 1
        
        self.analysis_results['image_count'] = image_count
        print(f"\n4. 图片分析:")
        print(f"   总图片数: {image_count}")
        
        # 文本内容统计
        print(f"\n5. 文本内容统计:")
        
        total_chars = 0
        total_words = 0
        
        for para in paragraphs:
            text = para.text.strip()
            if text:
                total_chars += len(text)
                total_words += len(text.split())
        
        self.analysis_results['total_characters'] = total_chars
        self.analysis_results['total_words'] = total_words
        
        print(f"   总字符数: {total_chars}")
        print(f"   总词数: {total_words}")
        
        if total_words > 0:
            avg_word_length = total_chars / total_words
            print(f"   平均词长: {avg_word_length:.1f}字符")
        
        # 查找特定内容
        print(f"\n6. 关键词搜索:")
        keywords = ['Python', '自动化', '文档', '表格']
        
        for keyword in keywords:
            occurrences = []
            for para in paragraphs:
                if keyword in para.text:
                    occurrences.append(para.text[:50] + "..." if len(para.text) > 50 else para.text)
            
            if occurrences:
                print(f"   '{keyword}' 出现 {len(occurrences)} 次")
                for i, occ in enumerate(occurrences[:2], 1):  # 显示前2个
                    print(f"     示例{i}: {occ}")
            else:
                print(f"   '{keyword}' 未找到")
        
        return self.analysis_results
    
    def extract_tables_to_csv(self):
        """提取表格数据到CSV"""
        
        import csv
        
        tables = self.document.tables
        if not tables:
            print("文档中没有表格")
            return
        
        for i, table in enumerate(tables, 1):
            csv_filename = f"table_{i}.csv"
            
            with open(csv_filename, 'w', newline='', encoding='utf-8') as csvfile:
                writer = csv.writer(csvfile)
                
                for row in table.rows:
                    row_data = [cell.text.strip() for cell in row.cells]
                    writer.writerow(row_data)
            
            print(f"表格{i}已导出到: {csv_filename}")
    
    def find_and_replace(self, old_text, new_text):
        """查找并替换文本"""
        
        changes_made = 0
        
        # 在段落中查找替换
        for paragraph in self.document.paragraphs:
            if old_text in paragraph.text:
                paragraph.text = paragraph.text.replace(old_text, new_text)
                changes_made += 1
        
        # 在表格中查找替换
        for table in self.document.tables:
            for row in table.rows:
                for cell in row.cells:
                    for paragraph in cell.paragraphs:
                        if old_text in paragraph.text:
                            paragraph.text = paragraph.text.replace(old_text, new_text)
                            changes_made += 1
        
        if changes_made > 0:
            new_filename = f"modified_{os.path.basename(self.filepath)}"
            self.document.save(new_filename)
            print(f"完成 {changes_made} 处替换,新文件: {new_filename}")
        else:
            print(f"未找到文本: '{old_text}'")
        
        return changes_made

# 使用示例
if __name__ == "__main__":
    # 首先保存创建的文档
    doc_creator.save()
    
    # 分析文档
    analyzer = WordDocumentAnalyzer(doc_creator.filename)
    results = analyzer.analyze_document()
    
    # 导出表格
    analyzer.extract_tables_to_csv()
    
    # 查找替换示例
    # analyzer.find_and_replace("Python", "Python编程")

四、实际应用示例

4.1 自动生成报告

python 复制代码
python
def generate_monthly_report(data, output_file="月度报告.docx"):
    """生成月度报告"""
    
    doc = Document()
    
    # 添加报告标题
    title = doc.add_heading('月度工作报告', 0)
    title.alignment = WD_ALIGN_PARAGRAPH.CENTER
    
    # 添加基本信息
    doc.add_paragraph(f'报告月份: {data["month"]}')
    doc.add_paragraph(f'生成日期: {data["generation_date"]}')
    doc.add_paragraph(f'报告人: {data["author"]}')
    doc.add_paragraph('-' * 50)
    
    # 工作概述
    doc.add_heading('一、工作概述', 1)
    doc.add_paragraph(data['overview'])
    
    # 工作成果
    doc.add_heading('二、主要工作成果', 1)
    
    for i, achievement in enumerate(data['achievements'], 1):
        doc.add_heading(f'{i}. {achievement["title"]}', 2)
        doc.add_paragraph(achievement['description'])
        
        if 'metrics' in achievement:
            table = doc.add_table(rows=len(achievement['metrics']) + 1, cols=2)
            table.style = 'Light Grid Accent 1'
            
            # 表头
            table.cell(0, 0).text = '指标'
            table.cell(0, 1).text = '数值'
            
            # 数据
            for j, (metric, value) in enumerate(achievement['metrics'].items(), start=1):
                table.cell(j, 0).text = metric
                table.cell(j, 1).text = str(value)
    
    # 问题和挑战
    if 'challenges' in data:
        doc.add_heading('三、遇到的问题与挑战', 1)
        
        for i, challenge in enumerate(data['challenges'], 1):
            doc.add_paragraph(f'{i}. {challenge}', style='List Bullet')
    
    # 下月计划
    doc.add_heading('四、下月工作计划', 1)
    
    table = doc.add_table(rows=len(data['next_month_plans']) + 1, cols=3)
    table.style = 'Medium Shading 1 Accent 1'
    
    # 表头
    headers = ['序号', '工作计划', '预期完成时间']
    for i, header in enumerate(headers):
        table.cell(0, i).text = header
    
    # 计划内容
    for i, plan in enumerate(data['next_month_plans'], start=1):
        table.cell(i, 0).text = str(i)
        table.cell(i, 1).text = plan['task']
        table.cell(i, 2).text = plan['deadline']
    
    # 总结
    doc.add_heading('五、总结', 1)
    doc.add_paragraph(data['summary'])
    
    # 保存文档
    doc.save(output_file)
    print(f"月度报告已生成: {output_file}")
    
    return output_file

# 使用示例
report_data = {
    'month': '2024年1月',
    'generation_date': '2024-01-31',
    'author': '张三',
    'overview': '本月主要完成了项目开发、团队管理和技术学习等工作。',
    'achievements': [
        {
            'title': '项目开发',
            'description': '完成了核心功能模块的开发工作。',
            'metrics': {'完成模块数': 5, '代码行数': 15000, 'Bug修复数': 12}
        },
        {
            'title': '团队管理',
            'description': '组织了3次团队技术分享会。',
            'metrics': {'团队会议': 8, '技术分享': 3, '新人培训': 2}
        }
    ],
    'challenges': [
        '项目进度比预期延迟了2天',
        '部分技术难点需要进一步研究'
    ],
    'next_month_plans': [
        {'task': '完成项目测试阶段', 'deadline': '2024-02-15'},
        {'task': '准备项目上线', 'deadline': '2024-02-28'},
        {'task': '团队技术培训', 'deadline': '2024-02-20'}
    ],
    'summary': '本月工作总体进展顺利,下月将继续努力完成项目目标。'
}

# generate_monthly_report(report_data)

4.2 批量处理 Word 文档

python 复制代码
python
import os
import glob
from docx import Document

class WordBatchProcessor:
    """Word文档批量处理器"""
    
    def __init__(self, input_folder, output_folder=None):
        self.input_folder = input_folder
        self.output_folder = output_folder or f"{input_folder}_processed"
        
        # 创建输出文件夹
        os.makedirs(self.output_folder, exist_ok=True)
    
    def process_all_documents(self, process_function):
        """处理所有文档"""
        
        # 查找所有Word文档
        doc_files = glob.glob(os.path.join(self.input_folder, "*.docx"))
        docx_files = glob.glob(os.path.join(self.input_folder, "*.docx"))
        
        all_files = doc_files + docx_files
        
        print(f"找到 {len(all_files)} 个Word文档")
        
        processed_files = []
        for file_path in all_files:
            try:
                print(f"正在处理: {os.path.basename(file_path)}")
                
                # 处理文档
                result = process_function(file_path)
                
                # 保存处理后的文档
                output_path = os.path.join(
                    self.output_folder, 
                    f"processed_{os.path.basename(file_path)}"
                )
                
                result.save(output_path)
                processed_files.append(output_path)
                print(f"  已保存: {os.path.basename(output_path)}")
                
            except Exception as e:
                print(f"  处理失败: {e}")
        
        print(f"\n处理完成! 共处理 {len(processed_files)} 个文档")
        return processed_files
    
    @staticmethod
    def add_watermark(input_file):
        """添加水印到文档(示例处理函数)"""
        
        doc = Document(input_file)
        
        # 在文档开头添加水印信息
        watermark = doc.add_paragraph()
        watermark.add_run("内部文档 - 请勿外传").bold = True
        watermark.add_run(f" 处理时间: {os.path.basename(input_file)}")
        
        return doc
    
    @staticmethod
    def update_template(input_file, replacements):
        """更新模板内容(示例处理函数)"""
        
        doc = Document(input_file)
        
        # 在所有段落中查找替换
        for paragraph in doc.paragraphs:
            for old_text, new_text in replacements.items():
                if old_text in paragraph.text:
                    paragraph.text = paragraph.text.replace(old_text, new_text)
        
        # 在表格中查找替换
        for table in doc.tables:
            for row in table.rows:
                for cell in row.cells:
                    for paragraph in cell.paragraphs:
                        for old_text, new_text in replacements.items():
                            if old_text in paragraph.text:
                                paragraph.text = paragraph.text.replace(old_text, new_text)
        
        return doc

# 使用示例
if __name__ == "__main__":
    # 创建批量处理器
    processor = WordBatchProcessor("./documents")
    
    # 批量添加水印
    # processed = processor.process_all_documents(processor.add_watermark)
    
    # 批量更新模板
    replacements = {
        "[公司名称]": "某某科技有限公司",
        "[联系人]": "李四",
        "[电话]": "138-0013-8000",
        "[日期]": "2024-01-31"
    }
    
    # 使用lambda函数传递额外参数
    # processed = processor.process_all_documents(
    #     lambda file_path: processor.update_template(file_path, replacements)
    # )

总结

Python 的 python-docx 库为 Word 文档自动化提供了强大的功能,包括:

  • 文档创建和编辑:轻松创建新的Word文档或编辑现有文档
  • 文本格式化:支持丰富的文本格式设置,包括字体、颜色、大小、对齐等
  • 表格操作:创建、填充和格式化表格
  • 图片插入:在文档中插入和调整图片
  • 样式管理:使用预定义样式或创建自定义样式
  • 批量处理:自动化处理大量文档

通过掌握这些技能,你可以:

  • 自动化生成报告、合同、信函等标准文档
  • 批量处理文档格式和内容
  • 从数据源自动生成数据驱动的文档
  • 提高文档处理效率和准确性

记得在实际使用时,根据具体需求调整代码,并注意处理可能出现的异常情况。

相关推荐
vibag7 小时前
构建智能体与工具调用
python·语言模型·大模型·langgraph
小途软件7 小时前
高校宿舍访客预约管理平台开发
java·人工智能·pytorch·python·深度学习·语言模型
-dcr7 小时前
49.python自动化
运维·python·自动化
code bean7 小时前
Flask图片服务在不同网络接口下的路径解析问题及解决方案
后端·python·flask
Chasing Aurora7 小时前
Python后端开发之旅(三)
开发语言·python·langchain·protobuf
linhx8 小时前
【AIGC工作流】解构AI短剧生产管线:从手动调用DeepSeek+MJ,到Agent一站式自动化的演进
人工智能·自动化·aigc
于越海8 小时前
材料电子理论核心四个基本模型的python编程学习
开发语言·笔记·python·学习·学习方法
中年程序员一枚9 小时前
Springboot报错Template not found For name “java/lang/Object_toString.sql
java·spring boot·python
驭白.9 小时前
不止于自动化:新能源汽车智造的数字基座如何搭建?
大数据·人工智能·自动化·汽车·数字化转型·制造业
爆更小哇10 小时前
Selenium自动化测试函数全解析(二)
java·selenium·测试工具·自动化