Python自动化处理Excel、Word、PDF文档的操作大全

Written by

in

文章目录
  • 在日常工作中,处理 Excel 表格、PDF 文档和 Word 文档是必不可少的任务。Python 提供了强大的第三方库来帮助我们自动化这些重复性工作,极大提高效率。本文将详细介绍如何使用 openpyxl 操作 Excel,使用 PyPDF2 和 pdfplumber 操作 PDF,以及使用 python-docx 操作 Word。
  • openpyxl 是一个用于读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件的 Python 库。
  • 目录
    • Python 办公自动化完全指南:Excel、PDF 与 Word
    • 章节一:Python 使用 openpyxl 操作 Excel
      • 1、openpyxl 库介绍
      • 2、Python 怎么打开及读取表格内容?
        • 1)Excel 表格术语
        • 2)打开 Excel 表格并获取表格名称
        • 3)通过 sheet 名称获取表格
        • 4)获取表格的尺寸大小
        • 5)获取表格内某个格子的数据
        • 6)获取某个格子的行数、列数、坐标
        • 7)获取一系列格子
      • 3、Python 如何向 Excel 中写入某些内容?
        • 1)修改表格中的内容
      • 4、批量调整字体和样式
        • 1)修改字体样式
        • 2)获取表格中格子的字体样式
        • 3)设置对齐样式
        • 4)设置边框样式
        • 5)设置填充样式
        • 6)设置行高和列宽
        • 7)合并单元格
    • 章节二:Python 使用 PyPDF2 和 pdfplumber 操作 PDF
      • 1、PyPDF2 和 pdfplumber 库介绍
        • 2、Python 提取 PDF 文字内容
          • 1)利用 pdfplumber 提取文字
          • 2)利用 pdfplumber 提取表格并写入 Excel
        • 3、PDF 合并及页面的排序和旋转
          • 1)分割及合并 PDF
          • 2)旋转及排序 PDF
        • 4、PDF 批量加水印及加密、解密
          • 1)批量加水印
          • 2)批量加密、解密
      • 章节三:Python 使用 python-docx 操作 Word
        • 1、python-docx 库介绍
          • 2、Python 读取 Word 文档内容
            • 1)Word 文档结构介绍
            • 2)python-docx 提取文字和文字块儿
            • 3)利用 Python 向 新建Word 文档写入内容
          • 3、利用 Python 调整 Word 文档样式
            • 1)修改文字字体样式
            • 2)修改段落样式

        在日常工作中,处理 Excel 表格、PDF 文档和 Word 文档是必不可少的任务。Python 提供了强大的第三方库来帮助我们自动化这些重复性工作,极大提高效率。本文将详细介绍如何使用 openpyxl 操作 Excel,使用 PyPDF2pdfplumber 操作 PDF,以及使用 python-docx 操作 Word。

        openpyxl 是一个用于读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件的 Python 库。

        • 安装
        pip install openpyxl
        
        • 核心概念
          • Workbook: 工作簿(整个 Excel 文件)
          • Worksheet: 工作表(Sheet)
          • Cell: 单元格

        • Workbook: Excel 文件对象
        • Sheet: 表单
        • Row: 行(从 1 开始)
        • Column: 列(从 A 开始或从 1 开始)
        • Cell: 单元格

        from openpyxl import load_workbook
        
        # 加载工作簿
        wb = load_workbook('example.xlsx')
        
        # 获取所有 sheet 名称
        print(wb.sheetnames) 
        # 输出: ['Sheet1', 'Sheet2']
        

        # 获取特定的 sheet
        ws = wb['Sheet1']
        # 或者获取当前活跃的 sheet
        ws_active = wb.active
        print(ws.title)
        

        # 获取表格的最大行和最大列
        print(f"最大行: {ws.max_row}")
        print(f"最大列: {ws.max_column}")
        # output: 尺寸: A1:C10
        print(f"尺寸: {ws.dimensions}") 
        

        ① sheet[“A1”] 方式

        cell_value = ws['A1'].value
        print(cell_value)
        

        ② sheet.cell(row=, column=) 方式

        # 注意:row 和 column 都是从 1 开始
        cell_value = ws.cell(row=1, column=1).value
        print(cell_value)
        

        c = ws['B2']
        print(f"行: {c.row}, 列: {c.column}, 坐标: {c.coordinate}")
        

        ① sheet[] 方式

        # 获取 A 列
        col_a = ws['A']
        # 获取 A 到 C 列
        col_range = ws['A:C']
        # 获取第 1 行
        row_1 = ws[1]
        # 获取 A1 到 C3 的区域
        cell_range = ws['A1:C3']
        
        for row in cell_range:
            for cell in row:
                print(cell.value)
        

        ② .iter_rows() 方式
        按行迭代,返回生成器,效率更高。

        for row in ws.iter_rows(min_row=1, max_row=2, min_col=1, max_col=3):
            for cell in row:
                print(cell.value)
        

        ③ sheet.rows
        返回所有行的生成器。

        for row in ws.rows:
            print(row) # tuple of cells
        

        ① 向某个格子中写入内容并保存

        ws['A1'] = 'Hello World'
        ws.cell(row=1, column=2, value='Python')
        # 保存文件(如果是修改现有文件,建议另存为新文件名以防数据丢失)
        wb.save('modified_example.xlsx')
        

        ② .append():向表格中插入行数据
        非常常用的方法,用于在表格末尾追加一行数据。

        # 添加一行数据
        ws.append(['Name', 'Age', 'Gender'])
        ws.append(['Alice', 25, 'Female'])
        

        ③ 在 Python 中使用 Excel 函数公式

        ws['C1'] = 10
        ws['C2'] = 20
        ws['C3'] = '=SUM(C1:C2)' # 写入公式
        

        ④ .insert_cols() 和 .insert_rows():插入空行和空列

        ws.insert_rows(idx=2, amount=1) # 在第2行前插入1行
        ws.insert_cols(idx=1, amount=2) # 在第1列前插入2列
        

        ⑤ .delete_rows() 和 .delete_cols():删除行和列

        ws.delete_rows(idx=2, amount=1) # 删除第2行
        ws.delete_cols(idx=1, amount=1) # 删除第1列
        

        ⑥ .move_range():移动格子

        # 将 A1:C3 区域向下移动 2 行,向右移动 1 列
        ws.move_range("A1:C3", rows=2, cols=1)
        

        ⑦ .create_sheet():创建新的 sheet 表格

        ws_new = wb.create_sheet("NewSheet", index=0) # index=0 插入到最前面
        

        ⑧ .remove():删除某个 sheet 表

        del wb['NewSheet']
        # 或者
        # wb.remove(wb['NewSheet'])
        

        ⑨ .copy_worksheet():复制一个 sheet 表

        source = wb.active
        target = wb.copy_worksheet(source)
        target.title = "Copy of Active"
        

        ⑩ sheet.title:修改 sheet 表的名称

        ws.title = "My Renamed Sheet"
        

        ⑪ 创建新的 Excel 表格文件

        from openpyxl import Workbook
        wb_new = Workbook()
        ws_new = wb_new.active
        ws_new.title = "Data"
        wb_new.save("new_file.xlsx")
        wb.save('modified_example.xlsx')
        

        ⑫ sheet.freeze_panes:冻结窗口

        ws.freeze_panes = 'A2' # 冻结第一行
        # ws.freeze_panes = 'B1' # 冻结第一列
        

        ⑬ sheet.auto_filter.ref:给表格添加“筛选器”

        from openpyxl import load_workbook
        wb = load_workbook('example.xlsx')
        ws = wb.active
        ws.auto_filter.ref = ws.dimensions # 给所有有数据的区域添加筛选
        # 或者指定区域
        ws.auto_filter.ref = "A1:C10"
        wb.save('modified_example.xlsx')
        

        需要导入 openpyxl.styles 模块。

        from openpyxl.styles import Font
        ws = wb.active
        # 粗体,斜体,红色,字号20
        font_style = Font(name='Arial', size=20, bold=True, italic=True, color='FF0000')
        ws['A1'].font = font_style
        wb.save('modified_example.xlsx')
        

        current_font = ws['A1'].font
        print(current_font.name, current_font.size)
        

        from openpyxl.styles import Alignment
        
        # 水平居中,垂直居中,自动换行
        align = Alignment(horizontal='center', vertical='center', wrap_text=True)
        ws['A1'].alignment = align
        wb.save('modified_example.xlsx')
        

        from openpyxl import load_workbook
        from openpyxl.styles import Border, Side
        
        wb = load_workbook('example.xlsx')
        ws = wb.active
        
        # 使用双线边框,视觉上看起来更粗
        double_border = Side(border_style="double", color="FF0000")
        border = Border(left=double_border, 
                        right=double_border, 
                        top=double_border, 
                        bottom=double_border)
        
        ws['A1'].border = border
        wb.save('modified_example.xlsx')
        
        "thin" - 细边框
        "medium" - 中等粗细
        "thick" - 粗边框
        "double" - 双线边框
        "hair" - 极细边框
        "dashed" - 虚线边框
        "dotted" - 点线边框等
        

        from openpyxl import load_workbook
        from openpyxl.styles import PatternFill
        
        # 加载工作簿
        wb = load_workbook('example.xlsx')
        ws = wb.active
        # 黄色背景填充
        fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")
        ws['A1'].fill = fill
        
        # 保存修改
        wb.save('modified_example.xlsx')
        
        

        from openpyxl import load_workbook
        
        # 加载工作簿
        wb = load_workbook('example.xlsx')
        ws = wb.active
        ws.row_dimensions[1].height = 30 # 设置第1行高度
        ws.column_dimensions['A'].width = 20 # 设置A列宽度
        # 保存修改
        wb.save('modified_example.xlsx')
        

        from openpyxl import load_workbook
        
        # 加载工作簿
        wb = load_workbook('example.xlsx')
        ws = wb.active
        ws.merge_cells('A1:B2')
        # 或者
        # ws.merge_cells(start_row=1, start_column=1, end_row=2, end_column=2)
        # 取消合并
        # ws.unmerge_cells('A1:B2')
        # 保存修改
        wb.save('modified_example.xlsx')
        

        PyPDF2: 主要用于合并、拆分、旋转、加密 PDF 等页面级操作,提取文本能力较弱。

        pdfplumber: 专注于提取 PDF 中的文本和表格,准确率较高。

        安装:

        pip install PyPDF2 pdfplumber
        

        import pdfplumber
        
        with pdfplumber.open("荷塘月色.pdf") as pdf:
            for page in pdf.pages:
                text = page.extract_text()
                print(f"--- Page {page.page_number} ---")
                print(text)
        

        import pdfplumber
        import pandas as pd
        
        with pdfplumber.open("example_table.pdf") as pdf:
            page = pdf.pages[0]  # 假设表格在第一页
            table = page.extract_table()
        
            if table:
                df = pd.DataFrame(table[1:], columns=table[0])  # 假设第一行是表头
                df.to_excel("output_table.xlsx", index=False)
        

        使用 PyPDF2 进行操作。

        ① 合并 PDF

        from PyPDF2 import PdfMerger
        
        merger = PdfMerger()
        pdfs = ['example_table1.pdf', 'example_table2.pdf']
        
        for pdf in pdfs:
            merger.append(pdf)
        
        merger.write("merged_result.pdf")
        merger.close()
        

        ② 拆分 PDF

        from PyPDF2 import PdfReader, PdfWriter
        
        reader = PdfReader("merged_result.pdf")
        
        for i, page in enumerate(reader.pages):
            writer = PdfWriter()
            writer.add_page(page)
            with open(f"page_{i+1}.pdf", "wb") as f:
                writer.write(f)
        

        ① 旋转 PDF

        from PyPDF2 import PdfReader, PdfWriter
        
        reader = PdfReader("荷塘月色.pdf")
        writer = PdfWriter()
        
        page = reader.pages[0]
        page.rotate(90) # 顺时针旋转90度
        writer.add_page(page)
        
        with open("rotated.pdf", "wb") as f:
            writer.write(f)
        

        ② 排序 PDF

        可以通过调整 add_page 的顺序来实现。

        # 假设倒序保存
        from PyPDF2 import PdfReader, PdfWriter
        
        reader = PdfReader("荷塘月色.pdf")
        writer = PdfWriter()
        for page in reversed(reader.pages):
            writer.add_page(page)
        
        with open("reversed.pdf", "wb") as f:
            writer.write(f)
        

        原理:将水印页面作为“印章”盖在每一页上。

        from PyPDF2 import PdfReader, PdfWriter
        
        watermark = PdfReader("watermark.pdf").pages[0]
        reader = PdfReader("content.pdf")
        writer = PdfWriter()
        
        for page in reader.pages:
            page.merge_page(watermark) # 合并页面
            writer.add_page(page)
        
        with open("watermarked.pdf", "wb") as f:
            writer.write(f)
        

        ① 加密 PDF

        from PyPDF2 import PdfReader, PdfWriter
        
        writer = PdfWriter()
        reader = PdfReader("荷塘月色.pdf")
        
        for page in reader.pages:
            writer.add_page(page)
        
        writer.encrypt("password123") # 设置密码
        
        with open("encrypted.pdf", "wb") as f:
            writer.write(f)
        

        ② 解密 PDF 并保存为未加密的 PDF

        from PyPDF2 import PdfReader, PdfWriter
        reader = PdfReader("encrypted.pdf")
        
        if reader.is_encrypted:
            reader.decrypt("password123")
        
        writer = PdfWriter()
        for page in reader.pages:
            writer.add_page(page)
        
        with open("decrypted.pdf", "wb") as f:
            writer.write(f)
        

        • 用途:用于创建和更新 .docx 文件。
        • 安装
        pip install python-docx
        

        • Document: 整个文档
        • Paragraph: 段落(回车符分隔)
        • Run: 文本块(具有相同样式的连续文本)

        ① python-docx 提取文字

        from docx import Document
        
        doc = Document("example.docx")
        
        full_text = []
        for para in doc.paragraphs:
            full_text.append(para.text)
        
        print("n".join(full_text))
        

        ② python-docx 提取文字块儿

        from docx import Document
        
        doc = Document("example.docx")
        
        for para in doc.paragraphs:
            for run in para.runs:
                print(run.text) # 打印每个样式块的文本
        

        ① 添加段落

        from docx import Document
        
        doc = Document()
        p = doc.add_paragraph('这是一个新段落。')
        
        doc.save('test_save.docx')
        

        ② 添加文字块儿

        from docx import Document
        
        doc = Document()
        p = doc.add_paragraph('这是一个新段落。')
        run = p.add_run('这是加粗的文字。')
        run.bold = True
        p.add_run('这是普通的文字。')
        doc.save('test_save.docx')
        

        ③ 添加一个分页

        from docx import Document
        
        doc = Document()
        p = doc.add_paragraph('这是一个新段落。')
        run = p.add_run('这是加粗的文字。')
        run.bold = True
        p.add_run('这是普通的文字。')
        doc.add_page_break()
        
        doc.save('test_save.docx')
        

        ④ 添加图片

        from docx import Document
        from docx.shared import Inches
        
        doc = Document()
        p = doc.add_paragraph('这是一个新段落。')
        run = p.add_run('这是加粗的文字。')
        run.bold = True
        p.add_run('这是普通的文字。')
        # doc.add_page_break()
        doc.add_picture('img.jpg', width=Inches(1.25)) # 需要 from docx.shared import Inches
        doc.save('test_save.docx')
        

        ⑤ 添加表格

        from docx import Document
        
        doc = Document()
        table = doc.add_table(rows=2, cols=2)
        table.cell(0, 0).text = "A1"
        table.cell(0, 1).text = "B1"
        doc.save('test_save.docx')
        

        ⑥ 提取 Word 表格,并保存在 Excel 中

        import pandas as pd
        from docx import Document
        
        doc = Document("test_save.docx")
        tables_data = []
        
        for table in doc.tables:
            for row in table.rows:
                row_data = [cell.text for cell in row.cells]
                tables_data.append(row_data)
        
        df = pd.DataFrame(tables_data)
        df.to_excel("word_tables.xlsx", index=False)
        

        from docx import Document
        from docx.shared import Pt, RGBColor
        from docx.oxml.ns import qn
        
        
        doc = Document()
        p = doc.add_paragraph()
        run = p.add_run('自定义样式文字')
        run.font.size = Pt(14)
        run.font.color.rgb = RGBColor(0x42, 0x24, 0xE9)
        # 设置中文字体需要特殊处理
        run.font.name = '微软雅黑'
        run._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
        
        doc.save('test_save.docx')
        

        ① 对齐样式

        from docx import Document
        from docx.shared import Pt, RGBColor
        from docx.oxml.ns import qn
        from docx.enum.text import WD_ALIGN_PARAGRAPH
        
        
        doc = Document()
        p = doc.add_paragraph()
        run = p.add_run('自定义样式文字')
        run.font.size = Pt(14)
        run.font.color.rgb = RGBColor(0x42, 0x24, 0xE9)
        # 设置中文字体需要特殊处理
        run.font.name = '微软雅黑'
        run._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER # 居中
        
        doc.save('test_save.docx')
        

        ② 行间距调整

        from docx import Document
        from docx.shared import Pt, RGBColor
        from docx.oxml.ns import qn
        from docx.enum.text import WD_ALIGN_PARAGRAPH
        
        
        doc = Document()
        p = doc.add_paragraph()
        run = p.add_run('自定义样式文字测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试')
        run.font.size = Pt(14)
        run.font.color.rgb = RGBColor(0x42, 0x24, 0xE9)
        # 设置中文字体需要特殊处理
        run.font.name = '微软雅黑'
        run._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER # 居中
        p.paragraph_format.line_spacing = 1.5 # 1.5倍行距
        
        doc.save('test_save.docx')
        

        ③ 段前与段后间距

        from docx import Document
        from docx.shared import Pt, RGBColor
        from docx.oxml.ns import qn
        from docx.enum.text import WD_ALIGN_PARAGRAPH
        
        
        doc = Document()
        p = doc.add_paragraph()
        run = p.add_run('自定义样式文字测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试')
        run.font.size = Pt(14)
        run.font.color.rgb = RGBColor(0x42, 0x24, 0xE9)
        # 设置中文字体需要特殊处理
        run.font.name = '微软雅黑'
        run._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER # 居中
        p.paragraph_format.line_spacing = 1.5 # 1.5倍行距
        
        p.paragraph_format.space_before = Pt(12) # 段前12磅
        p.paragraph_format.space_after = Pt(12)  # 段后12磅
        p = doc.add_paragraph()
        run = p.add_run('自定义样式文字测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2测试2')
        
        doc.save('test_save.docx')
        
        

        注意:以上代码示例需要配合相应的文件环境运行。使用前请确保已安装 openpyxl, pandas, PyPDF2, pdfplumber, python-docx 等库。

        以上就是Python自动化处理Excel、Word、PDF文档的操作大全的详细内容,更多关于Python处理Excel、Word、PDF文档的资料请关注风君子博客其它相关文章!

        您可能感兴趣的文章:

        • Python自动化办公全攻略之Excel/Word/PDF/邮件批量处理
        • Python自动化办公之Excel、Word和PDF操作指南
        • Python一站式进行提取文档内容(Word、Excel、PDF 和PPT)
        • Python自动化操作Excel/Word/PDF的实战指南
        • 使用Python实现Office文档(Word/Excel/PowerPoint)批量转换为PDF

        站内搜索