如何使用 Openpyxl 读取特定工作表,而不是活动工作表?

问题描述 投票:0回答:2

我有一个现有的Excel文件,数据在第一张和第二张纸上,我应该用Python读取

Openpyxl 从第一个/活动工作表读取数据。

from openpyxl import Workbook, load_workbook

wb = load_workbook('Test.xlsx')
ws = wb.active

它工作得很好,直到我总是在第一张纸上。

我试过这个:

wb.active = 1  # or
wb.active = 2

没用。

我想阅读表格,而不是根据激活,而是根据它们的名称。 (或表位置) 我需要这样的东西:

wb = load_workbook('Test.xlsx')
ws1 = wb.Sheet1
ws2 = wb.Sheet2

那么,如何在不点击不同工作表的情况下读取数据呢?

或者,如何激活实际需要的sheet?

python excel openpyxl
2个回答
2
投票

我找到了!

ws2 = wb["Sheet2"]

然后我就调用 ws2 ,效果很好。 :) 例如:

ws2['A1'].value

0
投票

您可以循环访问 wb.worksheets 或 wb.sheetnames,按索引(从 1 开始)或按工作表名称查找工作表。这是示例脚本:

from openpyxl import Workbook, load_workbook

input_file = 'inputs/my_sample.xlsx'
wb: Workbook = load_workbook(filename=input_file)

def get_worksheet_by_index(wb: Workbook, sheet_idx: int, set_as_active: bool = False):
    # sheet_idx is 1-based
    ws = None
    for idx, worksheet in enumerate(wb.worksheets):
        if idx + 1 == sheet_idx:
            ws = worksheet
            if set_as_active:
                wb.active = ws
            break
    return ws


def get_worksheet_by_name(wb: Workbook, sheet_name: str, set_as_active: bool = False):
    ws = None
    for sheetname in wb.sheetnames:
        if sheetname == sheet_name:
            ws = wb[sheetname]
            if set_as_active:
                wb.active = ws
            break
    return ws


ws = get_worksheet_by_index(wb, 2)
print(ws.title)

ws = get_worksheet_by_name(wb, 'my_sheet_name')
print(ws.title)
© www.soinside.com 2019 - 2024. All rights reserved.