python pptx 关于在ppt里插入表格,调整合并单元格的问题

  • 需求
  • 找到合并了的单元格
  • 思路
    • 判断是否是合并单元格
    • 合并位置的记录
    • 合并
  • 代码

需求

首先我这是为了从word里面将内容导到ppt里,但表格真的好头疼,又不能直接复制,表格里面又会有各种各样的奇形怪状的合并单元格,怎么做出一毛一样的表格嘞

找到合并了的单元格

首先看说明文档,原本word以及ppt里都有一个is_merge_origin参数,它能获得当前单元格是否是合并单元格的头,但其他的单元格怎么确定它是不是合并了呢?!

有的文章说word里合并了的单元格内容地址是一样的,但我实验了一下并不一样,所以只能直接从内容方面去判断——判断该单元格的内容有没有出现过

思路

本来想边循环着每一个单元格,循环过程中就把单元格也合并了。
但是!
由于合并了的单元格不能再合并,这样的循环方式只能单纯合并行的或者列的
于是就只能选择记录下来需要合并的位置在最后合并

判断是否是合并单元格

首先原本的表格是否是合并单元格
rl和cl分别用来储存列和行已经出现过的文本
循环每个单元格,如果单元格内容与列表中的重复就代表是需要合并的单元格
但不排除个别单元格只是内容相同但没合并,根据实际情况,我设置了个条件:重复文本长度大于一定数量才定为需要合并的

合并位置的记录

遇到第一个重复的文本就记录开始的位置,ism改状态,直到遇到不同的文本再记录结束的位置,ism改回去,在重复的这个期间就不写入重复的文本了

rl:储存出现的文本
cstart:记录列合并单元格的开始
cend:记录列合并单元格的结束
cism:记录列是否遇到重复内容
cisw:表示是否要向单元格内写入(列)
start:记录列合并单元格的开始
end:记录行合并单元格的结束

合并

循环结束后,得到了行和列的开始和结束
就判断每个行合并的开始的这一个位置列的记录里面是不是存在,如果存在,就去找这个新的位置的结尾。
总体就是为了把一维的单元格对照成二维的,一次把这一大片需要合并的单元格找全再合并

代码

把完整代码贴在下面了,欢迎优化

