目录问题:解决思路:问题:假设在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. stl仿函数集合

  2. scrcpy不使用adb远程控制android

    1.开启服务器 CLASSPATH=/data/local/tmp/scrcpy-server.jar app_process / com.genymobile.scrcpy.Server 1.23 ...

  3. debian11下载软件包及依赖(本地使用)

    记录下实践情况,原文: https://blog.csdn.net/zgp210317/article/details/120586189?spm=1001.2101.3001.6650.2& ...

  4. Cesium开发三维地图入门

    需求:要求将GLTF三维模型放到地图上展示,并且添加各种图标和线进行标注. 用CesiumJS地图库实现代码如下: 引入CesiumJS库 1.直接clone源码包,在index.html中引入,如下 ...

  5. html的table多级表头表格的代码

    1,两级表头的代码 <html> <head> <title>多层表头</title> <link rel="stylesheet&qu ...

  6. kubectl --v日志级别

    Kubectl 日志输出详细程度是通过 -v 或者 --v 来控制的,参数后跟了一个数字表示日志的级别.Kubernetes 通用的日志习惯和相关的日志级别在 这里 有相应的描述. 详细程度 描述-- ...

  7. docker nginx 配置

    1.下载镜像 docker pull nginx2宿主机器建立目录/docker/nginx/conf.d 这个目录下面新建 default.conf upstream tomcat77{ serve ...

  8. 查询最上活动的activity

    adb shell dumpsys window windows | grep mCurrent

  9. linux 安装ssl 失败原因

    配置文件成功的情况下打不开:开放端口 设置端口 server { listen 443 default ssl; //需要加不然会显示404 default ssl server_name 域名; s ...

  10. kubeadm安装单master单node节点k8s集群

    操作系统:centos7.6 podSubnet(pod 网段) 10.244.0.0/16 serviceSubnet(service 网段): 10.10.0.0/16 集群角色 IP 主机名 安 ...