1

在安装了 pywin32-216.win32-py2.7 的 Python 2.7.2 下,当我使用 win32com 模块在 windows 上处理 Excel 时,如下所示:

>>> import win32com.client
>>> xlsApp = win32com.client.Dispatch('Excel.Application')
>>> xlsApp.Workbooks.Open(r'D:/test.xls')

我收到一个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<COMObject <unknown>>", line 8, in Open
pywintypes.com_error: (-2147352567, '\xb7\xa2\xc9\xfa\xd2\xe2\xcd\xe2\xa1\xa3',
(0, u'Microsoft Office Excel', u'\u540d\u4e3a\u201ctest.xls\u201d\u7684\u6587\u6
863\u5df2\u7ecf\u6253\u5f00\u3002\u4e0d\u80fd\u540c\u65f6\u6253\u5f00\u540c\u540
d\u6587\u4ef6\uff0c\u65e0\u8bba\u5b83\u4eec\u662f\u5426\u5728\u540c\u4e00\u6587\
u4ef6\u5939\u4e2d\u3002\n\u8981\u6253\u5f00\u7b2c\u4e8c\u4efd\u6587\u6863\uff0c\
u8bf7\u5173\u95ed\u5df2\u7ecf\u6253\u5f00\u7684\u6587\u6863\uff0c\u6216\u8005\u9
1cd\u65b0\u547d\u540d\u5176\u4e2d\u7684\u4e00\u4e2a\u6587\u6863\u3002', None, 0,
 -2146827284), None)

虽然信息不可读,但我不知道出了什么问题!

在互联网上搜索后,我在http://www.python-forum.org/pythonforum/viewtopic.php?f=15&t=17665找到了一些有用的东西:

pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, u'Microsoft Office Excel', u"'test .xls' 找不到。检查文件名的拼写,并验证文件位置是正确的。\n\n如果您尝试从“文件”菜单上最近使用的文件列表中打开该文件,请确保该文件未被重命名、移动或删除。", u'C:\Program文件\Microsoft Office\OFFICE11\1033\xlmain11.chm', 0, -2146827284), 无)

我想这是同样的问题,所以我先创建了一个 Excel 文件“D:/test.xls”,然后一切正常:

>>> xlsApp.Workbooks.Open(r'D:/test.xls')
<COMObject Open>

如果我得到可读的错误提示,我会立即解决问题,没有任何困难!

我想知道为什么我从 win32com.client 得到的错误是这样的?我可以做些什么来使信息可读吗?

我会感谢你的帮助!

4

2 回答 2

3

我想它是这样出现的,因为您在远东地区(也许是中国?)的某个地方使用国际化设置,并且您在命令提示符中使用 Python。我不确定问题出在 Python、命令提示符还是两者的组合上,但无论哪种方式,这两者的组合都不适用于非拉丁国际化设置。

我建议改用IDLE,因为它似乎正确支持 Unicode 字符。这是我在 IDLE 中查看最后一个字符串时发生的情况。这段文字对我没有任何意义,但它可能对你有用:

空闲 2.6.4      
>>> z = u'\u540d\u4e3a\u201ctest.xls\u201d\u7684\u6587\u6863\u5df2\u7ecf\u6253\u5f00\u3002\u4e0d\u80fd\u540c\u65f6\u6253\u5f00\u540c\u u6587\u4ef6\uff0c\u65e0\u8bba\u5b83\u4eec\u662f\u5426\u5728\u540c\u4e00\u6587\u4ef6\u5939\u4e2d\u3002\n\u8981\u6253\u5f00\u47b2c\6878e u6863\uff0c\u8bf7\u5173\u95ed\u5df2\u7ecf\u6253\u5f00\u7684\u6587\u6863\uff0c\u6216\u8005\u91cd\u65b0\u547d\u540d\u5176\u4e07d\54\u762a\u4e8\54\u4e\u u6863\u3002'
>>> 打印 z
“test.xls”的名称已经打开。不能同时打开同名文件,它们是否在同一个文件夹中。
要打开第二份文档,请关闭已经打开的文档,或者重新命名其中的一个文档。
>>>

然而,即使在使用 IDLE 时,当你得到异常时,文本仍然会像上面那样显示。如果发生这种情况,您需要做的是从引发的最后一个异常中获取数据以及print其中的相关字符串。

要获取解释器中引发的最后一个异常,您可以使用sys.last_value. 这是一个带有不同异常消息的示例:

>>> 导入系统
>>> with open('nonexistent.txt') as f: pass
...
回溯(最近一次通话最后):
  文件“”,第 1 行,在
    with open('nonexistent.txt') as f: pass
IOError:[Errno 2] 没有这样的文件或目录:'nonexistent.txt'
>>> sys.last_value
IOError(2, '没有这样的文件或目录')
>>> 打印(sys.last_value[1])
没有相应的文件和目录
>>>
于 2011-09-25T11:38:16.637 回答
0

我遇到了类似的错误。在我的特殊情况下,我试图使用这样创建的临时文件:

fileprefix = 'Report'
filesuffix = '.xlsx'
filename = tempfile.gettempdir() + '\\' + fileprefix + filesuffix
xfile = tempfile.NamedTemporaryFile(suffix = filesuffix, prefix = fileprefix)

在命名的临时文件仍处于打开状态时,是否可以使用该名称再次打开文件,因平台而异(在 Unix 上可以这样使用;在 Windows NT 或更高版本上不能)。

因此,似乎我无法在 Windows 操作系统中重复使用该文件。这就是我收到错误的原因。

在您的情况下,您可能希望首先检查文件是如何创建的。

于 2013-01-01T21:06:02.793 回答