学校的一次活动结束之后,部门下发了一个任务:由一个excel中的数据生成奖状

excel中的数据为以上形式,根据排名分为一二三等奖,要给每组分发奖状,奖状为以下格式

奖状中一共有三处不同的地方:

  1. 团队名称不同,要求“团队”前写上队伍中五个人的名字且带空格
  2. 奖状编号不同
  3. 获得的奖不同,对应着下面的称号也不同

如果人工操作,除了需要一个文件一个文件编辑,还有一个很麻烦的地方,那就是团队成员无法直接复制,表格中的数据带有年级+学号,而奖状中只需要姓名。

这种由数据批量编辑的做法很容易想到word的邮件功能,正好我之前用的不多,就拿来练练手。然后我马上遇到了第一个问题

word邮件功能无法打开数据源


其实这个解决办法很简单,大部分的原因都是因为文件格式不对。邮件合并功能不支持excel的高级版本,也就是.xlsx对应的07版往上,将excel另存为.xls就解决了
如果还有问题,那基本上就是格式的问题了,邮件要求第一行的字段名称对应下面的字段内容,格式错了之后再修改成功是很难的,我建议把对你有用的数据单独复制下来,粘贴到一个新建的xls文件中,这样能就解决问题

打开数据源之后插入合并域,这里的操作很简单,在你想要的位置插入对应的字段就好了

但在这之前还有之前提出的一个问题没有解决,奖状中要求只要人名,但数据是带有年级和学号的,直接插入就会出现这种情况

杂乱的数据中提取姓名

考虑通过替换的方式修改excel中的数据,可以观察到每个数据的格式是这样的:“年级-学号-姓名”,这里说来话长,如果数据都是这个格式,改起来并不难,但是这些数据是不严格筛查格式的个人填表,我们在表中一次次筛查后发现了以下几种情况:

  1. “-”格式错误,数据中有这几种“-”的替换写法:空格半角非中断空格( )中文“-”全角“-”
  2. 不写“级”或多写,比如“20级-”写为“2020级-”或“20-”
  3. 写成“年级-姓名-学号”,这个比较严重
  4. 不写“-”,即“年级学号姓名”,这个也很严重
  5. 在年级后面跟上专业,比如“21级计算机-”或“21计算机-”
  6. 上面几种问题的组合,比如写成“年级-姓名-学号”,而且不写“-”,“级”就会和姓名连起来

单纯用excel的替换肯定是解决不了这些问题的,用正则表达式比较理想。一番尝试与修改过后,我们制定出了一套针对于这些数据的提取方案,其中excel替换和正则表达式结合使用(正则表达式使用该工具)

顺序必须不能错:

  1. 将下面这些符号替换为“-”:空格 半角非中断空格( ) 中文短杠 全角短杠
  2. 正则替换 正则表达式:\d\d级
  3. 正则替换 正则表达式:[\x{4e00}-\x{9fa5}]{2,5} 子模式序列号:-$0-$1
  4. 正则匹配 正则表达式:(-[\x{4e00}-\x{9fa5}]{2,5}-)|(-[\x{4e00}-\x{9fa5}]{2,5})
  5. excel通配符替换“*–”(这里是双杠)为空格
  6. excel替换“-”为空格

分别的作用为:

  1. 讲语法错误纠正,统一改为“-”
  2. 先去掉“级”,避免级和姓名连起来无法区分的情况
  3. 给没有在分割处写“-”的加上“-”,方便之后处理
  4. 只留下姓名和两旁的“-”(还有一小部分处理不到,下面一步来处理)
  5. 处理上一步无法处理的,即“计算机-”这种,这种到这里已经被处理为“计算机–姓名”,用通配符删掉“–”之前的即可
  6. 删掉所有的“-”

到这里就可以纯净提取出所有的名字了,插入合并域并点击“查看合并数据”后就能得到如下效果,上下翻就能看到做的每一张

