如何在xlwings中通过工作表CodeName获取对应工作表对象
xlwings通过工作表CodeName访问对象的实现方法
问题背景
使用xlwings处理Excel时,原生仅支持通过工作表名称、索引两种方式获取工作表对象,但两类属性均存在被修改的风险:
- 工作表显示名称可直接在Excel端右键重命名
- 工作表索引会随插入、删除工作表的操作发生偏移
两类访问方式都无法实现稳定的工作表定位。
对应VBA使用场景中,可在VBA编辑器内为工作表设置固定的CodeName,例如将报表工作表CodeName设为shReport后,无论用户将工作表显示名改为"Report"还是"NiceReport",都可以直接通过shReport.Cells(1,1)稳定读取单元格内容,不受表名、索引变动影响。
此前尝试通过api属性读取CodeName时,运行如下代码无任何输出:
for sht in wk.Sheets: print(sht.api.CodeName)
具体实现方案
代码无输出首先排查变量名一致性问题:示例中获取工作表时混用了wb和wk两个工作簿对象变量,会导致逻辑异常。其次不同平台、不同xlwings版本读取CodeName的写法存在差异:
通用简单方案(xlwings 0.25.0及以上版本)
高版本xlwings已经为工作表对象原生新增了跨平台通用的codename属性,无需调用底层api即可直接读取,通过CodeName定位目标表的示例代码:
import xlwings as xw wb = xw.Book("目标文件路径.xlsx") # 遍历打印所有工作表的显示名和对应CodeName for sht in wb.sheets: print(f"工作表显示名:{sht.name},固定CodeName:{sht.codename}") # 定位CodeName为shReport的目标工作表 target_sht = next(sht for sht in wb.sheets if sht.codename == "shReport") # 读取目标表A1单元格内容 print(target_sht.cells(1, 1).value)
Windows平台低版本兼容写法
Windows端xlwings通过pywin32调用COM接口,可直接通过api属性读取CodeName:
# 读取单个工作表的CodeName code_name = sht.api.CodeName
macOS平台低版本兼容写法
macOS端xlwings通过appscript对接Excel,读取CodeName需要调用属性接口:
# 读取单个工作表的CodeName code_name = sht.api.properties().get()['Microsoft Excel Codename']
注意:CodeName是存储在工作簿文件内的固定属性,仅能在VBA编辑器中修改,普通用户在Excel界面的常规操作不会改动该值,适合用来做固定工作表的稳定定位。
内容的提问来源于stack exchange,提问作者wkSpeaker
相关产品推荐
相关产品推荐

