python实现Excel邮件合并
目录
- python实现方法1
- python实现方法2
- python实现方法3
- VBA实现方法
众所周知word/WPS中的邮件合并功能可以根据word模板从excel表格中读取数据,进而生成不同的文件
但Excel却没有这个功能,如果需要根据excel表格模板生成不同文件的话,手动填写就显得很麻烦
举例:需对1、2图片模板表格的2个sheet中所有’{姓名}‘、’{案卷号}'修改为第3个图片表格的数据,按姓名保存为不同文件
使用程序读取数据excel表格,对固定模板excel表格指定内容进行替换,并生成文件,就是一个比较好的选择
实际使用中,模板excel表格中单个单元格内,可能有多个需要替换的内容,为便于使用,单独将字符串替换功能写为函数
def replace_all(string, **kwargs):"""将字符串string中所有与替换字典kwargs中key相同的字符串,替换为value:param str string: 待替换的原始字符串:param dict kwargs: 需替换的旧新字符串键值对,字典"""rep_string = stringfor key,value in kwargs.items():rep_string = rep_string.replace(key, value)return rep_string
python实现方法1
xlrd模块,常用于读取xls和xlsx格式excel表格
xlwt模块,常用于写入xls格式excel表格
xlutils模块,可将xlrd.Book对象转为xlwt.Workbook对象,从而实现对已有excel表格的写入功能
from xlrd import open_workbook # 从0开始计数
import xlwt # 从0开始计数
from xlutils.copy import copy
from time import timedef excel_replace_1():start_time = time()# 数据文件读取data_wb = open_workbook(r'E:\测试\数据文件.xlsx')data_ws = data_wb.sheet_by_index(0)name_list = data_ws.col_values(1)[1:]num_list = data_ws.col_values(2)[1:]# 模板文件,formatting_info=True参数不改变原样式template_wb = open_workbook(r'E:\测试\模板文件.xls',formatting_info=True)num_sheets = template_wb.nsheets # 模板文件sheet数量for i in range(len(name_list)):copy_wb = copy(template_wb) # 复制xlrd.workbook对象rep_dict = {'{姓名}': name_list[i], '{案卷号}': str(int(num_list[i]))}for k in range(0, num_sheets):copy_ws = copy_wb.get_sheet(k)template_ws = template_wb.sheet_by_index(k)for r in range(1, template_ws.nrows):for c in range(1, template_ws.ncols):cell_value = str(template_ws.cell_value(r, c)) # 读取为字符串,否则会报错if ('{房号}' in cell_value) or ('{案卷号}' in cell_value):cell_value = replace_all(cell_value, **rep_dict) # 替换内容copy_ws.write(r, c, cell_value)# 保存文件copy_wb.save(r'E:\测试\输出文件\政治保卫局《{}》资料.xls'.format(rep_dict['{姓名}']))#break # 仅循环一次,测试用end_time = time()print('所有文件已生成,累计用时:%.4f秒' % (end_time - start_time))
优点:速度快;缺点:单元格赋值会改变单元格格式
方法1只能生成xls格式excel表格,如果需要生成xlsx格式,参考方式2
python实现方法2
openpyxl模块,常用于读取、写入xlsx格式excel表格
from openpyxl import load_workbook # 从1开始计数def excel_replace_2():start_time = time()# 数据文件读取data_wb = load_workbook(r'E:\测试\数据文件.xlsx')data_ws = data_wb['Sheet1']name_list = data_ws['B'][1:]num_list = data_ws['C'][1:]# 遍历,写入模板文件for i in range(len(name_list)):write_wb = load_workbook(r'E:\测试\模板文件.xlsx')sheet_list = write_wb.sheetnames # 模板文件sheet名称列表rep_dict = {'{姓名}': name_list[i].value, '{案卷号}': str(num_list[i].value)}for sheet in sheet_list:write_ws = write_wb[sheet]for colum in write_ws.columns:for cell in colum:cell_value = str(cell.value)if ('{姓名}' in cell_value) or ('{案卷号}' in cell_value):cell_value = replace_all(cell_value, **rep_dict)cell.value = cell_value# 保存文件write_wb.save(r'E:\测试\输出文件\政治保卫局《{}》资料.xlsx'.format(rep_dict['{姓名}']))#break # 仅循环一次,测试用end_time = time()print('所有文件已生成,累计用时:%.4f秒' % (end_time - start_time))
优点:单元格赋值不改变格式,缺点:较方式1速度太慢
对2种方式的文件生成速度进行测试:生成1500个文件,方式1用时12秒,方式2用时98秒
python实现方法3
pywin32模块可以直接调用Excel程序,试验使用该模块实现以上功能
from win32com.client import Dispatch
excel = Dispatch('Excel.Application')
excel.Application.Visible = 0 # 后台运行,不显示界面
excel.Application.DisplayAlerts = 0 # 不显示警告信息def excel_replace_3():start_time = time()# 数据文件data_wb = excel.Workbooks.Open(r'E:\测试\数据文件.xlsx')data_ws = data_wb.Worksheets(1)max_row = data_ws.UsedRange.Rows.count # 最大行数for i in range(2, max_row+1):write_wb = excel.Workbooks.Open(r'E:\测试\模板文件.xlsx')sheet_count = write_wb.Sheets.countrep_dict = {'{姓名}': data_ws.Cells(i, 2).Value, '{案卷号}': str(int(data_ws.Cells(i, 3).Value))}for s in range(1, sheet_count+1):write_ws = write_wb.Worksheets(s)max_r = write_ws.UsedRange.Rows.countmax_c = write_ws.UsedRange.Columns.countfor r in range(1, max_r+1):for c in range(1, max_c+1):cell_value = str(write_ws.Cells(r, c).Value)if ('{姓名}' in cell_value) or ('{案卷号}' in cell_value):cell_value = replace_all(cell_value, **rep_dict)write_ws.Cells(r, c).Value = cell_valuesave_file = r'E:\测试\输出文件\政治保卫局《{}》资料.xlsx'.format(rep_dict['{姓名}'])write_wb.SaveCopyAs(save_file) # 保存文件write_wb.Close() # 关闭wb#break # 仅循环一次,测试用data_wb.Close()excel.Application.Quit()end_time = time()print('所有文件已生成,累计用时:%.4f秒' % (end_time - start_time))
测试结果:由于运行太慢,只测试生成150个文件,却用时494秒
既然试验了pywin32调用Excel程序实现邮件合并功能,为什么不直接在Excel中使用VBA呢?
VBA实现方法
Sub excel_replace()tm = Now()Application.ScreenUpdating = False '关闭屏幕更新Application.Visible = False '后台运行,不显示界面Application.DisplayAlerts = False '不显示警告信息Dim data_wb, write_wb As Workbook '数据源文件,模板文件Dim data_ws As Worksheet '文件中的worksheetDim arr '数组Set data_wb = Application.Workbooks.Open("E:\测试\数据文件.xlsx") '打开数据源文件Set data_ws = data_wb.Worksheets(1)arr = data_ws.UsedRange '所有数据行读取为数组For i = 2 To UBound(arr):Set write_wb = Application.Workbooks.Open("E:\测试\模板文件.xlsx") '打开模板文件For Each sht In WorksheetsWith sht.Cells.Replace What:="{姓名}", Replacement:=arr(i, 2) '替换内容.Cells.Replace What:="{案卷号}", Replacement:=arr(i, 3)End WithNextsave_file = "E:\测试\输出文件\政治保卫局《" & arr(i, 2) & "》资料.xlsx"write_wb.SaveCopyAs filename:=save_filewrite_wb.Close (False)'Exit For '强制退出for循环,单次测试使用Nextdata_wb.Close (False)Application.ScreenUpdating = True '打开Application.Visible = TrueApplication.DisplayAlerts = TrueDebug.Print ("所有文件已生成,累计用时:" & Format(Now() - tm, "hh:mm:ss")) '耗时End Sub
测试结果:生成1500个文件,用时338秒
python实现Excel邮件合并相关推荐
- Python实现excel表格合并
使用Python实现excel表格合并(程序打包:pyinstaller -F ***.py): 一个excel文件的多sheet合并 文件夹下多个Excel文件的合并(单个文件的多sheet也会自动 ...
- python实现word邮件合并
众所周知word/WPS中的邮件合并功能可以根据word模板从excel表格中读取数据,进而生成不同的文件,但是邮件合并也有其缺陷,那就是每次合并数据都需操作插入合并域,如果经常需要根据数据生成固定模 ...
- [OfficeExcel] Word+Excel邮件合并 生成多个文档
王佩丰老师OfficeExcel2010 13讲 邮件合并--引用Excel数据 学习笔记 批量生成多个邮件 利用Word发送邮件 每页显示多条记录 邮件合并后得数字格式处理 批量生成多个邮件 邮件& ...
- python将excel数据合并_Python语言之Python合并多个Excel数据
本文主要向大家介绍了Python语言之Python合并多个Excel数据,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 安装模块 1.找到对应的模块 http://www.pyt ...
- 利用Python做excel文本合并(根据左侧单元格,快速合并右侧单元格内容)
前言:昨天获得一个数据处理的小需求,比较简单,用VBA也能做,不过最近Python用的比较多,所以用Python写了,效率也很快. 需求: 有一张总表,如下图所示 需要根据左侧的工号和姓名,合并右侧获 ...
- python能否实现邮件合并_Python 基于Python实现邮件发送
基于Python实现邮件发送 by:授客 QQ:1033553122 测试环境: Python版本:Python 2.7 注:需要修改mimetypes.py文件(该文件可通过文章底部的网盘分享连接获 ...
- python将excel数据合并_在Excel中使用Python将每日数据合并为月度数据
我想弄清楚如何将每天的日期组合成特定的月份,并将特定月份内每一天的数据相加.在 注意:我有一个巨大的列表,上面有每天的日期,但是我在这里放了一个小样本来简单地举例说明.在 文件名:(测试.xlsx)在 ...
- python邮件合并的基本操作步骤_Python如何实现反向邮件合并功能
摘要:邮件合并是Office的一项功能,可便捷地批量生成文档,却无法从大量Word文档中汇总信息.结合实际应用,阐述基于Python语言对Word文档进行批量导入.读取其中的表格与段落.汇总信息至Ex ...
- python对数据进行合并的函数_利用Python pandas对Excel进行合并的方法示例
前言 在网上找了很多Python处理Excel的方法和代码,都不是很尽人意,所以自己综合网上各位大佬的方法,自己进行了优化,具体的代码如下. 博主也是新手一枚,代码肯定有很多需要优化的地方,欢迎各位大 ...
- 如何利用python整合excel_Python将多个excel文件合并为一个文件
Python将多个excel文件合并为一个文件 这篇文章主要为大家详细介绍了Python将多个excel文件合并为一个文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 思路 利用python x ...
最新文章
- 《mysql性能调优与架构设计》笔记: 一mysql 架构组成
- 多个servlet配制方法
- 微信-js sdk invalid signature签名错误 问题解决
- HTTPSConnectionPool(host=‘files.pythonhosted.org‘, port=443): Read timed out的解决方法
- Linux的关机命令和重启命令
- eclipse java 运行快捷键_java – 可以使用Eclipse中的键盘快捷方式启动/停止Tomcat吗?...
- JavaScript消息框
- 双向循环链表:维吉尼亚密码
- 图片鉴黄大赛上线,请开始你的表演
- ecshop dizcuz会员整合
- 断路器之一:Hystrix 使用与分析
- 最佳软件开发实践指导
- 新浪微博用户兴趣建模系统架构
- NDB Cluster基本操作
- Odoo隐藏应用模块
- 小朋友学数学(22):三角函数
- 送给你的一份英语学习资料,请查收!
- win10键锁定计算机,win10系统创建一键锁定计算机的快捷方式的操作方法
- 故事,零落,,,,,
- 【CO003】操作系统笔记3 —— IPC 问题