Python Win32Com& Excel.Application无法在计划程序上保存

时间:2017-02-24 17:25:00

标签: python excel com scheduled-tasks win32com

我遇到使用win32com和任务计划程序的问题。 尽管脚本执行成功的其他方面,但仍未执行Excel文件保存操作。这是在自动化机器上运行的;没有活动的登录会话。见下面的事实。

我是Win32COM的新手,所以我可能不明白它何时以及如何在Python中使用。

背景

我有一个Python脚本,它通过任务计划程序在一夜之间运行,它从内部数据库收集数据并将其输出到报告中。原始脚本使用csv输出数据,但我了解了使用Excel VBA命令创建xlsx文件的win32com

我使用代码扩展了我现有的chronjob以包裹使用pymysql的现有数据库操作:

import win32com.client as win32
try:
    excel = win32.gencache.EnsureDispatch('Excel.Application')
    excel.DisplayAlerts = False
    wb = excel.Workbooks.Add()
    basesht = wb.Sheets('Sheet1')
except:
    #E-mail notification of failure.
    sys.exit()

该脚本经历了许多数据库操作,需要几分钟时间。有些导出到带有csv的.csv,有些会创建一个新工作表并使用以下代码导出获取的数据:

#For Each Report in Report Set (DB = Object extending pymysql)
resultSet = db.qryfetchall()
headers = list(resultSet[0].keys())
r, c = 1, len(headers)
wksht.Range(wksht.Cells(r,1),wksht.Cells(r,c)).Value = headers
for row in resultSet:
    r += 1
    wksht.Range(wksht.Cells(r,1),wksht.Cells(r,c)).Value = [str(i) for i in list(row.values())]
    wksht.Columns.AutoFit()
else:
    wksht.Range("A1").Value = "No Results"

该计划以此结束:

if wb.Sheets.Count > 1:
    basesht.Delete()
    wb.SaveAs(consolidated) #consolidated = save path
excel.Application.Quit()

事实

  1. 使用管理员帐户正确设置任务计划程序中的任务。这是由正在创建的脚本中的其他文件确认的。
  2. 登录自动化机器时运行脚本将正确创建Excel文件并保存。
  3. 任务计划程序在完成时报告0x1错误。
  4. 我一头扎进Win32Com,所以我希望我错过了一些东西。为什么这个脚本不会保存文件?

1 个答案:

答案 0 :(得分:0)

它已经快四年了,但是没有答案,希望它在我最近面对这个问题并设法解决这个问题时仍然有意义。此问题有两个原因:

  1. DCOM权限问题
  2. 非交互式运行Office组件(就像通过Task Scheduler运行一样)

首先,必须解决DCOM权限问题:

  1. 转到“开始”>“运行”,然后键入dcomcnfg
  2. 在左窗格中,向下钻取到“组件服务”>“计算机”>“我的电脑”,然后选择“ DCOM Config”
  3. 然后找到Microsoft Excel应用程序,然后右键单击选择“属性”
  4. 转到“身份”标签,选择“此用户”,然后输入用户名/密码,然后单击“应用”,然后确定

其次,让Office组件非交互式运行:

创建这两个文件夹(对于64位系统,两个文件夹都是必需的):

32位:

C:\ Windows \ System32 \ config \ systemprofile \ Desktop

64位:

C:\ Windows \ SysWOW64 \ config \ systemprofile \ Desktop