目录问题:解决思路:问题:假设在test.xlsx的“Sheet1”工作表中,A1:D3区域的值如下:要求给定指定的行、列以及对应的工作表作为参数,能够正确解析合并单元格,获取指定单元格的值。如果直接...

目录
  • 问题:
  • 解决思路:

问题:

假设在test.xlsx的“Sheet1”工作表中,A1:D3区域的值如下:

要求给定指定的行、列以及对应的工作表作为参数,能够正确解析合并单元格,获取指定单元格的值。

如果直接根据行列获取对应单元格的值,则合并单元格非左上角的其他单元格都会获取到None值,如下:

1 if __name__ == "__main__":
2 wb = xl.load_workbook("test.xlsx")
3 sheet_ = wb["Sheet1"]
4 print(sheet_["A1"].value) # 1
5 print(sheet_["A2"].value) # None
6 print(sheet_["D1"].value) # 8
7 print(sheet_["D2"].value) # None
8 print(sheet_["D3"].value) # None

解决思路:

获取到对应单元格后,判断该单元格是否为合并单元格,如果是,则找到该合并区域并获取左上角的值返回。

通过 sheet.merged_cell_ranges属性,可以获取当前工作表所有的合并区域列表:

测试代码:

1 if __name__ == "__main__":
2 wb = xl.load_workbook("test.xlsx")
3 sheet_ = wb["Sheet1"]
4 merged_ranges = sheet_.merged_cell_ranges # 获取当前工作表的所有合并区域列表
5 for merged_range in merged_ranges:
6 print(type(merged_range)) # 打印区域对象类型
7 print(merged_range) # 打印区域

结果如下:

我们巡着openpyxl.worksheet.merge.MergedCellRange查找其源码,发现定义了in操作,可以直接通过in确认某个坐标是否位于区域内

这时候我们已经基本具备获取合并单元格的条件了。

完整代码如下:

 1 import openpyxl as xl
2 from openpyxl.worksheet.worksheet import Worksheet
3 from openpyxl.cell import MergedCell
4
5
6 def parser_merged_cell(sheet: Worksheet, row, col):
7 """
8 检查是否为合并单元格并获取对应行列单元格的值。
9 如果是合并单元格,则取合并区域左上角单元格的值作为当前单元格的值,否则直接返回该单元格的值
10 :param sheet: 当前工作表对象
11 :param row: 需要获取的单元格所在行
12 :param col: 需要获取的单元格所在列
13 :return:
14 """
15 cell = sheet.cell(row=row, column=col)
16 if isinstance(cell, MergedCell): # 判断该单元格是否为合并单元格
17 for merged_range in sheet.merged_cell_ranges: # 循环查找该单元格所属的合并区域
18 if cell.coordinate in merged_range:
19 # 获取合并区域左上角的单元格作为该单元格的值返回
20 cell = sheet.cell(row=merged_range.min_row, column=merged_range.min_col)
21 break
22 return cell
23
24
25 if __name__ == "__main__":
26 wb = xl.load_workbook("test.xlsx")
27 sheet_ = wb["Sheet1"]
28
29 for row_index in range(1, 4):
30 for col_index in range(1, 5):
31 cell_ = parser_merged_cell(sheet_, row_index, col_index)
32 print("第%s行第%s列:%s" % (row_index, col_index, cell_.value))

结果如下:

第1行第1列:1
第1行第2列:2
第1行第3列:3
第1行第4列:8
第2行第1列:1
第2行第2列:4
第2行第3列:5
第2行第4列:8
第3行第1列:6
第3行第2列:7
第3行第3列:7
第3行第4列:8

 

