目录问题:解决思路:问题:假设在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. 浅析Winform的可视样式

    每一个C#的Winform项目的Main方法里,都有这么一行代码,那么它究竟是用来做什么的呢? Application.EnableVisualStyles(); 从注释来看,这是一行用作设置样式的代 ...

  2. 控制台程序console输入参数 获取参数

    class Program    {        static void Main(string[] args)        {                                 i ...

  3. cookie、session入门

    一.cookie是由http制定的 二.使用方法 1.原始方法 使用request接受Cookies请求头 使用response发送set-Cookies响应头 2.常用方法 response.add ...

  4. 【C和指针】6.指针

    1.指针变量的内容 int a=112, b=-1; float c=3.14; int *d=&a; int *e=&c; (1) 变量d和e被声明为指针,并用其他变量的地址予以初始 ...

  5. Kato's inequality and subharmonic function

    If $\Delta u=0$ in $\Omega\subset\mathbb{R}^n (n\geq2)$, then  for $p>\frac{n-2}{n-1}$, $|Du|^p$ ...

  6. response status is 500 https://localhost:7129/swagger/v1/swagger.json

    SwaggerGeneratorException: Conflicting method/path combination "GET Test" for actions - To ...

  7. 吴恩达老师机器学习课程chapter08——降维

    吴恩达老师机器学习课程chapter08--降维 本文是非计算机专业新手的自学笔记,高手勿喷. 本文仅作速查备忘之用,对应吴恩达(AndrewNg)老师的机器学期课程第十四章. 本章节只有结论,没有任 ...

  8. php 动态实例化某个类

    $name = 'test'; $controller = 'test'; $a = '\\addons\\'.$name.'\\model\\'.$controller; $this->mod ...

  9. git 与远程仓库关联返回 fatal: remote origin already exists 解决方法

    今天领导新建了一个代码仓库,我按照流程一步步推送代码,结果到了关联仓库的时候,返回 fatal: remote origin already exists(远程源已经存在) 下面是解决方法 1.删除远 ...

  10. Java课堂学习总结

    对于Java字段的初始化来说,共有以下几种方法: 1.类的构造函数(构造方法):当创建一个对象时,其构造函数就会自动调用.构造方法必须与类名相同,无返回值.如果程序员没有定义一个构造函数时,系统会自动 ...