rl=[]
cstart=[]
cend=[]
cism=[]
cisw=[]
start = []
end = []
# ism = []
# isw = []
for i in range(0,len(block.columns)):  # 列信息变量初始化
rl.append([])
cstart.append([])
cend.append([])
cism.append(False)
cisw.append(True)
for i in range(0,5):  # 行信息变量初始化
start.append([])
end.append([])
# ism.append(False)
# isw.append(False)
for r in range(len(block.rows)):  # 循环行
# start = -1
# end = -1
ism=False  # 是否有需要合并的
isw=True  # 是否写入
if r%5==0 and r!=0 :flag=-1print("c",cstart,cend)print(start,end)for mr in range(len(start)):print(mr,flag)if len(start[mr]):for cs in start[mr]:print(flag,"cs",cs)if mr in cstart[end[mr][start[mr].index(cs)]]:print("merge1",mr,cs,"to",cend[end[mr][start[mr].index(cs)]][cstart[end[mr][start[mr].index(cs)]].index(mr)],end[mr][start[mr].index(cs)])table.table.cell(mr, cs).merge(table.table.cell(cend[end[mr][start[mr].index(cs)]][cstart[end[mr][start[mr].index(cs)]].index(mr)], end[mr][start[mr].index(cs)]))flag=cend[end[mr][start[mr].index(cs)]][cstart[end[mr][start[mr].index(cs)]].index(mr)]#结尾的rowelif mr<=flag:continueelse:print("merge2",mr,cs,end[mr][start[mr].index(cs)])print(table.table.cell(mr,cs))table.table.cell(mr,cs).merge(table.table.cell(mr,end[mr][start[mr].index(cs)]))else:for c in range(len(cstart)):if len(cstart[c]):if mr in cstart[c]:print("merge3",mr,c,cend[c][cstart[c].index(mr)])table.table.cell(mr,c).merge(table.table.cell(cend[c][cstart[c].index(mr)],c))if mr==flag:flag=-1'''一页写完后删除第一个段 是空的'''if slide.shapes[0].text_frame.paragraphs[0].text == '':p = slide.shapes[0].text_frame.paragraphs[0]._elementp.getparent().remove(p)p._p = p._element = None'''新建一页'''layout = slide_masters[1].slide_layouts[2]  # 第二个模板的第三个样式,两个形状slide = ppt.slides.add_slide(layout)slide.shapes[1].text = title  # 标题para_count = 0t=''count+=1#print("页码:",count)slide.shapes[0].text = "续表"top=Cm(3.02)ccount+=1if ccount<math.floor(len(block.rows)/5):table = slide.shapes.add_table(5, len(block.columns), Cm(slide.shapes[0].left.cm), top, Cm(17.67), Cm(4.57))else:table = slide.shapes.add_table(len(block.rows)-5*ccount, len(block.columns), Cm(slide.shapes[0].left.cm), top,Cm(17.67),Cm(4.57))new=True'''更新合并变量'''rl = []cstart = []cend = []cism = []cisw = []start = []end = []# ism = []# isw = []for i in range(len(block.columns)):  # 列信息变量初始化rl.append([])cstart.append([])cend.append([])cism.append(False)cisw.append(True)for i in range(0,5):  # 行信息变量初始化start.append([])end.append([])# ism.append(False)# isw.append(False)if new:  # 拆分表格后会变行数tr = r - (5*ccount)
else: tr=r
'''
字符数少于6相同的不合并
大于六一并视为合并单元格
'''
cl=[]  # 存放这一行的单元格内容
for c in range(len(block.columns)):  # 循环列'''合并单元格 这个似乎没有效果'''#print(len(block.cell(r,c).text))print(r,c)print(block.cell(r,c).text)if block.cell(r,c).text not in cl:cl.append(block.cell(r,c).text)if ism:  # 再次遇到不同的,合并单元格print("*************合并**************")#print(start,c-1)# table.table.cell(tr, start).merge(table.table.cell(tr, c-1))end[tr].append(c-1)ism=Falseisw=Trueelif len(block.cell(r,c).text)<6:isw=Trueelse:  # 有重复的if not ism:  # 第一次遇到重复start[tr].append(c - 1)  # 记下开头位置ism=Trueisw=Falseif c==len(block.columns)-1:print("------------weiba")#print(start,c)#table.table.cell(tr, start).merge(table.table.cell(tr, c))ism = Falseisw = Falseend[tr].append(c)if block.cell(r,c).text not in rl[c]:rl[c].append(block.cell(r, c).text)if cism[c]:  # 再次遇到不同的,合并单元格print("*************合并**************")print(cstart[c], tr - 1)cend[c].append(tr - 1)#table.table.cell(cstart[c],c).merge(table.table.cell(tr - 1, c))#cstart[c] = trcism[c] = Falsecisw[c] = Trueelif len(block.cell(r, c).text) < 6:cisw[c] = Trueelse:  # 有重复的#print(not cism[c])print("重复了")if not cism[c]:#print("-----------------")cstart[c].append(tr - 1)  # 记下开头位置cism[c] = Truecisw[c] = Falseif r == (len(block.rows) - 1):print("------------weiba")print(cstart[c], tr)# table.table.cell(cstart[c], c).merge(table.table.cell(tr, c))cend[c].append(tr)cism[c] = Falsecisw[c] = False#print(isw)'''写入内容 分run'''#print(table.table.cell(r,c).text)# print(new)#print(r,c)print(cl,rl)print(isw,cisw[c])if isw and cisw[c]:for i in block.cell(r,c).paragraphs:print("para",tr,c)para = table.table.cell(tr,c).text_frame.add_paragraph()para.font.name = "微软雅黑"para.font.size = Pt(12)for j in i.runs:run = para.add_run()run.text=j.text#print(j.text)run.font.color.rgb = p_rgb(255, 255, 255)#run.font.size=Pt(12)#run.font.name="微软雅黑"if j.font.color.rgb==RGBColor(165,0,33) or (j.font.name!="楷体" and j.font.bold==True):run.font.color.rgb = p_rgb(255, 192, 0)run.font.bold = Truetable.table.cell(tr, c).fill.background()  # 设置透明_set_cell_border(table.table.cell(tr, c))  # 改颜色 或者宽

但是最后改表格的边框颜色和线宽的没起作用,欢迎大佬来帮忙

