如何从网络驱动器中读取(仅使用)Excel(使用Python)并保持原样

时间:2014-09-05 06:12:45

标签: excel python-2.7 win32com

我有一个小的python(2.7)脚本从网络驱动器上的excel文件中读取信息。工作正常,但在开发过程中有点烦人,在每个脚本运行后,excel文件被关闭。如果excel文件在启动脚本时已经关闭,那么这将是预期的行为,但我正在编辑excel来测试脚本。此外,如果有人已经打开工作簿,我会发现问题,因为我不会自动打开工作簿作为只读副本(这很好,因为我只读过)。

所以问题是如何在python中满足以下要求:

  • 如果Excel在启动脚本时关闭,则必须在阅读后关闭,否则不能
  • 如果在启动脚本时工作簿已关闭,则在读取后将关闭,否则不会
  • 如果工作簿由其他用户打开,则应以只读副本打开

到目前为止的努力:

除了谷歌搜索,我已经搜索了这方面的类似主题(例如"我如何检查Excel是否打开")。大多数时候答案是关于如何规避问题的核心,所以他们没有帮助我。

2 个答案:

答案 0 :(得分:1)

如果您只是从文件中读取,则可以考虑使用xlrd模块而不是win32com。这是跨平台的,不需要Excel工作。

答案 1 :(得分:1)

我回过头来解决这个确切的问题,首先向Excel询问已经打开的工作簿列表。如果我要打开的文件已经打开,那么我会设置一个标志" leaveOpenOnExit = True&#34 ;,否则将其保留为false,然后打开它。然后进行处理。然后在结束时,使用标志来决定是否关闭工作簿。

实际上,我还测试了我的脚本启动后是否已启动Excel,使用win32com' s GetActiveObject如果没有可用则引发异常,然后我相应地设置了一个标志。使用该标志,在退出时我只会关闭Excel,如果它已在脚本启动时打开。模式是:

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)