然后我们需要导出这每一张奖状,点击“合并到不同新文档”,将这些文件放到一个新建的文件夹中

之后又出现了一个严重的问题

word邮件合并后,每个单独的文件最后都会多出一页


我并没有找到一个简单的处理方法批量删除文档最后一页,WPS的批处理中没有找到这个功能,所以尝试用word中的宏来处理
由于宏也无法直接批量运行,所以需要一个vbs文件来操作宏批量运行,运行时office的Word配置比较完全,容易创建进程,所以在Word中录制宏,之后再讨论如何使用WPS
录制宏需要先开启“开发工具”这一栏,具体方法可以在网上找
Word中录制宏没法记录鼠标操作,所以删除第二页必须只用键盘操作,几番尝试后我找到了一个比较好的方法:

  1. PgDn(跳转到最后一行)
  2. End(光标到最后一列)
  3. Del(删除右方即删除第二页)

所以点三下键盘即可删除第二页,之后点一下保存,再结束录制
也可以直接代码写一个宏,要注意宏的名字要符合变量命名,数字不能开头,尽量用英文,我这个起了个名叫“g4”

Sub g4()Selection.MoveDown Unit:=wdScreen, Count:=1Selection.EndKey Unit:=wdLineSelection.Delete Unit:=wdCharacter, Count:=1ActiveDocument.Save
End Sub

然后就是

如何批处理运行宏了

在需要操作的文件夹里新建一个.vbs文件

编辑并输入以下内容,有两处需要修改的地方

Option Explicit
Const c_strRootFolder = "C:\Users\lyle\Desktop\a\b" `这里输入文件夹路径,外面要加""
On Error Resume Next
Dim oApp, oDoc
Dim fso, oFolder, oFile
Set fso = CreateObject("Scripting.FileSystemObject")
Set oFolder = fso.GetFolder(c_strRootFolder)
Set oApp = CreateObject("Word.Application")
oApp.Visible = TrueFor Each oFile In oFolder.FilesIf (UCase(Right(oFile.Path, 4)) = ".DOC") Or (UCase(Right(oFile.Path, 5)) = ".DOCX") ThenSet oDoc = oApp.Documents.Open(oFile.Path)oApp.Run "g4" `这里写宏的名称,外面要加""oDoc.Close TrueEnd If
NextoApp.Quit False
Set oFolder = Nothing
Set fso = Nothing
Set oApp = Nothing

编辑完成之后点击,就会看到一个文件一个文件的闪出,操作没问题的话就成功了

