自动化不知如何参数化(二)?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))

如果博友们不懂获取数据逻辑,打个断点,调试代码即可,如下所示:

这样来看,是不是就很清楚了。上述代码,既能获取合并单元格的数据,又能获取单个单元格的数据。

以上就是解决获取合并单元格数据的方法了,希望对博友们有用。

posted @ 2020-07-26 20:18  温一壶清酒  阅读(359)  评论(0编辑  收藏  举报