python使用openpyxl读取合并单元格的值(转)的更多相关文章

  1. python-Excel读取-合并单元格读取

    python-Excel读取-合并单元格读取(后续会补充python-Excel写入的部分) 1. python读取Excel单元格 代码包含读取Excel中数据,以及出现横向合并单元格,以及竖向合并 ...

  2. poi读取合并单元格

    poi读取合并单元格 学习了:http://blog.csdn.net/ycb1689/article/details/9764191 进行了列合并单元格的修正:原来是我自己找错了地方: import ...

  3. C# 如何使用NPOI操作Excel以及读取合并单元格等

    C#操作Excel方法有很多,以前用的需要电脑安装office才能用,但因为版权问题公司不允许安装office.所以改用NPOI进行Excel操作,基本上一些简单的Excel操作都没有问题,读写合并单 ...

  4. 获取合并单元格中值的一个方法POI

    private static String getCellValueForMerginRegion(Cell cell) { int rowIdx=cell.getRowIndex(); Sheet ...

  5. Java Controller下兼容xls和xlsx且可识别合并单元格的excel导入功能

    1.工具类,读取单元格数据的时候,如果当前单元格是合并单元格,会自动读取合并单元格的值 package com.shjh.core.util; import java.io.IOException; ...

  6. python 利用三方的xlrd模块读取excel文件,处理合并单元格

      目的: python能使用xlrd模块实现对Excel数据的读取,且按照想要的输出形式.  总体思路: (1)要想实现对Excel数据的读取,需要用到第三方应用,直接应用. (2)实际操作时候和我 ...

  7. .net读取Excel转datatable、.net读取的Excel存在合并单元格并且转成datatable

    项目中经常会遇到Excel导入数据,Excel的模板会可能是存在合并单元格的,模板如下图所示 读取时需要填充合并单元格的值,转成datatable单元格值时,填充合并单元格的值,如下图所示: 合并单元 ...

  8. poi 合并单元格、设置边框

    HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(); //创建一个样式 HSSFCellStyle sty ...

  9. 【记录】解析具有合并单元格的Excel

    最近公司让做各种数据表格的导入导出,就涉及到电子表格的解析,做了这么多天总结一下心得. 工具:NOPI 语言:C# 目的:因为涉及到导入到数据库,具有合并单元格的多行必然要拆分,而NPOI自动解析的时 ...

  10. 【开发者笔记】解析具有合并单元格的Excel

    最近公司让做各种数据表格的导入导出,就涉及到电子表格的解析,做了这么多天总结一下心得. 工具:NOPI 语言:C# 目的:因为涉及到导入到数据库,具有合并单元格的多行必然要拆分,而NPOI自动解析的时 ...

随机推荐

  1. 3516A调试

    最近在调Hi3516A的板,硬件不知道为什么如此设计,用一片16bit4G的ddr,16Mspi flash,按理如果是A应该是2片16bit的ddr,组成32位总线,现在怕是只能当D来用了,编译成功 ...

  2. easyExcel-modle

    package com.alibaba.easyexcel.test.model;import com.alibaba.excel.annotation.ExcelProperty;import co ...

  3. Arch安装记录(BIOS+GPT)

    尝试了下arch安装,并且尝试了下不长用的BIOS + GPT组合.都说arch的wiki强,确实很强,可惜自己的水平看不了多少. https://wiki.archlinux.org/index.p ...

  4. 日常开发记录-this.$message,this.$prompt,交换弹窗确定和取消按钮的位置,确定在左,取消在右

    代码: <template> <el-button type="text" @click="open">点击打开 Message Box ...

  5. mybatis-plus逻辑删除deleted

    项目中数据库表设计原则用到了逻辑删除:数据本身没有被删除,只是将deleted字段设置为1 mybatis-plus在逻辑删除方面的设置如下: mybatis-plus: configuration: ...

  6. iras point sources

    Object/Coordinate Source Type Glon Glat Equatorial J2000 19:03:44.3977 +5:09:51.942 Coordinate   38. ...

  7. h5py学习(一)核心概念

    因pandas的to_hdf5函数有bug TypeError: object of type 'int' has no len(),写dataframe数据出现了报错,遂决定直接使用h5py来写数据 ...

  8. wsl无法创建文件与修改文件

    wsl无法创建文件与修改文件 sudo chown -R username /home/your_folder/ 请将用户名换成你的用户名 且目录换成你想要操作的目录

  9. Oracle JDK 和 OpenJDK 有什么区别?

    OpenJDK是Sun在2006年末把Java开源而形成的项目,这里的"开源"是通常意义上的源码开放形式,即源码是可被复用的,例如IcedTea.UltraViolet都是从Ope ...

  10. 2021年RT-Thread开发者大会

    Time:2021-12-18,地点:大中华6楼喜来登酒店 主办方: RT-Thread:寓意实时线程,瑞赛德 世界有成千上万个 RTOS(Real-time operating system,实时操 ...