有人可以解释为什么使用openpyxl 2.6.2时会发生这种情况吗?

时间:2019-06-07 06:55:26

标签: python openpyxl

根据我的理解,workbook.get_sheet_names()已过时,我们应该将wb.sheetnamesopenpyxl 2.6.2一起使用。

wb.sheetnames返回所有工作表中的list,为什么我们不能这样做?

    import openpyxl
    wb=openpyxl.load_workbook('example.xlsx') #loading the workbook
    wb.sheetnames #getting the sheetnames with the new recomended code
    #output:['Sheet']
    wb.sheetnames[0]='Another name'
    wb.sheetnames[0] # Checking if it were changed or not
    #output:['Sheet']

如果wb.sheetnames充当list,为什么上面的代码不起作用? 没有显示任何错误,但我没有看到预期的更改

example.xls如下所示:

A                         B             C
1 4/5/2015 13:34  Apples          73
2 4/5/2015 3:41   Cherries        85
3 4/6/2015 12:46  Pears           14
4 4/8/2015 8:59   Oranges         52
5 4/10/2015 2:07  Apples          152
6 4/10/2015 18:10 Bananas         23
7 4/10/2015 2:40  Strawberries    98

2 个答案:

答案 0 :(得分:4)

这是因为sheetnames属性;换句话说,它看起来像实例属性,但是当您访问它时,实际上会调用一个函数。您可以查看this answer了解更多详细信息。

现在,如果我们查看openpyxl的来源,我们可以找到sheetnames的定义:

    @property
    def sheetnames(self):
        return [s.title for s in self._sheets]

sheetnames 每次创建并返回一个新的list ,您可以使用id进行证明:

from openpyxl import Workbook

book = Workbook()

a = book.sheetnames
b = book.sheetnames

print(id(a) == id(b))

输出:

False

由于此,实际上,您只是在修改每次调用list时创建的这个新sheetnames的第一个元素。

答案 1 :(得分:2)

链接到相关的section of the docs

wb.sheetnames将返回字符串列表(即只是工作表名称)wb.sheetnames[0]只是一个字符串。 当您执行wb.sheetnames[0]='Another name'时,将更改wb.sheetnames返回的列表中的第一个字符串,但是此更改没有任何实际/可见的效果,因为此列表未分配给任何变量。

还有wb.worksheets,它将返回工作表对象的列表。您可以使用此方法访问相应的工作表,并使用Worksheet.title属性执行 wb.worksheets[0].title='New Title'

from openpyxl import Workbook
wb = Workbook()
print(wb.sheetnames)
print(type(wb.sheetnames[0]))
print(wb.worksheets) 
print(type(wb.worksheets[0]))
wb.worksheets[0].title='New Title'
print(wb.sheetnames)
print(wb.worksheets)

输出

['Sheet']
<class 'str'>
[<Worksheet "Sheet">]
<class 'openpyxl.worksheet.worksheet.Worksheet'>
['New Title']
[<Worksheet "New Title">]

注意-例如,我使用的是内部只有一张纸的新Workbook实例