如何使用Openpyxl读取指定工作表(而非默认活动工作表)及多工作表数据?
如何用Openpyxl读取Excel的多个工作表
嘿,我来帮你搞定这个问题!你之前碰到的wb.active不生效的情况挺常见的,其实active属性主要是用来设置保存工作簿时哪个工作表处于激活状态,而非直接切换读取目标工作表。下面给你两种更可靠的方法,完全不用手动切换激活状态:
方法一:通过工作表名称读取(推荐)
这是最稳妥的方式,工作表名称一般固定,不会因为表的顺序变动而出错。你只需要用方括号包裹工作表名称就能直接获取:
from openpyxl import load_workbook wb = load_workbook('Test.xlsx') # 通过名称精准获取工作表 ws1 = wb['Sheet1'] # 替换成你实际的第一个工作表名称 ws2 = wb['Sheet2'] # 替换成你实际的第二个工作表名称 # 示例:读取A1单元格内容 print(ws1['A1'].value) print(ws2['A1'].value)
注意:如果工作表名称带空格或特殊字符,用属性访问(比如wb.Sheet1)可能会报错,所以优先用方括号的方式更稳妥。
方法二:通过工作表位置(索引)读取
要是你不知道工作表名称,或者想按顺序读取,可以用worksheets属性——它会返回所有工作表的列表,索引从0开始:
from openpyxl import load_workbook wb = load_workbook('Test.xlsx') # 第一个工作表(索引0) ws1 = wb.worksheets[0] # 第二个工作表(索引1) ws2 = wb.worksheets[1] # 示例:逐行读取表中数据 for row in ws1.iter_rows(values_only=True): print(row)
为什么之前的wb.active = 1没生效?
简单说,wb.active = 1只是告诉Openpyxl「保存工作簿时把索引为1的表设为活动表」,但它不会直接让ws = wb.active变成这个表——你得在设置后重新调用wb.active才能获取到目标表:
wb = load_workbook('Test.xlsx') wb.active = 1 # 设置索引1的表为活动表 ws2 = wb.active # 现在ws2才是第二个工作表
不过这种方式不如直接用名称或索引直观,所以不推荐作为读取多表的常规方法。
额外小技巧:遍历所有工作表
如果你的Excel里有多个工作表想批量处理,可以直接遍历wb.worksheets:
for sheet in wb.worksheets: print(f"正在处理工作表:{sheet.title}") # 在这里编写你的处理逻辑
内容的提问来源于stack exchange,提问作者Tami




