Python 2.7 - win32com.client - 将工作表从一个工作簿移动到另一个工作簿

时间:2014-11-14 17:40:08

标签: python python-2.7 excel-vba win32com vba

我尝试使用python 2.7将一个excel工作表从工作簿A移动到工作簿B,但我一直收到错误。

Python脚本:

import win32com.client

excel=win32com.client.Dispatch('Excel.Application')
excel.Visible=False
wbP=excel.Workbooks.Open('C:\Full Path\WorkbookA.xlsx')
wbG=excel.Workbooks.Open('C:\Full Path\WorkbookB.xlsx')
wbG.Worksheets("Sheet1").Select
wbG.Worksheets("Sheet1").Move(before=wbP.Worksheets("Annual"))
wbP.SaveAs('C:\Full Path\WorkbookA.xlsx')
excel.Application.Quit()

错误我收到:

Traceback (most recent call last):
  File "C:\Full Path\test.py", line 10, in <module>
    wbG.Worksheets("Sheet1").Select
  File "C:\Python27\lib\site-packages\win32com\gen_py\00020813-0000-0000-C000-000000000046x0x1x8\Sheets.py", line 120, in __call__
    ret = self._oleobj_.InvokeTypes(0, LCID, 2, (9, 0), ((12, 1),),Index
com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147352565), None)

谢谢!

解决方案:

见bernie的评论。我需要移动的工作表名为Charts而不是Sheet1。

1 个答案:

答案 0 :(得分:6)

我正在回答这些评论,因为它更容易阅读...

由于该行发生错误,似乎问题是WorkbookB.xlsx中没有“Sheet1”

以下是您可能希望在代码中更改的一些内容:

  1. 您可以使用win32com.client.DispatchEx创建新的Excel实例,以避免干扰任何打开的Excel实例。如果您使用DispatchEx,则可以将.Visible设置为False。在此处进一步了解DispatchExhttp://timgolden.me.uk/python/win32_how_do_i/start-a-new-com-instance.html

  2. \是一个转义字符。使用原始字符串或正斜杠,例如:wbG=excel.Workbooks.Open(r'C:\Full Path\WorkbookB.xlsx')wbG=excel.Workbooks.Open('C:/Full Path/WorkbookB.xlsx')

  3. 将这些建议纳入代码:

    from win32com.client import DispatchEx
    
    excel = DispatchEx('Excel.Application')
    wbP=excel.Workbooks.Open(r'C:\Full Path\WorkbookA.xlsx')
    wbG=excel.Workbooks.Open(r'C:\Full Path\WorkbookB.xlsx')
    # note altered sheet name; also .Select is not required
    wbG.Worksheets("Charts").Move(Before=wbP.Worksheets("Annual"))
    wbP.SaveAs(r'C:\Full Path\WorkbookA.xlsx')
    excel.Quit()
    del excel # ensure Excel process ends