【问题标题】:Python 2.7 - win32com.client - Move a worksheet from one workbook to anotherPython 2.7 - win32com.client - 将工作表从一个工作簿移动到另一个工作簿
【发布时间】:2014-11-14 17:40:07
【问题描述】:

我正在尝试使用 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 的 cmets。我需要移动的工作表名为 Charts 而不是 Sheet1。

【问题讨论】:

  • 这可能不是问题的原因,但无论如何都应该更改:\ 是转义字符。使用原始字符串或正斜杠,例如:wbG=excel.Workbooks.Open(r'C:\Full Path\WorkbookB.xlsx')wbG=excel.Workbooks.Open('C:/Full Path/WorkbookB.xlsx')
  • 您也可以使用win32com.client.DispatchEx 创建一个新的 Excel 实例,以避免干扰任何打开的 Excel 实例。如果您使用DispatchEx,您可以将.Visible 设置为False。进一步阅读DispatchExtimgolden.me.uk/python/win32_how_do_i/…
  • 你好,伯尼。谢谢你的建议。我做了你建议的调整。不幸的是,我仍然收到错误消息。
  • 该行出现的错误表明 WorkbookB.xlsx 中没有“Sheet1”
  • 是的...我已将 Sheet1 的名称更改为 Charts。谢谢伯尼!

标签: python python-2.7 excel win32com vba


【解决方案1】:

我正在将 cmets 写在答案中,因为它更容易阅读......

由于该行发生错误,因此问题似乎是 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')

结合这些建议,代码变成:

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

【讨论】:

  • 您好,您好,我有一个与此问题类似的问题。在我的情况下,我需要将工作簿A中的工作表1中的信息复制到工作簿B中的工作表2。我尝试使用您在 Stephanie 的问题中提供的代码,但在我的情况下是在 workbookB 中创建一个新工作表。你可以在这里找到我的问题。 stackoverflow.com/questions/42234155/… 非常感谢您的帮助。感谢和抱歉糟糕的英语问候,Carlos Arronte。
  • @CarlosArronteBello:请继续询问有关您的要求的另一个问题。谢谢。
  • 谢谢,我会尽快做。我现在不在办公室。将回来大约 90 分钟。非常感谢。
  • 这是我的Question
  • 我刚刚对这个问题做了一点更新。见上面的链接
猜你喜欢
  • 2021-06-16
  • 1970-01-01
  • 2020-05-23
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多