第二篇 · Web开发与自动化📋 第6章 自动化办公用Python解放重复劳动,让办公效率翻倍6.1 Excel自动化用openpyxl读写Excel、创建图表、批量处理Excel自动化 – 告别手动复制粘贴每个打工人都有过这样的经历:打开一个Excel表,复制A列的数据,粘贴到B列,调整格式,设置公式,画个图表……然后下周再来一遍。如果你每个月要处理50份类似的报表,手动操作可能需要整整两天。但用Python自动化?5分钟搞定,而且零错误。openpyxl是Python操作Excel文件的利器:读取数据:遍历单元格、按行按列读取写入数据:设置值、公式、样式创建图表:柱状图、饼图、折线图格式美化:字体、颜色、边框、合并单元格让我们从一份员工工资表开始,体验Excel自动化的魔力!# pip install openpyxlfromopenpyxlimportWorkbook,load_workbookfromopenpyxl.stylesimportFont,PatternFill,Alignment,Border,Sidefromopenpyxl.chartimportBarChart,PieChart,Referencefromopenpyxl.utilsimportget_column_letterfromdatetimeimportdatetime# ========== 示例1:创建工资报表 ==========defcreate_salary_report():"""创建一份格式化的员工工资报表"""wb=Workbook()ws=wb.active ws.title="2024年1月工资表"# 定义样式header_font=Font(name="Arial",bold=True,size=12,color="FFFFFF")header_fill=PatternFill(start_color="4472C4",end_color="4472C4",fill_type="solid")header_align=Alignment(horizontal="center",vertical="center")thin_border=Border(left=Side(style="thin"),right=Side(style="thin"),top=Side(style="thin"),bottom=Side(style="thin"))# 标题行ws.merge_cells("A1:G1")ws["A1"]="XX公司 2024年1月员工工资表"ws["A1"].font=Font(name="Arial",bold=True,size=16)ws["A1"].alignment=Alignment(horizontal="center")# 表头headers=["工号","姓名","部门","基本工资","绩效奖金","扣款","实发工资"]forcol,headerinenumerate(headers,1):cell=ws.cell(row=3,column=col,value=header)cell.font=header_font cell.fill=header_fill cell.alignment=header_align cell.border=thin_border# 员工数据employees=[("E001","张三","技术部",15000,3000,800),("E002","李四","市场部",12000,2500,600),("E003","王五","财务部",13000,2000,700),("E004","赵六","技术部",18000,4000,900),("E005","钱七","市场部",11000,1800,500),("E006","孙八","技术部",20000,5000,1000),("E007","周九","人事部",10000,1500,400),("E008","吴十","技术部",16000,3500,850),]# 写入数据并设置公式fori,(eid,name,dept,base,bonus,deduct)inenumerate(employees,4):ws.cell(row=i,column=1,value=eid)ws.cell(row=i,column=2,value=name)ws.cell(row=i,column=3,value=dept)ws.cell(row=i,column=4,value=base)ws.cell(row=i,column=5,value=bonus)ws.cell(row=i,column=6,value=deduct)# 实发工资 = 基本工资 + 绩效奖金 - 扣款(用Excel公式)ws.cell(row=i,column=7).value=f"=D{i}+E{i}-F{i}"# 设置数字格式为货币forcolinrange(4,8):ws.cell(row=i,column=col).number_format='#,##0.00'ws.cell(row=i,column=col).border=thin_borderforcolinrange(1,4):ws.cell(row=i,column=col).border=thin_border ws.cell(row=i,column=col).alignment=Alignment(horizontal="center")# 汇总行last_row=4+len(employees)-1summary_row=last_row+1ws.cell(row=summary_row,column=3,value="合计")ws.cell(row=summary_row,column=3).font=Font(bold=True)forcolin[4,5,6,7]:col_letter=get_column_letter(col)ws.cell(row=summary_row,column=col).value=f"=SUM({col_letter}4:{col_letter}{last_row})"ws.cell(row=summary_row,column=col).font=Font(bold=True)ws.cell(row=summary_row,column=col).number_format='#,##0.00'# 自动调整列宽forcolinrange(1,8):ws.column_dimensions[get_column_letter(col)].width=15wb.save("salary_report.xlsx")print("工资报表已生成:salary_report.xlsx")# ========== 示例2:创建图表 ==========defcreate_chart():"""在Excel中创建柱状图和饼图"""wb=Workbook()ws=wb.active ws.title="销售数据"# 销售数据ws.append(["产品","Q1销量","Q2销量","Q3销量","Q4销量"])sales_data=[["笔记本电脑",120,150,180,200],["智能手机",300,280,350,400],["平板电脑",80,90,70,110],["智能手表",50,70,90,120],["无线耳机",200,250,300,350],]forrowinsales_data:ws.append(row)# 创建柱状图bar_chart=BarChart()bar_chart.type="col"bar_chart.title="各产品季度销量"bar_chart.y_axis.title="销量(台)"bar_chart.x_axis.title="产品"bar_chart.style=10data=Reference(ws,min_col=2,max_col=5,min_row=1,max_row=6)cats=Reference(ws,min_col=1,min_row=2,max_row=6)bar_chart.add_data(data,titles_from_data=True)bar_chart.set_categories(cats)bar_chart.width=20bar_chart.height=12ws.add_chart(bar_chart,"A8")# 创建饼图(年度总销量占比)# 先计算年度总销量ws.cell(row=7,column=1,value="年度总计")forrowinrange(2,7):ws.cell(row=row,column=6).value=f"=SUM(B{row}:E{row})"forrowinrange(2,7):ws.cell(row=row+7,column=8).value=ws.cell(row=row,column=1).value ws.cell(row=row+7,column=9).value=f"=F{row}"pie_chart=PieChart()pie_chart.title="年度销量占比"pie_chart.style=10pie_data=Reference(ws,min_col=9,max_col=9,min_row=8,max_row=13)pie_cats=Reference(ws,min_col=8,min_row=9,max_row=13)pie_chart.add_data(pie_data,titles_from_data=True)pie_chart.set_categories(pie_cats)pie_chart.width=16pie_chart.height=12ws.add_chart(pie_chart,"H8")wb.save("sales_chart.xlsx")print("销售图表已生成:sales_chart.xlsx")# 运行示例create_salary_report()create_chart()💡 技巧Excel自动化的实用技巧:使用 f-strings 生成Excel公式(如 f"=SUM(A1:A{last_row})")批量处理多个Excel文件时,用 glob.glob(“*.xlsx”) 获取所有文件路径读取大文件时用 read_only=True 模式打开,内存占用大幅减少使用 pandas 的 read_excel() 和 to_excel() 可以更高效地处理数据密集型任务🔑 核心要点核心知识点:Workbook() 创建新工作簿,load_workbook() 打开已有文件ws.cell(row, column, value) 写入单元格,ws.append(row_data) 追加一行Font、PatternFill、Alignment、Border 控制单元格样式merge_cells() 合并单元格,get_column_letter() 转换列号BarChart、PieChart 等图表类通过 Reference 绑定数据区域Excel公式以 = 开头,可以在单元格中直接写入公式字符串🧪 随堂测验在openpyxl中,如何在单元格中写入Excel公式?A. 使用 ws.formula() 方法B. 直接将公式字符串赋值给单元格的value,如 cell.value = ‘=SUM(A1:A10)’C. 使用 ws.calculate(‘SUM(A1:A10)’) 方法D. 必须先安装xlcalc插件答案解析:在openpyxl中,写入Excel公式非常简单——直接将公式字符串赋值给单元格的value属性即可。公式以等号(=)开头,和你在Excel中手动输入公式的方式完全一样。例如 cell.value = ‘=SUM(A1:A10)’ 或 cell.value = f’=D{i}+E{i}-F{i}'。Excel打开文件时会自动计算这些公式的结果。6.2 PDF处理PDF合并、拆分、文本提取与水印添加PDF处理 – 文件界的"剪刀+胶水"PDF是办公世界的"硬通货"——合同、报告、发票、论文,几乎都是PDF格式。但有时候你需要:把10个PDF合同合并成一个大文件从一个200页的报告中提取第50-60页给每页加上公司水印从PDF表格中提取数据到Excel手动操作?费时费力还容易出错。用Python?几行代码搞定!我们将使用三个强大的库:PyPDF2:PDF的"剪刀和胶水"——合并、拆分、旋转pdfplumber:PDF的"放大镜"——精准提取文本和表格reportlab:PDF的"画笔"——从零创建PDF文件# pip install PyPDF2 pdfplumber reportlabimportosfromPyPDF2importPdfMerger,PdfReader,PdfWriterfromreportlab.pdfgenimportcanvasfromreportlab.lib.pagesizesimportA4importpdfplumber# ========== 辅助函数:创建示例PDF ==========defcreate_sample_pdf(filename,title,pages=3):