实例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 Documentdoc = 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] #已确定是第一个表格,其索引是0supplier = [] #存储供应商名称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列,索引为1Merge_cells(table,pn,1,2) #开始合并行为2,索引为1;物料编码是在3列,索引为2doc.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

知乎:Python操作Office软件高效工作

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

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

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

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

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

  3. java怎么删除一行表格_Java 创建、删除Word表格

    在Word文档中,我们可以通过添加表格的方式来帮助我们更加清晰.直观地分析和展示数据.本文将介绍如何使用Free Spire.Doc for Java组件来给Word文档创建表格,及删除文档中已有的表 ...

  4. 计算机表格求和求平均值公式,Word表格中自动求和,求平均值等 公式运算.doc

    文档介绍: EvaluationWarning:ThedocumentwascreatedwithSpire..蛮盅树我厄劲辑厘鼠舆幢藐贼杠妨状牟盒疆而邀吁拎溢裔述缄只帘汝汰筋迎铆姻恳旺询毁径彼涡帅枣 ...

  5. word表格转换成html,delphi将word表格转换成html_取得Word 表格中的数据

    delphi将word表格转换成html_取得Word 表格中的数据 1.delphi将word表格转换成html procedure TForm1.Button1Click(Sender: TObj ...

  6. 计算机word表格线设置在哪里,word表格文字显示不全_word表格怎么设置显示最后一行线?_word表格怎么加一行...

    word表格中经常会碰到最后一行表格的下面的线显示不出,而如果转换成PDF则可以看到线.在网上搜索也没有正确的调整方法,后来经过多次调整表格,终于找到了一个比较好的解决方法. 1.如图1所示情况:首先 ...

  7. 表格上方插入文字 html,word表格上方怎么输入不了文字

    Q2:Word表格有时不能输入文字怎么办 首先打开段落设置对话框,在缩进和间距选项卡中,看看是否选择了"首行缩进",当缩进太多的时候就不能输入文字了.将缩进值改为2,特殊格式选择无 ...

  8. 如何用python生成表格_用 Python 生成 HTML 表格

    在 邮件报表 之类的开发任务中,需要生成 HTML 表格. 使用 Python 生成 HTML 表格基本没啥难度, for 循环遍历一遍数据并输出标签即可. 如果需要实现合并单元格,或者按需调整表格样 ...

  9. NPOI word 合并单元格,合并一个区域

    NPOI word 中的单元格合并.网上有不少教程将单元格合并的,但是基本都是在创建的单元的时候就开始合并了. 现在我们来看下,如何在创建好的表格上再做合并动作. NPOI 的XWPFTable的ro ...

最新文章

  1. [C] 层层递进——C语言实现广度优先搜索
  2. 简单排查定位linux系统的性能瓶颈
  3. 天然气阶梯是按年还是按月_社保断缴了,还有补缴的机会?新规下,今年起按这5种方式处理...
  4. 六大技巧提升员工信息安全意识
  5. 前端进阶必备技能:Vue中如何定制动画效果
  6. Python_argparse
  7. Android基础学习第二篇—Activity
  8. odoo pivot中去掉求和_评比算分,去掉最高分和最低分算平均,PLC怎样编程实现?...
  9. configure: error: Package requirements (commoncpp 6.2.2) were not met
  10. 华三模拟器(路由器)实现ipsec穿越NAT实验
  11. linux vi 底行命令,Linux下vi命令详解
  12. matlab求解极限问题(limit函数的用法)
  13. 圆通电子面单接口对接
  14. 期末GIS人的《计量地理学》突击复习有救了
  15. 2022年全球与中国湿钽电容器行业发展趋势及投资战略分析报告
  16. 校园综合平台-微信小程序版(整整两个月暑假的成果啊 (•ิ_•ิ))
  17. 题目 2281: 次数差
  18. vr全景视频是如何拍摄的呢,商家为何要进行拍摄全景
  19. A002-181-2162
  20. PDF怎么转长图?这些方法不妨了解一下

热门文章

  1. python 基础(二)
  2. Listview 的应用 Day04 2014-0605
  3. 直接拿来用,10个PHP代码片段
  4. LAMDA表达式学习
  5. double to string 损失精度的问题
  6. Netty与传统Server对比
  7. hdu3507 print article
  8. Scrapy 轻松定制网络爬虫
  9. 【Hadoop】Hadoop1.X版本与Hadoop2.X的区别
  10. html下拉表覆盖透明,css透明元素如何遮挡住fixed元素