记录某次利用word邮件功能 由excel数据中批量生成奖状 遇到的问题及解决措施相关推荐

  1. 利用Pajek软件批量处理excel数据,批量生成网络关系图

    利用Pajek软件批量处理excel数据,批量生成网络关系图 Pajek软件大家想必都不陌生,但是我很陌生,因为我用它不是进行网络分析,而是用它来画关系图(类似网络图).但是Pajek软件手工操作时一 ...

  2. 利用WORD邮件功能按相同格式批量打印不同内容

    1.在WORD中设计好表格 2.在EXCEL中,整理所有要填入的内容,保存为<工作簿1.xlsx> 3.在WORD 中,点击要填入内容的位置,比如姓名后的空格 4.在WORD 菜单栏中点& ...

  3. 利用Word邮件合并插入图片

    利用Word邮件合并插入图片 Word的邮件合并功能非常不错,其基本思想就是定义一个Word模板,再选择一个数据表格,然后将数据表格中的每条数据填入模板中形成一个页面,并将根据所有数据生成的页面组合起 ...

  4. 利用word邮件合并批量导入照片

    利用word邮件合并批量导入照片 ------嘉为   张辛 "邮件合并"是Word的一项高级功能,是办公自动化人员应该掌握的基本技术之一.邮件合并可以帮我们批量处理文档,提高工作 ...

  5. VC利用WORD替换功能打印发票

    VC利用WORD替换功能打印发票 摘自网络 在用VC开发一项目时,需要打印发票.由于发票的种类比较多,而且有的是已经有文字,有的空白的,还有一部分文字是可变的,动态改变.如果用VC直接控制它的输出,是 ...

  6. java 读取 excel 注释_java利用注解实现简单的excel数据读取

    搜索热词 实现工具类 利用注解实现简单的excel数据读取,利用注解对类的属性和excel中的表头映射,使用Apache的poi就不用在业务代码中涉及row,rows这些属性了. 定义注解: @Ret ...

  7. python处理excel表格数据-利用Python处理和分析Excel表中数据实战.doc

    利用Python处理和分析Excel表中数据实战 [利用python进行数据分析--基础篇]利用Python处理和分析Excel表中数据实战 原创 2017年06月28日 15:09:32 标签: p ...

  8. 电脑表格日期怎么修改原有日期_如何在Excel表中自动生成记录数据的日期和时间...

    几天前有人问我: 在Excel表格中输入信息时,如何在日期单元格中自动生成日期和时间? 输入表格时,我们经常需要输入时间,而不是填写存储时间,为了减少输入工作量,您可以将日期设置为自动生成. 例如,当 ...

  9. matlab sheet名字,MATLAB得到excel多个非默认sheet名_怎样利用matlab去读取一个excel表中多个sheet的数据并导入一个sheet中?...

    如何用matlab读取一个excel表格中的若干个工作表 如果数字: xlsread('e:/shiyanshuju/shiyanbiaoge','sheet1','B1:D1440') 最好个表格放 ...

  10. 将excel内列表每行数据分别填充到另一个word模板里-批量生成同一模板下的不同文档,word邮件功能

    有时候需要将excel表格中的每个人的信息分别填到另一个模板中生成一个很多个含有每个人信息的模板,类似于证书,准考证生成. 点击邮件->选择收件人->使用现有列表,找到对应路径下的exce ...

最新文章

  1. POJ-3693 Maximum repetition substring 后缀数组
  2. QT5.14在Win10和Win7下的安装
  3. ThinkPhp报错:thinkphp\library\think\Template.php Line(1243) template not exists:...test\...\index.html
  4. 挖地雷_1996年分区联赛提高组之三_ssl1071_dfs
  5. 如何对接GN EDI系统?
  6. 微信小程序之在线客服(即时聊天)
  7. 【情商 为什么情商比智商更重要】阅读笔记
  8. [原创]C#中国象棋网络版源代码-C# Chinese Chess Source Code
  9. 该如何提高个人影响力
  10. 《Maven实战》 读书笔记
  11. python f 格式字符串输出
  12. 有关神经网络的训练算法,神经网络算法通俗解释
  13. 今日头条粉丝如何引流微信?免费教你今日头条引流微信加粉方法
  14. 【收集】键盘钢琴 和弦琴谱 (带HTML版开发流程)
  15. 【最优化问题】方法总结
  16. [转]列式数据库之infobright以及架构
  17. 【科普】72名图灵奖获得者的成就
  18. 第四章 安装centos与多重引导
  19. poj1266Cover an Arc.(三角形的外心)
  20. JavaScript专题(七)类型转换

热门文章

  1. 光学中的几个物理量的意义
  2. 产品生产的各个阶段:DV,EV,PV ········是什么意思
  3. 关于语法节点Tree、类型Type和符号Symbol
  4. SQL Server2012企业版与标准版比较
  5. 三原色亮度最高_行业最亮88000流明三色激光投影机,为何出自中科极光“之手”?...
  6. 路由控制配置route-policy命令解析
  7. 100层楼扔两个鸡蛋的问题
  8. STM8S的按键PWM调光灯历程
  9. 阿里20周年升级价值观:新六脉神剑与它的变革时代
  10. 内网通过代理服务器访问高德地图服务的方法