从Python创建新的Excel工作簿失败

1 投票
2 回答
4853 浏览
提问于 2025-04-15 22:41

我正在尝试用常规的win32com方法从Python控制Excel 2007。但是,当我试图创建一个新的工作簿时,事情就出问题了:

Python 2.6.4 (r264:75706, Nov  3 2009, 13:23:17) [MSC v.1500 32 bit (Intel)] on win32
...
>>> import win32com.client
>>> excel = win32com.client.Dispatch("Excel.Application")
>>> wb = excel.Workbooks.Add()

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    wb = excel.Workbooks.Add()
  File "C:\Python26\lib\site-packages\win32com\client\dynamic.py", line 467, in __getattr__
    if self._olerepr_.mapFuncs.has_key(attr): return self._make_method_(attr)
  File "C:\Python26\lib\site-packages\win32com\client\dynamic.py", line 295, in _make_method_
    methodCodeList = self._olerepr_.MakeFuncMethod(self._olerepr_.mapFuncs[name], methodName,0)
  File "C:\Python26\lib\site-packages\win32com\client\build.py", line 297, in MakeFuncMethod
    return self.MakeDispatchFuncMethod(entry, name, bMakeClass)
  File "C:\Python26\lib\site-packages\win32com\client\build.py", line 318, in MakeDispatchFuncMethod
    s = linePrefix + 'def ' + name + '(self' + BuildCallList(fdesc, names, defNamedOptArg, defNamedNotOptArg, defUnnamedArg, defOutArg) + '):'
  File "C:\Python26\lib\site-packages\win32com\client\build.py", line 604, in BuildCallList
    argName = MakePublicAttributeName(argName)
  File "C:\Python26\lib\site-packages\win32com\client\build.py", line 542, in MakePublicAttributeName
    return filter( lambda char: char in valid_identifier_chars, className)
  File "C:\Python26\lib\site-packages\win32com\client\build.py", line 542, in <lambda>
    return filter( lambda char: char in valid_identifier_chars, className)
UnicodeDecodeError: 'ascii' codec can't decode byte 0x83 in position 52: ordinal not in range(128)
>>> 

这里到底出了什么问题?我是不是做了什么傻事,还是Python/win32com/Excel有什么问题?

2 个回答

3

你可以看看非常棒的xl*t包,地址是 http://www.python-excel.org/

创建工作簿和工作表非常简单:

import xlwt
from datetime import datetime

wb = xlwt.Workbook()
ws = wb.add_sheet('A Test Sheet')

ws.write(0, 0, 'Test', style0)
ws.write(1, 0, datetime.now(), style1)
ws.write(2, 0, 1)
ws.write(2, 1, 1)
ws.write(2, 2, xlwt.Formula("A3+B3"))

wb.save('example.xls')

而且你不需要去烦恼win32com这个接口.....

祝你好运!!

Ben

1

我现在用的是2.6.3版本,所以不能直接检查这个问题,但看起来你的className里面可能有个非ASCII字符,而valid_identifier_chars是个字节字符串,这样就会出问题。

这里有几个建议可以检查一下:

  • 你是在用本地化版本的Excel吗?
  • 你有没有安装最新版本的win32com(错误信息的行号和我版本的不太一样)?
  • 你有没有一个早期版本的Python(比如2.5),可以用来测试一下,看看是不是2.6.4版本引入的问题?

如果你确实有最新版本的win32com,可以试试一个比较“hack”的方法,就是编辑build.py,把valid_identifier_chars改成Unicode字符串。

撰写回答