【问题标题】:Python Win32Com & Excel.Application Failing to Save on SchedulerPython Win32Com 和 Excel.Application 无法保存在调度程序上
【发布时间】:2017-07-15 15:27:55
【问题描述】:

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

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

背景

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

我用代码扩展了我现有的 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 错误。

我一头扎进了 Win32Com,所以我想我错过了一些东西。为什么这个脚本不保存文件?

【问题讨论】:

  • 当谈到 Dispatches 和 COM 时,我不熟悉阻塞与非阻塞,但它可能是相关的。我是否尝试在用户未登录的情况下分派和使用 COM,以深入研究更高级的计算机编程主题?如果我希望对 chronjobs 进行更高级的 Excel VBA 操作,我需要了解这一点。至少,是否有可能找出Task Scheduler抛出的错误或其他信息?
  • 我也遇到了 COM 问题。您是否尝试使用 openpyxl 而不是 COM。您似乎正在做的事情应该可以通过 openpyxl 轻松实现

标签: python excel com scheduled-tasks win32com


【解决方案1】:

好吧,它已经快 4 年了,但没有答案,希望它仍然相关,因为我最近遇到了这个问题并设法解决了它。这个问题有两个原因:

  1. DCOM 权限问题
  2. 以非交互方式运行 Office 组件(如通过任务计划程序运行)

首先要解决DCOM权限问题:

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

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

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

32位:

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

64位:

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

【讨论】:

    猜你喜欢
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    相关资源
    最近更新 更多