自动化不知如何参数化(二)?xlrd来帮你解决
在昨天的博文中介绍了普通单元格数据的获取,以及单元格数据类型的转换,详细见博文:自动化不知如何参数化(一)?xlrd来帮你解决。
昨天的那篇博文中,还有个获取合并单元格数据的问题没解决,今天就专门来讲一讲这个合并单元格数据的获取。
合并单元格概念
xlrd中提供了一个获取合并单元格的命令,如下:
meger_cell = sheet_object.merged_cells
我们通过这行命令,运行下,看下是个什么内容,打印结果如下所示:
从结果可以看出,这是一组坐标,但代表的是什么含义呢?我们结合excel数据内容来看,如下图所示:
这样来看的话,是不是就要清晰很多了。注意一下:xlrd库中,所有的坐标,都是从0开始的,同数组下标一样,接下来的博文内容中,都会讲到坐标,所以在这里统一注意下。
可能有博友又有疑问了,合并单元格中的4个坐标代表的什么意思?不着急,马上就讲解。
比如坐标(1,4,0,1),我们把坐标看作为(行起始位,行结束位,列起始位,列结束位)。再来对应查看,坐标1代表的就是第二行;坐标4代表的就是第五行;坐标0代表是第一列;坐标1代表的是第二列。
结合上述描述,博友们是不是很清楚了。细心的博友应该已经发现了一个规律,那就是:起始位的坐标是包含关系,而结束位的坐标是不包含的关系。所以,坐标(1,4,0,1)实际取的数据就是,第二行到第四行和第一列合并的数据。这就刚好与【搜索测试】合并单元格相匹配了。我相信,现在博友们已经明白合并单元格的坐标概念了。是不是很简单,也就那么回事,是吧。
代码实践
获取合并单元格数据
我们将上述分析的逻辑,转换成代码,如下所示:
row_index = 2 col_index = 6 for(rlow, rhight, clow, chight) in meger_cell: if(row_index >= rlow and row_index < rhight): if(col_index >= clow and col_index < chight): cell_value = sheet_object.cell_value(rlow, clow) print(cell_value)
上述代码,就是将(行起始位,行结束位,列起始位,列结束位)进行了一个比较,并获取数据,执行代码,结果展示如下:
读取合并&单个单元格数据
如上所示代码,有个缺陷,只能读取合并单元格的数据,可用性还是不高,那如何能做到既能读取合并单元格数据,又能读取到单个单元格数据呢。我们来看代码,如下所示:
def get_meger_cell_value(row_index, col_index): cell_value = None for(rlow, rhight, clow, chight) in meger_cell: if(row_index >= rlow and row_index < rhight): if(col_index >= clow and col_index < chight): cell_value = sheet_object.cell_value(rlow, clow) break else: cell_value = sheet_object.cell_value(row_index, col_index) else: cell_value = sheet_object.cell_value(row_index, col_index) return cell_value print(get_meger_cell_value(0, 0))
如果博友们不懂获取数据逻辑,打个断点,调试代码即可,如下所示:
这样来看,是不是就很清楚了。上述代码,既能获取合并单元格的数据,又能获取单个单元格的数据。
以上就是解决获取合并单元格数据的方法了,希望对博友们有用。