python pptx 关于在ppt里插入表格,调整合并单元格的问题相关推荐

  1. python合并word表格单元格_python docx模块读取word表格遇到合并单元格时的处理

    python docx模块读取word表格遇到合并单元格时的处理 python docx模块读取word表格遇到合并单元格时的处理 python docx模块读取word表 遇到合并单元格时的处理 通 ...

  2. 如何通过VB合并Excel单元格以及设置Excel行高?VB创建Excel表格,合并单元格,生成图形等操作

    如何通过VB合并Excel单元格以及设置Excel行高? 例如:我想把第一列的第4,5,6,7行合并...我在怎样让合并单元格里的字居中,怎样改变字体. 请不吝赐教... ============== ...

  3. layui table 表头合并_layui 动态表格之合并单元格

    需求: 下面用excel表格大概模拟下需求,左边是原来的,要改成右边这样的: ①第一步:再生成表格后调用此方法,以合并重复的单元格 done : function(res, curr, count) ...

  4. SpringBoot+Poi-tl根据Word模板动态生成word(含动态行表格、合并单元格)

    本编文章继SpringBoot+Poi-tl根据Word模板动态生成word(含动态行表格)文章之后 介绍Poi-tl导出word的延伸功能: 所需依赖以及word模板所属位置 见 SpringBoo ...

  5. easyExcel导出表格及合并单元格

    easyExcel导出表格及合并单元格 前言 废话不多说,直接上效果图. 效果图 合并之前导出的: 合并之后导出的: 代码的实现主要是合并之后的,为了更好的分清数据之间的关系. 二.代码 目录 < ...

  6. html表格怎么纵向合并单元格,在html中表格如何合并单元格

    在html中表格如何合并单元格 发布时间:2020-04-28 10:55:12 来源:亿速云 阅读:777 作者:小新 这篇文章主要为大家详细介绍了在html中表格如何合并单元格,文中示例代码介绍的 ...

  7. html合并的列内容不居中显示,表格不能合并居中 excel表格不能合并单元格怎么办...

    Excel 单元格不能合并了,合并单元格选项是灰色的无法合并单元格,主要是因为几个单元格之间套用了格式,所以无法合并单元格. 具体的解决方法如下: 选中相应的单元格,然后,点击工具栏上"设计 ...

  8. Tableau表格取消合并单元格

    客户回访(Client Review) 文章目录 前言 一.原表格样式 二.回访收集到的述求 三.表格合并单元格方法 (一)创建"序号"计算字段 (二)将"序号" ...

  9. Word插入的表格怎么合并单元格

    我们有时在Word里面插入的表格,需要合并里面的一些单元格,那么表格里面的格子怎么合并的呢?一起来看看吧 首先,选中需要合并的单元格: 然后,鼠标右键,在右键菜单中选择"合并单元格" ...

最新文章

  1. 浅析Hyperledger Fabric共识算法
  2. 在此处打开命令改为CMD或Powershell
  3. VirtualBox 使用 NAT 方式网络的 SSH 连接
  4. pyspark intersection代码示例
  5. C语言怎么确定用什么整形,【求助各位大虾!】 怎样用 if 语句验证一个整形数字。...
  6. android ffmpeg 优点_在Android中使用FFmpeg(android studio环境)
  7. 第 4 章 Spring
  8. 为什么 scrum 开发人员是一个 T-形的人 ?
  9. 02-CSS基础与进阶-day11_2018-09-17-21-35-14
  10. 安装增强功能失败:Could not mount the media/drive C:\Program Files\Oracle\VirtualBox/VBoxGuestAdditions.iso
  11. yolov3训练实现火焰检测(pytorch)
  12. 最小二乘法原理-线性回归
  13. 牛客小白月赛5-E-面积(area)(波尔约-格维也定理+皮克公式)
  14. Device owner调研
  15. python应用——把word问卷对应转换成excel
  16. 50部必看的经典好莱坞电影
  17. 项目异常Too many open files
  18. 网页怎么与服务器进行连接,如何实现网页与服务器的连接
  19. 北京19家A类定点医院名单
  20. Ubuntu安装re2c和ninja

热门文章

  1. 详解美股中的几种交易单-限价单、市价单、止损单、止损限价单、跟踪止损单
  2. iOS 真机调试包(最新 16.1 真机调试包)
  3. sdlc esd oracle,SDLC-PCIE高速同步串口卡
  4. 大华摄像头视频接入(一)
  5. Redis常用数据结构及其场景归纳
  6. 【卡尔曼滤波介绍与原理解析】
  7. anyRTC,一站式低延迟直播连麦解决方案
  8. Lesson28_网络编程
  9. 常用字符串库函数总结
  10. 利用百度地图API获取地理编码