【自动化实战】Python操作Excel/WORD/PDF:openpyxl与docx库详解

在现代办公环境中,我们经常需要处理各种文档格式,如Excel表格、Word文档和PDF文件。手动处理这些文档不仅耗时,而且容易出错。Python提供了多个强大的库来实现文档处理的自动化,本文将重点介绍如何使用openpyxl和docx库来操作Excel和Word文档,并简要介绍PDF处理的方法。

一、Python操作Excel:openpyxl库

1. 安装openpyxl

bash 复制代码
pip install openpyxl

2. 基本操作

创建工作簿和工作表
python 复制代码
from openpyxl import Workbook

# 创建工作簿
wb = Workbook()

# 获取默认激活的工作表
ws = wb.active

# 设置工作表标题
ws.title = "员工数据"

# 创建新工作表
ws1 = wb.create_sheet("部门统计")  # 插入在最后
ws2 = wb.create_sheet("薪资汇总", 0)  # 插入在第一个位置

# 保存工作簿
wb.save("公司数据.xlsx")
读取和写入数据
python 复制代码
from openpyxl import load_workbook

# 加载现有工作簿
wb = load_workbook('公司数据.xlsx')

# 选择工作表
ws = wb['员工数据']

# 写入数据
ws['A1'] = '员工ID'
ws['B1'] = '姓名'
ws['C1'] = '部门'
ws['D1'] = '薪资'

# 批量写入数据
data = [
    [1, '张三', '技术部', 15000],
    [2, '李四', '市场部', 12000],
    [3, '王五', '财务部', 13000],
    [4, '赵六', '技术部', 16000]
]

for row in data:
    ws.append(row)

# 读取数据
for row in ws.iter_rows(min_row=2, max_row=5, values_only=True):
    print(f"员工{row[1]} 在{row[2]}部门,薪资为{row[3]}")

# 保存更改
wb.save('公司数据.xlsx')
高级功能:公式、样式和图表
python 复制代码
from openpyxl.styles import Font, Alignment, PatternFill
from openpyxl.chart import BarChart, Reference

# 设置标题行样式
bold_font = Font(bold=True, size=12)
fill = PatternFill(fill_type="solid", fgColor="DDDDDD")
align_center = Alignment(horizontal="center")

for cell in ws[1]:
    cell.font = bold_font
    cell.fill = fill
    cell.alignment = align_center

# 添加公式计算平均薪资
ws['E1'] = '平均薪资'
ws['E2'] = '=AVERAGE(D2:D5)'

# 创建图表
chart = BarChart()
chart.title = "部门薪资对比"
chart.x_axis.title = "员工"
chart.y_axis.title = "薪资"

data = Reference(ws, min_col=4, min_row=1, max_row=5)
categories = Reference(ws, min_col=2, min_row=2, max_row=5)
chart.add_data(data, titles_from_data=True)
chart.set_categories(categories)

ws.add_chart(chart, "G2")

wb.save('公司数据_增强.xlsx')

二、Python操作Word:python-docx库

1. 安装python-docx

bash 复制代码
pip install python-docx

2. 基本操作

创建文档和添加内容
python 复制代码
from docx import Document
from docx.shared import Inches, Pt
from docx.enum.text import WD_ALIGN_PARAGRAPH

# 创建新文档
doc = Document()

# 添加标题
doc.add_heading('公司季度报告', 0)

# 添加段落
p = doc.add_paragraph('本季度公司业绩表现良好,各部门均完成了既定目标。')
p.add_run('特别是技术部门').bold = True
p.add_run(',超额完成了项目开发任务。')

# 添加二级标题
doc.add_heading('部门业绩详情', level=2)

# 添加表格
table = doc.add_table(rows=1, cols=3)
table.style = 'Table Grid'

# 设置表头
hdr_cells = table.rows[0].cells
hdr_cells[0].text = '部门'
hdr_cells[1].text = '目标完成率'
hdr_cells[2].text = '同比增长'

# 添加数据
data = [
    ['技术部', '120%', '15%'],
    ['市场部', '95%', '8%'],
    ['财务部', '100%', '5%']
]

for dept, rate, growth in data:
    row_cells = table.add_row().cells
    row_cells[0].text = dept
    row_cells[1].text = rate
    row_cells[2].text = growth

# 添加分页符
doc.add_page_break()

# 添加另一个章节
doc.add_heading('下一步计划', level=2)
doc.add_paragraph(
    '1. 扩大技术团队规模', style='List Number'
)
doc.add_paragraph(
    '2. 开拓新市场', style='List Number'
)
doc.add_paragraph(
    '3. 优化财务管理流程', style='List Number'
)

# 保存文档
doc.save('季度报告.docx')
读取和修改现有文档
python 复制代码
from docx import Document

# 打开现有文档
doc = Document('季度报告.docx')

# 读取内容
full_text = []
for paragraph in doc.paragraphs:
    full_text.append(paragraph.text)

print('\n'.join(full_text))

# 修改内容
for paragraph in doc.paragraphs:
    if '技术部门' in paragraph.text:
        paragraph.text = paragraph.text.replace('技术部门', '研发中心')

# 保存修改后的文档
doc.save('季度报告_修改版.docx')

