如何在github动作工作流中通过COM接口保存Excel文件

yyhrrdl8  于 2023-10-22  发布在  Git
关注(0)|答案(2)|浏览(127)

我有一个自托管的windows runner,我试图运行一个工作流,该工作流执行一个创建Excel文件的Python脚本。工作流的.yaml代码:

name: test
run-name: test
on: [push]
jobs:
  create-excel:
    runs-on: self-hosted
    steps:
      - name: Check out repository
        uses: actions/checkout@v3
      - name: Create excel
        run: python create_excel.py

该脚本通过COM接口创建Excel文档(必须使用COM,我不能切换到pandas / xlrd或其他包):

import os
import win32com.client as win32

excel = win32.Dispatch("Excel.Application")
workbook = excel.Workbooks.Add()
workbook.SaveAs(os.getcwd() + '\\Created.xlsx')
workbook.Close()
excel.Quit()

如果我在本地运行python脚本,一切都很好。工作流崩溃,但:它可以创建Excel COM对象和新文件,但COM对象无法保存文件:

Traceback (most recent call last):
  File "C:\actions-runner\_work\TestRepo\create_excel.py", line 8, in <module>
    workbook.SaveAs(os.getcwd()+'\\Created.xlsx')
  File "<COMObject Add>", line 4, in SaveAs
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, 'Microsoft Excel', 'SaveAs method of Workbook class failed', 'xlmain11.chm', 0, -2146827284), None)
cigdeys3

cigdeys31#

尝试在windows-latest(指向Windows Server 2022)runner上重现您的问题,但运行正常。
显然,这和你的self-hosted跑步机有关。在浏览了其他类似的线程之后,我发现您可能需要验证您是否具有对该路径的写访问权限。
以下是我的工作流程:

name: win_excel_com_test

on: workflow_dispatch

jobs:
  ci:
    runs-on: windows-latest

    steps:
      - name: Install Office
        run: choco install office365business

      - name: Set up script
        env:
          SCRIPT: |
            import os
            import win32com.client as win32

            excel = win32.Dispatch("Excel.Application")
            workbook = excel.Workbooks.Add()
            workbook.SaveAs(os.getcwd() + '\\Created.xlsx')
            workbook.Close()
            excel.Quit()
        run: |
          pip install pywin32
          echo $env:SCRIPT > excel.py
          python --version

      - name: Run script
        run: |
          python excel.py
          ls

输出

vyswwuz2

vyswwuz22#

我设法找到了解决办法:您需要更改Excel的DCOM设置:

  • 按Win+R,键入dcomcnfg
  • 展开组件服务>我的电脑> DCOM配置
  • 找到Microsoft Excel >属性(右键单击)>在身份选项卡下将其设置为“后台服务的交互式用户”。

相关问题