pywin32
是 Python 操作 Windows 系统及 Office 套件的强大工具,通过 COM 接口实现对 Word、Excel、PowerPoint、Outlook 等软件的自动化控制。
环境安装与准备
1. 安装 pywin32
pip install pywin32
2. 确保已安装 Office 软件
-
Microsoft Office 2010 或更高版本
-
安装时勾选 "COM 加载项" 支持
Excel 自动化操作
1. 基础 Excel 操作
import win32com.client as win32
# 启动Excel应用
excel = win32.Dispatch('Excel.Application')
excel.Visible = True # 可视化操作
# 创建工作簿
wb = excel.Workbooks.Add()
ws = wb.Worksheets(1)
# 单元格操作
ws.Cells(1, 1).Value = "Hello Excel" # A1单元格
ws.Range("A2").Value = 123.45
ws.Range("A3:B3").Value = ["Python", "自动化"]
# 保存文件
wb.SaveAs(r'C:\test\demo.xlsx')
wb.Close()
excel.Quit()
2. 高级 Excel 功能
# 格式设置
ws.Range("A1:A3").Font.Bold = True
ws.Range("A1:A3").Font.Color = 0xFF0000 # 红色
ws.Columns(1).ColumnWidth = 20
# 公式应用
ws.Range("B4").Formula = "=SUM(A2:A3)"
# 图表创建
chart = ws.Shapes.AddChart2(240, win32.constants.xlColumnClustered).Chart
chart.SetSourceData(ws.Range("A1:B3"))
# 数据筛选
ws.Range("A1:B10").AutoFilter(Field:=1, Criteria1:=">100")
# 宏调用
excel.Application.Run("MacroName")
Word 自动化操作
1. 基础 Word 操作
word = win32.Dispatch('Word.Application')
word.Visible = True
# 新建文档
doc = word.Documents.Add()
# 内容操作
doc.Content.Text = "Python自动化Word文档\n"
paragraph = doc.Content.Paragraphs.Add()
paragraph.Range.Text = "第一段落内容"
paragraph.Range.Font.Bold = True
paragraph.Format.Alignment = 1 # 1=居中
# 表格操作
table = doc.Tables.Add(doc.Range(0,0), 3, 4) # 3行4列
table.Cell(1,1).Range.Text = "单元格1"
# 保存
doc.SaveAs(r'C:\test\demo.docx')
doc.Close()
word.Quit()
2. 高级 Word 功能
# 样式应用
styles = doc.Styles
new_style = styles.Add("MyStyle", 1) # 1=段落样式
new_style.Font.Name = "宋体"
new_style.Font.Size = 14
# 页眉页脚
section = doc.Sections(1)
header = section.Footers(win32.constants.wdHeaderFooterPrimary)
header.Range.Text = "公司机密"
# 邮件合并
doc.MailMerge.MainDocumentType = 0 # 0=普通文档
doc.MailMerge.OpenDataSource(Name:=r"C:\data\contacts.xlsx")
# 批量替换
word.Selection.Find.Execute("旧文本", False, False, False, False, False, True, 1, True, "新文本", 2)
PowerPoint 自动化
ppt = win32.Dispatch('PowerPoint.Application')
ppt.Visible = True
# 新建演示文稿
pres = ppt.Presentations.Add()
# 添加幻灯片
slide1 = pres.Slides.Add(1, 1) # 1=标题幻灯片版式
slide1.Shapes(1).TextFrame.TextRange.Text = "主标题"
slide1.Shapes(2).TextFrame.TextRange.Text = "副标题"
# 添加内容幻灯片
slide2 = pres.Slides.Add(2, 2) # 2=标题和内容版式
slide2.Shapes(1).TextFrame.TextRange.Text = "项目列表"
slide2.Shapes(2).TextFrame.TextRange.Text = "- 第一项\n- 第二项"
# 添加图表
slide3 = pres.Slides.Add(3, 5) # 5=标题和图表版式
chart = slide3.Shapes(2).Chart
chart.ChartData.Workbook.Worksheets(1).Range("A1:B3").Value = [["产品", "销量"], ["A", 120], ["B", 150]]
# 保存
pres.SaveAs(r'C:\test\demo.pptx')
pres.Close()
ppt.Quit()
Outlook 自动化
1. 邮件发送
outlook = win32.Dispatch('Outlook.Application')
mail = outlook.CreateItem(0) # 0=邮件项
mail.Subject = 'Python自动化邮件'
mail.Body = '这是一封通过Python自动发送的邮件'
mail.To = 'recipient@example.com'
# 添加附件
attachment = r'C:\test\report.xlsx'
mail.Attachments.Add(attachment)
# 发送
mail.Send()
# 或者显示邮件窗口人工发送
# mail.Display(True)
2. 邮件接收处理
outlook = win32.Dispatch('Outlook.Application') namespace = outlook.GetNamespace("MAPI") inbox = namespace.GetDefaultFolder(6) # 6=收件箱 messages = inbox.Items for message in messages: if message.UnRead: # 未读邮件 print(f"主题: {message.Subject}") print(f"发件人: {message.SenderName}") print(f"正文: {message.Body[:100]}...") # 标记为已读 message.UnRead = False message.Save()
实用技巧与问题解决
1. 错误处理
try: excel = win32.Dispatch('Excel.Application') # 其他操作... except Exception as e: print(f"Office自动化错误: {str(e)}") finally: # 确保释放资源 if 'excel' in locals(): excel.Quit()
2. 进程清理
import os def kill_process(process_name): os.system(f'taskkill /f /im {process_name}') # 强制结束Excel进程 kill_process('EXCEL.EXE')
3. 提高性能
# 禁用屏幕刷新和警告提示 excel.ScreenUpdating = False excel.DisplayAlerts = False # 执行批量操作... # 操作完成后恢复 excel.ScreenUpdating = True excel.DisplayAlerts = True
4. 常见问题解决
-
权限问题:
-
以管理员身份运行Python脚本
-
检查防病毒软件设置
-
-
版本兼容性:
# 指定特定版本 excel = win32.Dispatch('Excel.Application.16') # Office 2016
-
中文路径处理:
path = r'C:\测试\文档.xlsx'.encode('utf-8').decode('latin1') wb = excel.Workbooks.Open(path)
实际应用案例
1. 批量生成Word报告
def generate_reports(template_path, output_dir, data_list):
word = win32.Dispatch('Word.Application')
for data in data_list:
doc = word.Documents.Open(template_path)
# 替换模板标记
for field, value in data.items():
word.Selection.Find.Execute(field, False, False, False, False, False, True, 1, True, str(value), 2)
# 保存为单独文件
output_path = f"{output_dir}/report_{data['id']}.docx"
doc.SaveAs(output_path)
doc.Close()
word.Quit()
2. Excel数据汇总仪表板
def create_dashboard(data_files, output_file):
excel = win32.Dispatch('Excel.Application')
wb = excel.Workbooks.Add()
# 汇总数据
for i, file in enumerate(data_files, 1):
ws = wb.Worksheets.Add()
ws.Name = f"Source_{i}"
# 从CSV导入数据
ws.QueryTables.Add(
Connection=f"TEXT;{file}",
Destination=ws.Range("A1")
).Refresh()
# 创建汇总表
summary_ws = wb.Worksheets.Add()
summary_ws.Name = "Summary"
# 添加数据透视表
pivot_cache = wb.PivotCaches().Create(1, wb.Sheets("Source_1").UsedRange)
pivot_table = pivot_cache.CreatePivotTable(summary_ws.Range("A3"), "DataSummary")
# 配置透视表字段
pivot_table.PivotFields("Category").Orientation = 1 # 行标签
pivot_table.PivotFields("Value").Orientation = 4 # 数值
wb.SaveAs(output_file)
wb.Close()
excel.Quit()
pywin32
提供了最全面的 Office 自动化能力,适合需要精细控制 Office 应用场景。使用时需注意资源释放和错误处理,确保自动化流程的稳定性。