鱼C论坛

 找回密码
 立即注册
查看: 3351|回复: 12

[已解决]openpyxl实现检索指定范围内的合并单元格

[复制链接]
发表于 2020-10-20 10:54:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
不知道用openpyxl库怎么得到指定范围内的所有合并单元格的cell_range

检索整个sheet的合并单元格,查到了是用语句:ws.merged_cells,返回值是类<class 'openpyxl.worksheet.cell_range.MultiCellRange'>,sheet切片后就不能再用这个属性了,有大佬有思路吗?
最佳答案
2020-10-20 16:12:49
这个是判断是否是合并单元格的
from openpyxl import load_workbook
from openpyxl.cell import MergedCell

wb=load_workbook('1.xlsx')
ws=wb.active
# # 合并单元格
# ws.merge_cells('A1:C3')
# # 给合并后的单元格赋值
# ws['A1'] = "I love FishC.com!"
ws1=ws['A1:D5']
a=[]
for temp_cell in ws1:
    for temp_cell2 in temp_cell:
        print(temp_cell2)
        if isinstance(temp_cell2, MergedCell):
            a.append(temp_cell2.coordinate)
a.sort()
print(a)
# print(ws1.merged_cells)
wb.save("1.xlsx")

<Cell 'Sheet1'.A1>
<MergedCell 'Sheet1'.B1>
<MergedCell 'Sheet1'.C1>
<Cell 'Sheet1'.D1>
<MergedCell 'Sheet1'.A2>
<MergedCell 'Sheet1'.B2>
<MergedCell 'Sheet1'.C2>
<Cell 'Sheet1'.D2>
<MergedCell 'Sheet1'.A3>
<MergedCell 'Sheet1'.B3>
<MergedCell 'Sheet1'.C3>
<Cell 'Sheet1'.D3>
<Cell 'Sheet1'.A4>
<Cell 'Sheet1'.B4>
<Cell 'Sheet1'.C4>
<Cell 'Sheet1'.D4>
<Cell 'Sheet1'.A5>
<Cell 'Sheet1'.B5>
<Cell 'Sheet1'.C5>
<Cell 'Sheet1'.D5>
['A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-20 12:04:12 | 显示全部楼层
sheet切片是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-20 13:49:41 | 显示全部楼层

cell_range = sheet['A1':'C3'] 这样的写法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-20 14:01:32 | 显示全部楼层

不知道下面的运行结果A1:C3是不是你要的?
from openpyxl import load_workbook

wb=load_workbook('1.xlsx')
ws=wb.active
# 合并单元格
ws.merge_cells('A1:C3')
# 给合并后的单元格赋值
ws['A1'] = "I love FishC.com!"
print(ws.merged_cells)
wb.save("1.xlsx")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-20 14:08:41 | 显示全部楼层
疾风怪盗 发表于 2020-10-20 14:01
不知道下面的运行结果A1:C3是不是你要的?

不是我想要的
1. 我只检索表格,不修改表格
2. 例如这个表格有2个合并A1:A2 和C3:C4,我只想检索A列,那么就只检索A列得到A列的合并单元格A1:A2
3. 并且我不想修改顺序,例如先找到所有合并单元格再筛选出A列的,这不是我想要的效果,因为合并单元很多,这样效率会慢,代码也会更复杂,并且逻辑不如之前清晰
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-20 14:15:49 | 显示全部楼层
FC的注册很坑 发表于 2020-10-20 14:08
不是我想要的
1. 我只检索表格,不修改表格
2. 例如这个表格有2个合并A1:A2 和C3:C4,我只想检索A列, ...

1、print(ws.merged_cells)这句就是检索,至于你说的修改,不知道你是什么意思,我上面写的就是表示这个地方合并了,然后检索出了,完全可以删掉,我觉得你就是没看懂代码的意思。。。。。。。。。。。。

2、至于这个检索,确实是检索全部,你要检索A列,不知道怎么弄。。。。。。。。。而且你这个只有A列的单元格合并?就A1:A2,不会A1:B3这样跨列的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-20 15:27:35 | 显示全部楼层
疾风怪盗 发表于 2020-10-20 14:15
1、print(ws.merged_cells)这句就是检索,至于你说的修改,不知道你是什么意思,我上面写的就是表示这个 ...

我看懂了。。。我觉得是你没看懂我的意思。。。我所说的筛选A列就是举个例子,表示我想搜索某个范围内的合并单元格而不是整张表的。。 。当然也可能A1:B3,那么如果我设置的搜索范围是A1:F100,它在里面,如果搜索范围是C1:D5,他就不在,暂时不考虑A1:A5这样的情况,这样就复杂了,我想这也是为什么merged_cells是针对sheet,而不支持切片后的sheet的原因。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-20 15:39:22 | 显示全部楼层
FC的注册很坑 发表于 2020-10-20 15:27
我看懂了。。。我觉得是你没看懂我的意思。。。我所说的筛选A列就是举个例子,表示我想搜索某个范围内的 ...

我说的你没看懂,是说你认为我要修改表格

而且,确实,是我没看懂你的表述的问题意思

所以我一开始就问你sheet切片是什么意思,没见过这样表述的,你直接说,在表内一定范围内查找是否存在合并单元格,不就好了么?搞什么切片。。。。。。。。。。。。

之后你回的也是说
例如这个表格有2个合并A1:A2 和C3:C4,我只想检索A列,那么就只检索A列得到A列的合并单元格A1:A2
也没说在一定范围内,只说了检索某一列

而且,不知道是否能这样一定范围内查找,没遇到过这样的案例
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-20 16:12:49 | 显示全部楼层    本楼为最佳答案   
这个是判断是否是合并单元格的
from openpyxl import load_workbook
from openpyxl.cell import MergedCell

wb=load_workbook('1.xlsx')
ws=wb.active
# # 合并单元格
# ws.merge_cells('A1:C3')
# # 给合并后的单元格赋值
# ws['A1'] = "I love FishC.com!"
ws1=ws['A1:D5']
a=[]
for temp_cell in ws1:
    for temp_cell2 in temp_cell:
        print(temp_cell2)
        if isinstance(temp_cell2, MergedCell):
            a.append(temp_cell2.coordinate)
a.sort()
print(a)
# print(ws1.merged_cells)
wb.save("1.xlsx")

<Cell 'Sheet1'.A1>
<MergedCell 'Sheet1'.B1>
<MergedCell 'Sheet1'.C1>
<Cell 'Sheet1'.D1>
<MergedCell 'Sheet1'.A2>
<MergedCell 'Sheet1'.B2>
<MergedCell 'Sheet1'.C2>
<Cell 'Sheet1'.D2>
<MergedCell 'Sheet1'.A3>
<MergedCell 'Sheet1'.B3>
<MergedCell 'Sheet1'.C3>
<Cell 'Sheet1'.D3>
<Cell 'Sheet1'.A4>
<Cell 'Sheet1'.B4>
<Cell 'Sheet1'.C4>
<Cell 'Sheet1'.D4>
<Cell 'Sheet1'.A5>
<Cell 'Sheet1'.B5>
<Cell 'Sheet1'.C5>
<Cell 'Sheet1'.D5>
['A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-20 16:36:36 | 显示全部楼层
疾风怪盗 发表于 2020-10-20 16:12
这个是判断是否是合并单元格的

不知道是不是我这边openpyxl版本的原因,from openpyxl.cell import MergedCell这句就报错了。。
所以没有测试只看代码,我觉得可能有的问题:如果有不只一个合并单元格,所有的合并单元格位置全混一块了,不好一眼看出各个合并单元格的范围,我想得到的是指定范围内的所有合并单元格的cell_range
照着这个脚本继续改,感觉老复杂了,不优雅
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-20 16:43:56 | 显示全部楼层
FC的注册很坑 发表于 2020-10-20 16:36
不知道是不是我这边openpyxl版本的原因,from openpyxl.cell import MergedCell这句就报错了。。{:10_285 ...

那就不知道了,你所谓的切片后是元组对象,没有merged_cells属性,只有sheet对象才有merged_cells属性

能想到的办法就是判断这个单元格的状态是一般单元格还是合并单元格

按这个方法,起码能判断出A1到C3是合并单元格(A1不是,是有数据的)

openpyxl 版本3.0.3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-20 17:08:32 | 显示全部楼层
疾风怪盗 发表于 2020-10-20 16:43
那就不知道了,你所谓的切片后是元组对象,没有merged_cells属性,只有sheet对象才有merged_cells属性

...

我用的2.5.6  鞠躬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-7 08:18:19 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 17:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表