如何在OpenPyXL中使用column =数字而不是字母来读取单元格的范围?

时间:2016-05-02 14:05:06

标签: python openpyxl

我知道我可以使用该代码读取单元格范围:

worksheet.cell(range="A1:J1").value

但我更喜欢使用数字而不是字母来选择列,如下所示:

worksheet.cell(row=1,column=1:10).value

这可能吗?

4 个答案:

答案 0 :(得分:7)

您确定worksheet.cell(range="A1:J1").value是否可行?

使用官方文档中提供的range函数可以实现上述目的:

http://openpyxl.readthedocs.io/en/default/api/openpyxl.worksheet.worksheet.html

  

有两种方法可以使用worksheet.cell:

     

用法:细胞(coodinate ='A15')或细胞(row = 15,column = 1)

     

如果没有给出坐标,则必须给出行和列。

所以,你可以使用列表理解:

data = [worksheet.cell(row=1,column=i).value for i in range(1,11)]

答案 1 :(得分:5)

ws.cell()只能返回单个单元格,因此它的范围毫无意义。要访问一系列单元格,您可以使用ws.iter_rows()ws.rowsws.columns。最高版本2.3 ws.iter_rows()仅接受Excel样式范围表示法,但您可以使用行和列偏移来创建范围。从版本2.4开始,您将能够为min_rowmin_colmax_rowmax_col提供完全数字(基于1的索引)值。

答案 2 :(得分:0)

似乎您希望将范围分成行并将每行的单元格值存储在元组或列表中。有两种方法干净且容易:

<强>假设:

ws:工作表,例如ws=wb['Sheet1']

rng:ws中的任何范围,例如: rng=ws['A1':'D10']rng=ws['A1':'D' + str(ws.max_column)]

方法1:

t=tuple(rng)

这将返回一个包含每行元组的元组。所以在这个例子中,t将有10个元组,每个内元组将有4个元素/值。

方法2:

final_list=[]
for row in rng:
    mylist=list(row)
    final_list.append(mylist)

这将是几乎相同的事情,除了你将有列表的元组。

注意:

元组的列表或元组列表将存储cells而不是它们的值,因此要访问它们的值,请执行以下操作:

first_cell_value=t[0][0].value

答案 3 :(得分:0)

取决于您要如何读取此数据!例如

type(sheet['A7':'B8'])

通过输入

会给您<class 'tuple'>
type(sheet['A7':'B8'][i])

如果i = 1,2,您将获得相同的类型。因此,它是一个元组的元组。它具有与范围内的行数一样多的元组。

我定义一个函数,将行列范围的起始-结束索引作为其参数,并返回类似的元组元组,但内部具有单元格的值。 您可以类似地使用不同类型的输出以及要提取的任何信息来定义自己的函数。

def RangeValue(a, b, c, d):
    return(tuple(tuple(sheet.cell(row=a+i, column=c+j).value for j in range(d-c+1)) for i in range(b-a+1)))

现在对于范围A7:B8,您只需要询问RangeValue(7,8,1,2)