如果你在 GUI 应用程序(如 Tkinter)中工作,并希望在后台线程中执行 COM 操作,你需要确保在后台线程中正确初始化 COM。这通常是通过在后台线程的开始处调用 pythoncom.CoInitialize()
并在结束时调用 pythoncom.CoUninitialize()
来完成的。
import pythoncom
import win32com.client
import threading
def export_pdf():
pythoncom.CoInitialize() # 手动初始化 COM 库
try:
# 注意:这里使用 Dispatch 而不是 EnsureDispatch,因为通常不需要类型信息缓存
xlApp = win32com.client.Dispatch("Excel.Application")
# 打开 Excel 文件,转换为 PDF 等...
# 注意:你需要添加打开工作簿和导出为 PDF 的具体代码
# 假设 workbook 是打开的 Excel 工作簿
# workbook_path = excel_path
# workbook = xlApp.Workbooks.Open(workbook_path)
# workbook.ExportAsFixedFormat(win32com.client.constants.xlTypePDF, pdf_path)
# ...其他操作...
# 清理资源(如果需要)
# workbook.Close(SaveChanges=False)
# xlApp.Quit()
except Exception as e:
print(f"An error occurred: {e}")
finally:
pythoncom.CoUninitialize() # 手动关闭 COM 库
# 创建一个非守护线程来调用export_pdf函数
def start_export_thread():
thread = threading.Thread(target=export_pdf, daemon=False)
thread.start()
# 在你的主程序或GUI的某个地方调用这个函数来启动线程
start_export_thread()