目录问题:解决思路:问题:假设在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. Raize

    Raize.v5和Raize.v6 本人在windows10下装有delphi7和delphi2010,安装好Raize.v6后,两个版本delphi的控件页都找不到Raize控件,即使想编译相应的D ...

  2. Cannot add middleware after an application has started

    This helped: Open the Command Prompt or the Windows PowerShell. Navigate to your Stable Diffusion fo ...

  3. Linux下clang、gcc、intel编译器最新版本安装笔记

    转自 http://t.zoukankan.com/opangle-p-2838554.html

  4. centos7.4系统: redis配置密码

    背景:因为安全需要,对redis进行密码配置 说明:默认redis没有密码,需要自己配置密码 一.配置临时密码(重启后失效) 以下以密码:wangzy 为例 1.1 连接客户端 [root@wangz ...

  5. Python-celery介绍与快速上手

    1.celery介绍:   celery是一个基于Python开发的模块,可以帮助我们在开发过程中,对任务进行分发和处理.               详细介绍取自:Python之celery的简介与 ...

  6. PCA降维练习

    [题目] 1.现有我国大陆30个省.直辖市.自治区的经济发展状况数据集如表所示,包括8项经济指标:国民生产总值(A1):居民消费水平(A2):固定资产投资(A3):职工平均工资(A4):货物周转量(A ...

  7. 如何在Debian10镜像中设置Nginx引擎模块

    目前,我们较多的服务器WEB环境都是用的Nginx引擎,我们采用服务器的目的是可以获取到更多的资源,而且建站数量是不受限制的.我们可以根据自己需要配置Nginx,可以自定义特定域的设置,允许您在单个服 ...

  8. Linux profile、bashrc、bash_profile

    一.profile 文件 1.profile 文件的作用 profile(/etc/profile),用于设置系统级的环境变量和启动程序,在这个文件下配置会对所有用户生效.当用户登录(login)时, ...

  9. intellij idea 用 Gradle新建 spring boot

    intellij idea用的是ideaIU-2017.1.4  .spring boot用的是2.10 出现错误 ERROR StatusLogger Log4j2 could not find a ...

  10. Java中的左移、右移详细分析

    转自csdn--https://blog.csdn.net/weixin_42408447/article/details/125914449 前提:<<(左移),>>(右移) ...