实例28讲了如何在Excel文件中自动合并上下行相同内容的单元格,此例则讲一讲如何在Word文件中做类似的操作。因为处理Excel和Word的模块是不同的,所以合并单元格也有一些差异。相对来说,Word中的操作更麻烦一些。

在Excel中,我们手动合并单元格后,合并的单元格中只保留1个值,而Word则全部保留。比如在word中,3个单元格的内容都是“ABC”,合并之后就变成了“ABCABCABC”,这显然不是我们想要的。下图是原始文档,要求将第2列和第3列中,上下相邻单元格内容一样的合并。

还是先定义合并单元格函数,以便后续多次调用。由于处理Word中表格的代码与处理Excel不同,所以函数也要做微调。主要变化就是合并的函数表达,对于word中的表格,表达式是table.cell(row1,col1).merge(table.cell(row2,col2)),意思是将第row1行col1列到row2行col2列之间的表格合并(row2,col2要分别大于等于row1和col1)。需要注意的是cell(0,0)表示第一行第一列的单元格,以此类推。如下函数是在例28的基础上修改的。

#定义合并单元格的函数
def Merge_cells(table,target_list,start_row,col):'''table: 是需要操作的表格target_list: 是目标列表,即含有重复数据的列表start_row: 是开始行,即表格中开始比对数据的行(需要将标题除开)col: 是需要处理数据的列'''start = 0 #开始行计数end = 0 #结束行计数reference = target_list[0] #设定基准,以列表中的第一个字符串开始for i in range(len(target_list)): #遍历列表if target_list[i] != reference: #开始比对,如果内容不同执行如下reference = target_list[i] #基准变成列表中下一个字符串end = i - 1 table.cell(start+start_row,col).merge(table.cell(end+start_row,col))start = end + 1if i == len(target_list) - 1: #遍历到最后一行,按如下操作end = itable.cell(start+start_row,col).merge(table.cell(end+start_row,col))

然后需要读取word中相应表格里的数据,并提取出来,以便作为是否合并的判断基础。使用Document打开word文档,先查看一下其中表格的个数,以便我们锁定要处理的表格。由于word里面可能有隐藏表格,或者一个表格中有一段去掉了边框,让人看起来像是两个表格,直接在word中去数表格个数有时会不靠谱。

通过len(doc.tables)看到,这个文档里面有2个表格。打开word文档,我们可以看到要处理的表格是第一个,即doc.tables[0]。如果情况较为复杂,我们可以打印表格中第一行单元格的内容进一步确认是否是我们需要处理的表格。确认好表格的序号后,就可以开始读取内容了。

from docx import Document
doc = Document("收货记录.docx")
print("这个工作表有 {} 个表格。n".format(len(doc.tables))) #查看表格中的个数,以便锁定我们要处理的表格print("第一个表格的第一行的单元格中的内容如下:")
for i in doc.tables[0].rows[0].cells: #读取第一个表格的第一行的单元格中的内容print(i.text)
》
这个工作表有 2 个表格。第一个表格的第一行的单元格中的内容如下:
序号
供应商名称
货物编码
货物型号
货物说明
数量
日期#读取word文档中的第一个表格的第二和第三列除标题和尾部总数行的数据
doc = Document("收货记录.docx")
table = doc.tables[0] #已确定是第一个表格,其索引是0
supplier = [] #存储供应商名称
pn = [] #存储物料编码
max_row = len(table.rows) #获取第最大一行
print("表格共有{}行".format(max_row))#读取第二行到29行,第2,3列中的数据
for i in range(1,max_row-1):supplier_name = table.rows[i].cells[1].text #cells[1]指表格第二列supplier.append(supplier_name)for i in range(1,max_row-1):material_pn = table.rows[i].cells[2].text #cells[2]指表格第三列pn.append(material_pn)print("获取到{}个供应商名称,{}个物料编码。".format(len(supplier),len(pn)))>>
表格共有30行
获取到28个供应商名称,28个物料编码。

以上程序,获取了表格中第2列和第3列的数据,并存入了列表supplierpn。然后就可以开始判断,并合并单元格了。下面调用之前定义好的函数Merge_cells,传入相应的参数,运行即可完成单元格合并。

Merge_cells(table,supplier,1,1) #开始合并行为2,索引为1;供应商名称是在2列,索引为1
Merge_cells(table,pn,1,2) #开始合并行为2,索引为1;物料编码是在3列,索引为2
doc.save("检查.docx")

到这一步,合并单元格算是完成了,但结果如下图所示,原单元格中的内容全部集中在一起,造成了重复内容。我们需要重写这些单元格以覆盖掉重复的内容,即可得到我们想要的结果。

#重新往第2和第3列写入数据,以覆盖之前重复的数据
for row in range(1,len(supplier)+1):table.cell(row,1).text = supplier[row-2]table.cell(row,2).text = pn[row-2]
doc.save("收货记录-合并单元格.docx")

为什么写入合并单元格的时候,也是将合并之前的每个单元格都写了一次(比如写入“供应商HH”到第二行第1到6列的时候,写入了6次),为什么不会造成重复内容呢?是因为每写一次,就将原来的内容清空了。最终结果如下,目标达成!

如果您有需要处理的问题,可发邮件到我邮箱:donyo@qq.com,一起探讨解决方案。

