Python: 使用 Win32 COM 打开 Excel 工作簿 Api
Python: Open Excel Workbook using Win32 COM Api
我正在使用以下代码打开并显示 Excel 中的工作簿:
import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open('my_sheet.xlsm')
ws = wb.Worksheets('blaaaa')
excel.Visible = True
当文件 'my_sheet.xlsm' 已经打开时,Excel 询问我是否要 re-open 它而不保存。
如何提前检查工作簿是否已经打开,如果是,就把它放在前面?
编辑:现在发现:
if excel.Workbooks.Count > 0:
for i in range(1, excel.Workbooks.Count+1):
if excel.Workbooks.Item(i).Name is 'my_sheet.xlsm':
wb = excel.Workbooks.Item(i)
break
还有一个问题:我的工作表包含一些headers,我在其中启用了一些过滤。因此,设置过滤器后,当我从 Python 打开工作簿时,它有时会要求我输入一个唯一的名称来保存过滤器。这是为什么?这是对话:
EDIT 好的,这里说(德语)后一个问题是 2007 年和 2010 年文件中的一个已知错误:https://social.msdn.microsoft.com/Forums/de-DE/3dce9f06-2262-4e22-a8ff-5c0d83166e73/excel-api-interne-namen 如果您以编程方式打开 Excel-Files。不知道有没有解决方法。
当您找到解决方案时,请考虑使用 try/except/finally 块。目前,即使您关闭了可见的工作表,您的代码也会将 Excel.exe 进程 运行 留在后台(如果使用 Windows,请检查任务管理器)。顺便说一句,在 Python 或任何其他语言如 VBA 中,任何外部 API 如此 COM 接口应始终在应用程序代码期间干净地释放。
下面的解决方案使用定义的函数,openWorkbook()
走两条可能的路线:1) 首先尝试重新启动指定的工作簿,假设它已打开;2) 如果当前未打开,则启动一个新的工作簿对象那个位置。最后嵌套的 try/except
用于万一 Workbooks.Open()
方法失败,例如文件名不正确。
import win32com.client as win32
def openWorkbook(xlapp, xlfile):
try:
xlwb = xlapp.Workbooks(xlfile)
except Exception as e:
try:
xlwb = xlapp.Workbooks.Open(xlfile)
except Exception as e:
print(e)
xlwb = None
return(xlwb)
try:
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = openWorkbook(excel, 'my_sheet.xlsm')
ws = wb.Worksheets('blaaaa')
excel.Visible = True
except Exception as e:
print(e)
finally:
# RELEASES RESOURCES
ws = None
wb = None
excel = None
我正在使用以下代码打开并显示 Excel 中的工作簿:
import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open('my_sheet.xlsm')
ws = wb.Worksheets('blaaaa')
excel.Visible = True
当文件 'my_sheet.xlsm' 已经打开时,Excel 询问我是否要 re-open 它而不保存。
如何提前检查工作簿是否已经打开,如果是,就把它放在前面?
编辑:现在发现:
if excel.Workbooks.Count > 0:
for i in range(1, excel.Workbooks.Count+1):
if excel.Workbooks.Item(i).Name is 'my_sheet.xlsm':
wb = excel.Workbooks.Item(i)
break
还有一个问题:我的工作表包含一些headers,我在其中启用了一些过滤。因此,设置过滤器后,当我从 Python 打开工作簿时,它有时会要求我输入一个唯一的名称来保存过滤器。这是为什么?这是对话:
EDIT 好的,这里说(德语)后一个问题是 2007 年和 2010 年文件中的一个已知错误:https://social.msdn.microsoft.com/Forums/de-DE/3dce9f06-2262-4e22-a8ff-5c0d83166e73/excel-api-interne-namen 如果您以编程方式打开 Excel-Files。不知道有没有解决方法。
当您找到解决方案时,请考虑使用 try/except/finally 块。目前,即使您关闭了可见的工作表,您的代码也会将 Excel.exe 进程 运行 留在后台(如果使用 Windows,请检查任务管理器)。顺便说一句,在 Python 或任何其他语言如 VBA 中,任何外部 API 如此 COM 接口应始终在应用程序代码期间干净地释放。
下面的解决方案使用定义的函数,openWorkbook()
走两条可能的路线:1) 首先尝试重新启动指定的工作簿,假设它已打开;2) 如果当前未打开,则启动一个新的工作簿对象那个位置。最后嵌套的 try/except
用于万一 Workbooks.Open()
方法失败,例如文件名不正确。
import win32com.client as win32
def openWorkbook(xlapp, xlfile):
try:
xlwb = xlapp.Workbooks(xlfile)
except Exception as e:
try:
xlwb = xlapp.Workbooks.Open(xlfile)
except Exception as e:
print(e)
xlwb = None
return(xlwb)
try:
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = openWorkbook(excel, 'my_sheet.xlsm')
ws = wb.Worksheets('blaaaa')
excel.Visible = True
except Exception as e:
print(e)
finally:
# RELEASES RESOURCES
ws = None
wb = None
excel = None