目录

  • 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邮件合并相关推荐

  1. Python实现excel表格合并

    使用Python实现excel表格合并(程序打包:pyinstaller -F ***.py): 一个excel文件的多sheet合并 文件夹下多个Excel文件的合并(单个文件的多sheet也会自动 ...

  2. python实现word邮件合并

    众所周知word/WPS中的邮件合并功能可以根据word模板从excel表格中读取数据,进而生成不同的文件,但是邮件合并也有其缺陷,那就是每次合并数据都需操作插入合并域,如果经常需要根据数据生成固定模 ...

  3. [OfficeExcel] Word+Excel邮件合并 生成多个文档

    王佩丰老师OfficeExcel2010 13讲 邮件合并--引用Excel数据 学习笔记 批量生成多个邮件 利用Word发送邮件 每页显示多条记录 邮件合并后得数字格式处理 批量生成多个邮件 邮件& ...

  4. python将excel数据合并_Python语言之Python合并多个Excel数据

    本文主要向大家介绍了Python语言之Python合并多个Excel数据,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 安装模块 1.找到对应的模块 http://www.pyt ...

  5. 利用Python做excel文本合并(根据左侧单元格,快速合并右侧单元格内容)

    前言:昨天获得一个数据处理的小需求,比较简单,用VBA也能做,不过最近Python用的比较多,所以用Python写了,效率也很快. 需求: 有一张总表,如下图所示 需要根据左侧的工号和姓名,合并右侧获 ...

  6. python能否实现邮件合并_Python 基于Python实现邮件发送

    基于Python实现邮件发送 by:授客 QQ:1033553122 测试环境: Python版本:Python 2.7 注:需要修改mimetypes.py文件(该文件可通过文章底部的网盘分享连接获 ...

  7. python将excel数据合并_在Excel中使用Python将每日数据合并为月度数据

    我想弄清楚如何将每天的日期组合成特定的月份,并将特定月份内每一天的数据相加.在 注意:我有一个巨大的列表,上面有每天的日期,但是我在这里放了一个小样本来简单地举例说明.在 文件名:(测试.xlsx)在 ...

  8. python邮件合并的基本操作步骤_Python如何实现反向邮件合并功能

    摘要:邮件合并是Office的一项功能,可便捷地批量生成文档,却无法从大量Word文档中汇总信息.结合实际应用,阐述基于Python语言对Word文档进行批量导入.读取其中的表格与段落.汇总信息至Ex ...

  9. python对数据进行合并的函数_利用Python pandas对Excel进行合并的方法示例

    前言 在网上找了很多Python处理Excel的方法和代码,都不是很尽人意,所以自己综合网上各位大佬的方法,自己进行了优化,具体的代码如下. 博主也是新手一枚,代码肯定有很多需要优化的地方,欢迎各位大 ...

  10. 如何利用python整合excel_Python将多个excel文件合并为一个文件

    Python将多个excel文件合并为一个文件 这篇文章主要为大家详细介绍了Python将多个excel文件合并为一个文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 思路 利用python x ...

最新文章

  1. 《mysql性能调优与架构设计》笔记: 一mysql 架构组成
  2. 多个servlet配制方法
  3. 微信-js sdk invalid signature签名错误 问题解决
  4. HTTPSConnectionPool(host=‘files.pythonhosted.org‘, port=443): Read timed out的解决方法
  5. Linux的关机命令和重启命令
  6. eclipse java 运行快捷键_java – 可以使用Eclipse中的键盘快捷方式启动/停止Tomcat吗?...
  7. JavaScript消息框
  8. 双向循环链表:维吉尼亚密码
  9. 图片鉴黄大赛上线,请开始你的表演
  10. ecshop dizcuz会员整合
  11. 断路器之一:Hystrix 使用与分析
  12. 最佳软件开发实践指导
  13. 新浪微博用户兴趣建模系统架构
  14. NDB Cluster基本操作
  15. Odoo隐藏应用模块
  16. 小朋友学数学(22):三角函数
  17. 送给你的一份英语学习资料,请查收!
  18. win10键锁定计算机,win10系统创建一键锁定计算机的快捷方式的操作方法
  19. 故事,零落,,,,,
  20. 【CO003】操作系统笔记3 —— IPC 问题

热门文章

  1. 大学计算机基础知识学习计划,大学个人学习计划
  2. 英特尔400系列服务器芯片组,英特尔400系列芯片组似乎还不支持PCIe 4.0
  3. python实现whois查询_Python 工具whois查询
  4. 域名Whois信息查询接口
  5. camera raw 13.2中文版
  6. 而立之年,学习编程,
  7. 淘宝logo设计遇到的坑
  8. Oracle ERP系统借贷关系表
  9. window VNC Viewer设置屏幕分配率
  10. phpcms数据库备份与恢复_Phpcms一键清理数据后完整找回数据