Win32com读取打开的Excel文件时希伯来语文件名无法显示求助
解决Win32com读取希伯来语Excel文件名并在Tkinter展示的问题
核心问题在于Win32com处理希伯来语这类非ASCII/RTL(从右到左)字符的Excel文件名时,易出现名称获取失败或编码异常;同时Tkinter默认字体可能不支持希伯来语字符显示。以下是针对性的解决方案:
解决方案要点
- 直接遍历Excel的Workbooks集合而非通过索引访问,避免索引遍历引发的编码匹配问题
- 优先获取工作簿的
Name属性,若获取失败则从FullName(完整路径)中提取文件名 - 为Tkinter的Listbox设置支持希伯来语的字体(如Segoe UI、Arial Unicode MS)
修改后的完整代码
import tkinter as tk import win32com.client import os def get_open_workbooks(): xl = win32com.client.EnsureDispatch("Excel.Application") workbooks = xl.Workbooks open_workbooks = [] print(f"已打开的工作簿总数: {workbooks.Count}") # 直接遍历Workbooks集合,规避索引遍历的编码问题 for workbook in workbooks: wb_name = workbook.Name # 若Name属性为空(希伯来语文件名可能触发此情况),从完整路径提取文件名 if not wb_name: wb_name = os.path.basename(workbook.FullName) open_workbooks.append(wb_name) return open_workbooks def create_ui(): open_workbooks = get_open_workbooks() root = tk.Tk() root.title("已打开的Excel工作簿") root.geometry("400x300") # 设置支持希伯来语的字体,确保字符正常显示 listbox = tk.Listbox(root, font=("Segoe UI", 10)) listbox.pack(fill=tk.BOTH, expand=True) print(open_workbooks) for workbook in open_workbooks: listbox.insert(tk.END, workbook) root.mainloop() if __name__ == '__main__': create_ui()
关键调整说明
- 用
EnsureDispatch替代dynamic.Dispatch,能更稳定地处理COM对象的字符编码 - 遍历Workbooks集合而非按索引访问,避免因字符编码导致的索引匹配错误
- 添加
os.path.basename作为备选方案,确保即使Name属性无法获取,也能从完整路径中提取文件名 - 设置
Segoe UI字体,该字体原生支持包括希伯来语在内的多语言字符,保证Tkinter能正确显示
内容的提问来源于stack exchange,提问作者ProjectFluffy
相关产品推荐
相关产品推荐