以上在Jupyter notebook上完成,所用到的代码及Excel 资料已上传GitHub及百度网盘, 欢迎下载到本地随意玩。

Python版本:Python 3.6 64bit

操作系统:Windows 7

GitHub:Office_Automation_by_Using_Python

百度Pan:“pan.baidu”加上“.com/s/1WXcoYts_uNJmccfJ0lrmWg” 提取码: kry7

WeiXin:Python操作Office软件高效工作

element 表格单元格内容不换行_实例29_在Word表格中将上下行相同内容的单元格自动合并...相关推荐

  1. 修改docx表格_实例29_在Word表格中将上下行相同内容的单元格自动合并

    实例28讲了如何在Excel文件中自动合并上下行相同内容的单元格,此例则讲一讲如何在Word文件中做类似的操作.因为处理Excel和Word的模块是不同的,所以合并单元格也有一些差异.相对来说,Wor ...

  2. antd 能自适应吗_Antd表格滚动 宽度自适应 不换行的实例

    我就废话不多说了,大家还是直接看代码吧~ className={styles.table} rowKey={(record) => record.key} columns={columns} d ...

  3. python提取word所有表格_用Python提取 Word 表格内容

    一个公司有若干个部门,一个部门有若干个员工,每一个员工填写一份自己的信息(Word 版),然后录入系统,Word 表格模板如下: 填入内容如: 首先我们需要做的就是把数据提取出来,之后我们就可以对数据 ...

  4. java推送微信消息换行_微信公众号开发被动回复用户消息,回复内容Content使用了\n换行符还是没有换行...

    使用语言和框架:本人后端开发使用的Python的DRF(Django REST framework)框架 需求:在微信公众号开发时,需要实现自动回复,即被关注回复.收到消息回复.关键词回复 发现问题: ...

  5. python 汇总excel表_【Python】Word表格汇总Excel

    年底了,又到了汇总总结的时候.由于朋友要整理一千多个word表格到excel表上,帮她写了个程序,后来又将它改成更为通用的版本. 其实在这个过程中我找到了有人制作的VBA版,但是使用过程中有BUG [ ...

  6. 表格中复制后出现空格_软件应用在Excel表格中怎样批量删除空格?

    在日常办公中对于Excel的使用有没有全部掌握呢?怎样快速整理表格中的数据呢?这些都是职场必备技能,了解更多的Excel知识可以让你在数据管理,表格管理中游刃有余.下面为大家分享一些经常使用的Exce ...

  7. zxing换行_为什么我的word里的横线上写完一行字不能自动换行,?

    匿名用户 7级 2010-10-21 回答 目前,我暂时知道的有:1你在WORD中同时按Ctrl+A时,可以选择整篇文章.2.F1 显示当前程序或者windows的帮助内容.    F2    当你选 ...

  8. poi处理word内容的公式_[简单]POI读取word 2007内容控件

    见代码 : import java.util.Iterator; import java.util.List; import org.apache.poi.openxml4j.opc.OPCPacka ...

  9. python 下载网页文件_『如何用python把网页上的文本内容保存下来』python爬取网页内容教程...

    python爬虫:如何爬网页数据并将其放在文本 用requests库 r=r.requests.get(url) r.concent 保存到文件里就行了 如何用python把网页上的文本内容保存下来 ...

最新文章

  1. git 统计单个开发的代码量
  2. 卸载 插件_永远都不会卸载的CAD插件,好用到怀疑人生
  3. 干趴面试官系列 | 请你简述一下Kafka中的分区分配
  4. JSONP解决跨域及ajax同步问题
  5. 35个让人惊讶的 CSS3 动画效果演示
  6. @ResponseBody//该注解会将返回值转为json格式并放到响应体中返回到前台
  7. 线程池异步线程中再次获取线程池资源的问题
  8. 单个对象和多个对象在内存中的结构图
  9. Qt总结之五:读写文件操作
  10. Docker系列(九)Docker的远程访问
  11. 用windbg调试程序与windbg命令的使用
  12. itools苹果录屏大师_录屏大师限免|2019年1月最后一次苹果精选限时免费App 0131...
  13. logo语言是计算机语言吗,LOGO语言的编程
  14. 无法处理类型为text html,types – 解释为Font但使用MIME类型text / html传输的资源将无法修复...
  15. ltm4650_LTM4650IY-1APBF_代理全新进口【linear】现货商
  16. gmm聚类python_GMM-实现聚类的代码示例
  17. 容器内存溢出排障思路
  18. easyrecovery2023免费版电脑数据恢复软件下载功能介绍
  19. windows一段时间后发现C盘满了如何检查并清理
  20. 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

热门文章

  1. c语言switch()语句
  2. jQuery的显示与隐藏
  3. 【Java】6.4 final 修饰符
  4. JDK 16 即将发布,迎来重大改变,新特性速览!
  5. 推荐几个华为、字节跳动、蚂蚁金服的大佬公号
  6. 重磅!!面试季--最新面试题总结出厂,附题解,后期持续分享!
  7. 一看就懂的动态规划入门教程
  8. Android踩坑日记:Android动态权限分析和解决方案
  9. 【深入Java虚拟机JVM 07】JVM如何判断对象已死
  10. 深度解析Java可变参数类型以及与数组的区别