如何从networking驱动器读取(仅限Python)Excel,并保持原样

我有一个python(2.7)脚本读取networking驱动器上的excel文件的信息。 工作正常,但在开发过程中有点烦人,在每个脚本运行后,excel文件被closures。 这将是预期的行为,如果Excel文件已经closures时,启动脚本,但我正在编辑的Exceltesting脚本。 此外,如果有人已经打开工作簿,我预计会出现问题,因为我不会自动打开工作簿作为只读副本(这样可以,因为我只能读取)。

所以问题是如何在Python中充分满足以下要求:

  • 如果Excel在启动脚本时被closures,则必须在阅读后closures,否则不能
  • 如果工作簿在启动脚本时被closures,则读取后closures,否则不closures
  • 如果工作簿被另一个用户打开,则应该以只读副本打开

迄今为止的努力:

除了使用Googlesearch,我已经在这方面search了类似的主题(比如“如何检查Excel是否打开”)。 大多数情况下,答案是关于如何绕开问题的核心,所以他们没有帮助我的。

我解决了这个确切的问题,回来之后,首先询问Excel已经打开的工作簿列表。 如果我想打开的文件已经打开,那么我会设置一个标志“leaveOpenOnExit = True”,否则将其保留为false,并将其打开。 然后做处理。 然后在最后使用该标志来决定是否closures工作簿。

其实我也testing过,如果Excel已经开始,当我的脚本开始时,通过使用win32com的GetActiveObject引发exception,如果没有可用的,然后我相应地设置一个标志。 有了这个标志,在退出时我只会closuresExcel,如果它已经在脚本启动时打开了。 模式是:

 from win32com.client import GetActiveObject from win32com.client import constants as comConst # will only contain COM constants if # makepy.py has been run on Excel or if EnsureDispatch has been used once try: excelRunsAtStart = True excel = GetActiveObject("Excel.Application") except com_error: excelRunsAtStart = False excel = Dispatch("Excel.Application") # use comApp... wb = excel.Workbooks.Open(excelPath, comConst.ReadOnly=1) 

如果你只是从文件中读取,你可能会考虑xlrd模块而不是win32com 。 这是跨平台的,不需要Excel工作。