三、Python操作PDF

1. 常用PDF处理库

  • PyPDF2:用于拆分、合并、裁剪和转换PDF页面
  • pdfminer:用于提取PDF中的文本和元数据
  • ReportLab:用于创建PDF文档
  • pdfkit:将HTML转换为PDF(基于wkhtmltopdf)

2. 基本PDF操作示例

合并PDF文件
python 复制代码
import PyPDF2

def merge_pdfs(paths, output):
    pdf_writer = PyPDF2.PdfWriter()
    
    for path in paths:
        pdf_reader = PyPDF2.PdfReader(path)
        for page in range(len(pdf_reader.pages)):
            pdf_writer.add_page(pdf_reader.pages[page])
    
    with open(output, 'wb') as out:
        pdf_writer.write(out)

# 使用示例
merge_pdfs(['file1.pdf', 'file2.pdf'], 'merged.pdf')
提取PDF文本
python 复制代码
from pdfminer.high_level import extract_text

text = extract_text('document.pdf')
print(text)

四、实战案例:自动化生成报告

下面是一个综合案例,演示如何从Excel读取数据,然后生成Word报告和PDF报告。

python 复制代码
from openpyxl import load_workbook
from docx import Document
import pdfkit

# 1. 从Excel读取数据
wb = load_workbook('公司数据.xlsx')
ws = wb.active

dept_data = {}
for row in ws.iter_rows(min_row=2, values_only=True):
    dept = row[2]
    salary = row[3]
    if dept not in dept_data:
        dept_data[dept] = {
            'count': 0,
            'total_salary': 0,
            'max_salary': 0
        }
    
    dept_data[dept]['count'] += 1
    dept_data[dept]['total_salary'] += salary
    if salary > dept_data[dept]['max_salary']:
        dept_data[dept]['max_salary'] = salary

# 计算平均薪资
for dept in dept_data:
    dept_data[dept]['avg_salary'] = dept_data[dept]['total_salary'] / dept_data[dept]['count']

# 2. 生成Word报告
doc = Document()
doc.add_heading('公司部门统计报告', 0)

# 添加摘要段落
doc.add_paragraph(
    f本报告基于员工数据统计分析,共涵盖{len(dept_data)}个部门。'
)

# 添加表格
table = doc.add_table(rows=1, cols=4)
table.style = 'Table Grid'

# 表头
hdr_cells = table.rows[0].cells
hdr_cells[0].text = '部门'
hdr_cells[1].text = '员工数'
hdr_cells[2].text = '平均薪资'
hdr_cells[3].text = '最高薪资'

# 表格数据
for dept, data in dept_data.items():
    row_cells = table.add_row().cells
    row_cells[0].text = dept
    row_cells[1].text = str(data['count'])
    row_cells[2].text = f"{data['avg_salary']:.2f}"
    row_cells[3].text = str(data['max_salary'])

doc.add_paragraph('\n报告生成时间:2023年11月1日')
doc.save('部门统计报告.docx')

# 3. 转换为PDF
# 需要先安装wkhtmltopdf并设置路径
# path_wkhtmltopdf = r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'
# config = pdfkit.configuration(wkhtmltopdf=path_wkhtmltopdf)
# pdfkit.from_file('部门统计报告.docx', '部门统计报告.pdf')  # 注意:这种方法需要docx能正确转换为HTML

print("报告生成完成!")

五、总结

本文介绍了使用Python操作Excel、Word和PDF文件的基本方法:

  1. openpyxl 提供了强大的Excel操作功能,可以创建、读取、修改工作簿,支持公式、样式和图表
  2. python-docx 使得Word文档的创建和修改变得简单,支持段落、表格、样式等元素
  3. PDF处理可以使用多个库,根据需求选择合适的工具

通过这些工具,我们可以实现办公文档处理的自动化,大大提高工作效率和准确性。在实际应用中,可以根据具体需求组合使用这些库,构建复杂的文档处理流程。

六、进一步学习资源

通过掌握这些库的使用,你将能够处理大多数办公自动化场景,从简单的数据提取到复杂的报告生成,都能得心应手。

相关推荐
lancyu40 分钟前
关于多轮对话机器人的上下文Token优化和解决方案
人工智能·python·深度学习·机器学习·chatgpt·机器人·prompt
草莓橙子碗1 小时前
Claude 使用指南
开发语言·python
工具分享1 小时前
陪跑跟品爆单AI选品助手,高效跟品会赔本吗?
人工智能·python
COOLMO研究AI2 小时前
Python 如何实现 AI API 的提示词(Prompt)版本管理与热更新
人工智能·python·prompt
老郑聊AI业财智造2 小时前
Transformer 技术架构与源码分析
人工智能·python·深度学习·语言模型·架构·transformer·软件工程
程序员三藏2 小时前
自动化测试用例编写详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
230万光年的思念2 小时前
分子动力学模拟参考文献
python
HongXu_CaiYi3 小时前
0103-python相关-函数、文件
python
vortex54 小时前
从Conda到UV:Python项目依赖管理的现代演进
python·conda·uv
何以解忧,唯有..4 小时前
Python time 模块详解:时间处理与日期操作指南
开发语言·python