根据我的理解,workbook.get_sheet_names()
已过时,我们应该将wb.sheetnames
与openpyxl
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
答案 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实例