You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

关键调整说明

  1. 用EnsureDispatch替代dynamic.Dispatch,能更稳定地处理COM对象的字符编码
  2. 遍历Workbooks集合而非按索引访问,避免因字符编码导致的索引匹配错误
  3. 添加os.path.basename作为备选方案,确保即使Name属性无法获取,也能从完整路径中提取文件名
  4. 设置Segoe UI字体,该字体原生支持包括希伯来语在内的多语言字符,保证Tkinter能正确显示

内容的提问来源于stack exchange,提问作者ProjectFluffy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 12:14:52