一、Word文档自动化处理
批量生成Word文档
使用python-docx库可以批量生成标准格式的Word文档。
from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
def generate_word_report(template_data, output_path):
doc = Document()
# 添加标题 title = doc.add_heading('工作报告', level=0) title.alignment =
WD_PARAGRAPH_ALIGNMENT.CENTER # 添加基本信息 doc.add_paragraph(f"姓名: {template_data['name']}") doc.add_paragraph(f"日期: {template_data['date']}") doc.add_paragraph(f"部门: {template_data['department']}") # 添加正文内容 doc.add_heading('工作内容', level=1) for item in template_data['content']: p = doc.add_paragraph(item, style='ListBullet') # 添加表格 doc.add_heading('项目进度', level=1) table = doc.add_table(rows=1, cols=3) hdr_cells = table.rows[0].cells hdr_cells[0].text = '项目名称' hdr_cells[1].text = '负责人' hdr_cells[2].text = '完成进度' for project in template_data['projects']: row_cells = table.add_row().cells row_cells[0].text = project['name'] row_cells[1].text = project['owner'] row_cells[2].text = project['progress'] # 保存文档 doc.save(output_path) print(f"文档已生成: {output_path}")
使用示例
data = {
'name': '张三',
'date': '2023-06-15',
'department': '技术部',
'content': [
'完成了项目需求分析',
'编写了核心模块代码',
'进行了单元测试'
],
'projects': [
{'name': 'OA系统升级', 'owner': '张三', 'progress': '80%'},
{'name': '数据平台', 'owner': '李四', 'progress': '50%'}
]
}
generate_word_report(data, 'work_report.docx')
Word文档批量替换内容
批量修改多个Word文档中的特定内容。
from docx import Document
import os
def batch_replace_in_word(folder_path, old_text, new_text):
for filename in os.listdir(folder_path):
if filename.endswith('.docx'):
file_path = os.path.join(folder_path, filename)
doc = Document(file_path)
# 替换段落中的文本 for para in doc.paragraphs: if old_text in para.text: para.text = para.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) # 保存修改后的文档 new_filename = f"modified_{filename}" new_path = os.path.join(folder_path, new_filename) doc.save(new_path) print(f"已处理: {filename} -> {new_filename}")
使用示例
batch_replace_in_word('./reports', '旧公司名称', '新公司名称')
二、Excel高级自动化处理
自动化数据透视表
使用pandas创建复杂的数据透视表。
import pandas as pd
def create_pivot_table(input_file, output_file):
df = pd.read_excel(input_file)
# 创建数据透视表 pivot = pd.pivot_table( df, index=['部门', '姓名'], columns=['季度'], values=['销售额', '利润'], aggfunc={'销售额': 'sum', '利润': 'mean'}, fill_value=0, margins=True, margins_name='总计' ) # 保存到Excel with pd.ExcelWriter(output_file) as writer: pivot.to_excel(writer, sheet_name='数据透视表') print(f"数据透视表已生成: {output_file}")
create_pivot_table('sales_data.xlsx', 'sales_pivot.xlsx')
自动化图表生成
在Excel中自动生成专业图表。
import pandas as pd
from openpyxl.chart import BarChart, Reference
def create_excel_chart(input_file, output_file):
df = pd.read_excel(input_file)
# 按部门汇总数据 summary = df.groupby('部门')['销售额'].sum().reset_index() # 写入Excel with pd.ExcelWriter(output_file, engine='openpyxl') as writer: summary.to_excel(writer, sheet_name='汇总', index=False) # 获取工作表对象 workbook = writer.book worksheet = writer.sheets['汇总'] # 创建柱状图 chart = BarChart() chart.title = "各部门销售额对比" chart.style = 13 chart.y_axis.title = '销售额' chart.x_axis.title = '部门' # 设置数据范围 data = Reference(worksheet, min_col=2, min_row=1, max_row=len(summary)+1, max_col=2) categories = Reference(worksheet, min_col=1, min_row=2, max_row=len(summary)+1) # 添加数据到图表 chart.add_data(data, titles_from_data=True) chart.set_categories(categories) # 将图表添加到工作表 worksheet.add_chart(chart, "D2") print(f"带图表的Excel文件已生成: {output_file}")
create_excel_chart('sales_data.xlsx', 'sales_with_chart.xlsx')
三、PPT自动化处理
批量生成PPT报告
使用python-pptx库自动生成PPT演示文稿。
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor
def generate_ppt_report(data, output_file):
prs = Presentation()
# 添加标题幻灯片 slide_layout = prs.slide_layouts[0] slide = prs.slides.add_slide(slide_layout) title = slide.shapes.title subtitle = slide.placeholders[1] title.text = data['title'] subtitle.text = data['subtitle'] # 添加内容幻灯片 for section in data['sections']: # 添加标题和内容幻灯片 slide_layout = prs.slide_layouts[1] slide = prs.slides.add_slide(slide_layout) title = slide.shapes.title content = slide.placeholders[1] title.text = section['title'] # 添加内容段落 tf = content.text_frame for item in section['content']: p = tf.add_paragraph() p.text = item p.level = 0 p.font.size = Pt(18) p.font.color.rgb = RGBColor(0, 0, 0) # 添加图表幻灯片 if 'chart_data' in section: slide_layout = prs.slide_layouts[5] slide = prs.slides.add_slide(slide_layout) title = slide.shapes.title title.text = section['title'] + " - 数据图表" # 添加图表 chart_data = section['chart_data'] x, y = Inches(2), Inches(2) cx, cy = Inches(6), Inches(4.5) chart = slide.shapes.add_chart( chart_data['chart_type'], x, y, cx, cy, chart_data['data'] ).chart # 保存PPT prs.save(output_file) print(f"PPT报告已生成: {output_file}")
使用示例
report_data = {
'title': '2023年季度报告',
'subtitle': '技术部 - 第一季度',
'sections': [
{
'title': '项目进展',
'content': [
'OA系统升级完成80%',
'数据平台开发完成50%',
'移动端优化已完成'
]
},
{
'title': '销售数据',
'content': [
'总销售额: yen1,200,000',
'同比增长: 15%',
'主要增长点: 新产品线'
],
'chart_data': {
'chart_type': 1, # 柱状图
'data': {
'categories': ['Q1', 'Q2', 'Q3', 'Q4'],
'series': [
('2022年', [250, 300, 280, 320]),
('2023年', [300, 350, 400, 450])
]
}
}
}
]
}
generate_ppt_report(report_data, 'quarter_report.pptx')
四、数据库自动化操作
Excel数据导入数据库
将Excel数据自动导入数据库。
import pandas as pd
import sqlite3
from sqlalchemy import create_engine
def excel_to_database(excel_file, db_file, table_name):
# 读取Excel文件
df = pd.read_excel(excel_file)
# 创建数据库连接 engine = create_engine(f'sqlite:///{db_file}') # 将数据写入数据库 df.to_sql(table_name, engine, if_exists='replace', index=False) print(f"数据已成功导入数据库 {db_file} 的表 {table_name}")
使用示例
excel_to_database('sales_data.xlsx', 'sales.db', 'quarter_sales')
数据库查询生成报表
从数据库查询数据并生成Excel报表。
import pandas as pd
import sqlite3
def generate_report_from_db(db_file, query, output_file):
# 连接数据库
conn = sqlite3.connect(db_file)
# 执行查询 df = pd.read_sql_query(query, conn) # 生成Excel报表 df.to_excel(output_file, index=False) print(f"报表已生成: {output_file}") # 关闭连接 conn.close()
使用示例
query = """
SELECT
department as 部门,
employee as 员工,
SUM(sales) as 总销售额,
AVG(sales) as 平均销售额
FROM sales_data
GROUP BY department, employee
ORDER BY SUM(sales) DESC
"""
generate_report_from_db('sales.db', query, 'sales_report.xlsx')
五、图像处理自动化
批量图片处理
使用Pillow库批量处理图片。
from PIL import Image, ImageFilter, ImageEnhance
import os
def batch_process_images(input_folder, output_folder):
# 确保输出文件夹存在
os.makedirs(output_folder, exist_ok=True)
# 处理每张图片 for filename in os.listdir(input_folder): if filename.lower().endswith(('.png', '.jpg', '.jpeg')): input_path = os.path.join(input_folder, filename) output_path = os.path.join(output_folder, f"processed_{filename}") try: with Image.open(input_path) as img: # 调整大小 img = img.resize((800, 600)) # 增强对比度 enhancer = ImageEnhance.Contrast(img) img = enhancer.enhance(1.2) # 锐化 img = img.filter(ImageFilter.SHARPEN) # 保存处理后的图片 img.save(output_path) print(f"已处理: {filename}") except Exception as e: print(f"处理图片 {filename} 时出错: {e}")
batch_process_images('./photos', './processed_photos')
生成图片水印
批量给图片添加水印。
from PIL import Image, ImageDraw, ImageFont
import os
def add_watermark_to_images(input_folder, output_folder, watermark_text):
# 确保输出文件夹存在
os.makedirs(output_folder, exist_ok=True)
# 加载字体 try: font = ImageFont.truetype("arial.ttf", 36) except: font = ImageFont.load_default() # 处理每张图片 for filename in os.listdir(input_folder): if filename.lower().endswith(('.png', '.jpg', '.jpeg')): input_path = os.path.join(input_folder, filename) output_path = os.path.join(output_folder, f"watermarked_{filename}") try: with Image.open(input_path) as img: # 创建绘图对象 draw = ImageDraw.Draw(img) # 计算水印位置(右下角) text_width, text_height = draw.textsize(watermark_text, font) x = img.width - text_width - 10 y = img.height - text_height - 10 # 添加水印 draw.text((x, y), watermark_text, font=font, fill=(255, 255, 255, 128)) # 保存带水印的图片 img.save(output_path) print(f"已添加水印: {filename}") except Exception as e: print(f"处理图片 {filename} 时出错: {e}")
add_watermark_to_images('./products', './watermarked_products', 'Sample Only')
六、高级自动化技巧
使用GUI自动化控制桌面应用
使用pyautogui自动化操作桌面应用。
import pyautogui
import time
def automate_office_app():
# 打开Word应用
pyautogui.hotkey('winleft', 'r')
pyautogui.typewrite('winword')
pyautogui.press('enter')
time.sleep(3) # 等待Word启动
# 创建新文档 pyautogui.hotkey('ctrl', 'n') time.sleep(1) # 输入标题 pyautogui.typewrite('自动化生成的文档\n\n', interval=0.1) # 设置标题格式 pyautogui.hotkey('ctrl', 'a') pyautogui.hotkey('ctrl', 'shift', '>') # 增大字体 pyautogui.hotkey('ctrl', 'b') # 加粗 pyautogui.press('home') # 回到行首 pyautogui.hotkey('ctrl', 'e') # 居中对齐 # 保存文档 pyautogui.hotkey('ctrl', 's') time.sleep(1) pyautogui.typewrite('auto_document.docx') pyautogui.press('enter') time.sleep(1) # 关闭Word pyautogui.hotkey('alt', 'f4') print("Word文档自动化操作完成")
使用前请注意:
1. 确保所有操作可见
2. 设置安全暂停
pyautogui.PAUSE = 1.0
pyautogui.FAILSAFE = True
automate_office_app() # 取消注释运行
浏览器自动化
使用selenium自动化网页操作。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
def web_automation():
# 启动浏览器
driver = webdriver.Chrome()
try: # 打开网页 driver.get("
https://www.example.com/login") time.sleep(2) # 输入用户名和密码 username = driver.find_element(By.ID, "username") password = driver.find_element(By.ID, "password") username.send_keys("your_username") password.send_keys("your_password") # 点击登录按钮 login_button = driver.find_element(By.XPATH, "//button[@type='submit']") login_button.click() time.sleep(3) # 导航到报表页面 driver.get("
https://www.example.com/reports") time.sleep(2) # 下载报表 download_button = driver.find_element(By.LINK_TEXT, "下载Excel报表") download_button.click() time.sleep(5) print("网页自动化操作完成") finally: # 关闭浏览器 driver.quit()
web_automation() # 取消注释运行
七、自动化任务调度
使用Windows任务计划
结合Python脚本和Windows任务计划实现定时任务。
import os
import sys
def scheduled_task():
# 检查是否通过任务计划程序启动
if len(sys.argv) > 1 and sys.argv[1] == '--scheduled':
print("任务计划程序启动的任务")
# 执行实际任务代码
main_task()
else:
# 创建任务计划
create_scheduled_task()
def main_task():
# 这里是实际要执行的任务
print("执行主任务...")
# 例如备份文件、发送邮件等
def create_scheduled_task():
script_path = os.path.abspath(file)
python_exe = sys.executable
# 创建任务计划的命令 task_name = "Python自动化任务" command = f'schtasks /create /tn "{task_name}" /tr "{python_exe} {script_path} --scheduled" /sc daily /st 09:00' print("创建任务计划命令:") print(command) # 实际使用时取消下一行注释 # os.system(command)
scheduled_task()
八、异常处理与日志记录
完善的异常处理和日志记录
为自动化脚本添加健壮的异常处理和日志功能。
import logging
from logging.handlers import RotatingFileHandler
import traceback
import sys
def setup_logging():
# 创建日志记录器
logger = logging.getLogger('auto_office')
logger.setLevel(logging.INFO)
# 创建文件处理器,限制每个日志文件10MB,保留3个备份 file_handler = RotatingFileHandler( 'automation.log', maxBytes=10*1024*1024, backupCount=3, encoding='utf-8' ) file_handler.setFormatter(logging.Formatter( '%(asctime)s - %(levelname)s - %(message)s' )) # 创建控制台处理器 console_handler = logging.StreamHandler()
console_handler.setFormatter(logging.Formatter( '%(levelname)s - %(message)s' )) # 添加处理器 logger.addHandler(file_handler) logger.addHandler(console_handler) return logger
def main_workflow():
logger = setup_logging()
try: logger.info("开始执行自动化任务") # 模拟任务步骤 logger.info("步骤1: 准备数据") prepare_data() logger.info("步骤2: 处理文档") process_documents() logger.info("步骤3: 发送报告") send_reports() logger.info("自动化任务完成") except Exception as e: logger.error(f"任务执行失败: {str(e)}") logger.error(traceback.format_exc()) sys.exit(1)
def prepare_data():
# 模拟可能出错的操作
if False: # 模拟错误条件
raise ValueError("数据准备错误")
def process_documents():
# 文档处理逻辑
pass
def send_reports():
# 发送报告逻辑
pass
if name == "main":
main_workflow()
九、脚本打包与分发
将Python脚本打包为EXE
使用PyInstaller将脚本打包为可执行文件。
"""
将Python脚本打包为EXE的步骤:
安装PyInstaller:
pip install pyinstaller
打包脚本:
pyinstaller --onefile --windowed your_script.py
可选参数:
--icon=app.ico # 设置图标
--name=MyApp # 设置应用名称
--add-data="file.txt;." # 添加数据文件
打包后的EXE位于dist文件夹
注意:
对于需要管理员权限的脚本,可以创建清单文件
复杂的脚本可能需要额外的依赖处理
"""
十、自动化最佳实践
模块化设计
将常用功能封装为独立函数或类
保持每个函数只做一件事
使用配置文件管理可变参数
错误处理
预料可能出现的错误并处理
提供有意义的错误信息
实现适当的重试机制
日志记录
记录关键操作和决策点
区分不同日志级别(DEBUG, INFO, WARNING, ERROR)
定期轮换日志文件
安全考虑
不要硬编码敏感信息
使用环境变量或加密配置文件
限制脚本权限
性能优化
批量处理代替逐个处理
使用高效的数据结构
避免不必要的I/O操作
维护性
添加清晰的注释
编写README文档
保持代码风格一致
通过以上这些高级自动化技巧,你可以将Python办公自动化提升到专业水平,处理更复杂的办公场景和任务。