使用xlwt 'get_sheet'方法访问工作表

3 投票
3 回答
26236 浏览
提问于 2025-04-17 14:04

我想访问一个电子表格中的工作表。我用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 个回答

2

好的,下面是我的回答。我会一步一步来讲解。

根据之前的回答,xlrd是用来获取工作表的正确模块。

  1. 使用open_workbook可以得到一个xlrd.Book对象。

    rb = open_workbook('sampleXLS.xls',formatting_info=True)

  2. nsheets是一个整数属性,它返回工作簿中表格的总数。

    numberOfSheets=rb.nsheets

  3. 因为你把这个复制到了一个新的工作簿wb中——基本上是为了写东西,wb用来修改Excel文件。

    wb = copy(rb)

  4. 获取表格信息有两种方法:

    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
3

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
3

你可以用 sheets = wb1.sheets() 这个命令来获取一个工作表对象的列表,然后对每个对象调用 .name 来获取它们的名字。如果你想找到某个工作表的索引,可以使用下面的代码:

[s.name for s in sheets].index(sheetname)

撰写回答