使用xlwt 'get_sheet'方法访问工作表
我想访问一个电子表格中的工作表。我用xlutils.copy()把主工作簿复制到了另一个工作簿里。但我不知道怎么用xlwt模块来访问工作表。
import xlrd
import xlwt
from xlutils.copy import copy
wb1 = xlrd.open_workbook('workbook1.xls', formatting_info=True)
wb2 = copy(master_wb)
worksheet_name = 'XYZ' (worksheet_name is a iterative parameter)
worksheet = wb2.get_sheet(worksheet_name)
有人能告诉我用xlwt模块访问工作簿中已有工作表的正确命令是什么吗?我知道我们可以用'add_sheet'方法在现有工作簿中添加一个工作表。
谢谢大家的帮助。
3 个回答
好的,下面是我的回答。我会一步一步来讲解。
根据之前的回答,xlrd是用来获取工作表的正确模块。
使用
open_workbook
可以得到一个xlrd.Book
对象。rb = open_workbook('sampleXLS.xls',formatting_info=True)
nsheets
是一个整数属性,它返回工作簿中表格的总数。numberOfSheets=rb.nsheets
因为你把这个复制到了一个新的工作簿
wb
中——基本上是为了写东西,wb
用来修改Excel文件。wb = copy(rb)
获取表格信息有两种方法:
a. 如果你只是想读取表格,可以使用
sheet=rb.sheet_by_index(sheetNumber)
b. 如果你想编辑表格,可以使用
ws = wb.get_sheet(sheetNumber)
(在这个上下文中,这是回答问题所需要的)
现在你知道Excel工作簿中有多少个表格,以及如何单独获取它们了,
示例代码:
参考链接:http://www.simplistix.co.uk/presentations/python-excel.pdf
from xlrd import open_workbook
from xlutils.copy import copy
from xlwt import Workbook
rb = open_workbook('sampleXLS.xls',formatting_info=True)
numberOfSheets=rb.nsheets
wb = copy(rb)
for each in range(sheetsCount):
sheet=rb.sheet_by_index(each)
ws = wb.get_sheet(each)
## both prints will give you the same thing
print sheet.name
print ws.name
sheets()
这个方法在xlwt.Workbook
这个类里是没有的,所以之前提到的用这个方法的答案是行不通的。其实只有xlrd.book
(用于读取XLS文件)里有sheets()
这个方法。因为这个类里的所有属性都是私有的,所以你需要像这样做:
def get_sheet_by_name(book, name):
"""Get a sheet by name from xlwt.Workbook, a strangely missing method.
Returns None if no sheet with the given name is present.
"""
# Note, we have to use exceptions for flow control because the
# xlwt API is broken and gives us no other choice.
try:
for idx in itertools.count():
sheet = book.get_sheet(idx)
if sheet.name == name:
return sheet
except IndexError:
return None
如果你不需要在找不到工作表时返回None,那就可以把try/except这部分去掉。如果你想多次按名称访问多个工作表,把它们放到一个字典里会更高效,像这样:
sheets = {}
try:
for idx in itertools.count():
sheet = book.get_sheet(idx)
sheets[sheet.name] = sheet
except IndexError:
pass
你可以用 sheets = wb1.sheets()
这个命令来获取一个工作表对象的列表,然后对每个对象调用 .name
来获取它们的名字。如果你想找到某个工作表的索引,可以使用下面的代码:
[s.name for s in sheets].index(sheetname)