目录问题:解决思路:问题:假设在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. Hadoop集群搭建(详细简单粗暴

    搭建所用Hadoop java版本 hadoop-3.1.3.tar.gz jdk-8u212-linux-x64.tar.gz 安装包链接:Hadoop及jdk安装包提取码:icn6 首先,我们先下 ...

  2. 对 Flutter 的一些看法

    Flutter 发布的时候可谓很轰动,相对于 RN 或 PhoneGap 们,它给出了另外一种跨平台方案,更像是 APP 版的 Unity,而且使用现代的声明式 UI,据说能媲美原生性能.很吸引人,所 ...

  3. VSCode 抽取vue的代码片段

    在vscode中文件-->首选项-->用户片段,输入名字按去确定,输入代码片段 { "vue htm": { "scope": "html ...

  4. QString的一些使用技巧

    简介 QString 字符串被每个GUI程序所使用,不仅是用户界面,还有数据结构. C++原生提供两种字符串: 传统的C风格以'\0'结尾的字符数组和std::string类.与这些不同,QStrin ...

  5. MQTT QoS 0, 1, 2 介绍

    什么是 QoS 很多时候,使用 MQTT 协议的设备都运行在网络受限的环境下,而只依靠底层的 TCP 传输协议,并不能完全保证消息的可靠到达.因此,MQTT 提供了 QoS 机制,其核心是设计了多种消 ...

  6. vue-cli3配置打包后的文件加上版本号

     修改vue.config.js

  7. Vue中使用model属性

    model属性接收两个参数 类型:{ prop?: string, event?: string } prop 也就是调用该组件的父组件中使用v-model指令绑定的属性 event 对应的是修改pr ...

  8. win10安装MAT并单独配置jdk11

    1.下载MAT 2.下载jdk11 3.配置jdk11 MAT解压后,在MemoryAnalyzer.ini配置文件开头添加配置指向jdk11,如下: -vm C:\Program Files\Jav ...

  9. 日志 LOG / Debug

    有很多时候我们想要查看日志文件,发现服务器已经被重启了,然后原来的日志就被打包存起来了,这个时候生成的gz日志文件我们就没有办法直接去查看了. 所以这个时候我们就需要zcat+日志名.gz来查看,还可 ...

  10. tomcat前后端项目部署及调优

    第1章 tomcat简介Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache,Sun和其他一些公司及个人共同 ...