从Python中创建Excel中的新工作簿中断

问题描述:

我正在尝试使用股票标准win32com方法从Python驱动Excel 2007。但是,当我尝试创建新工作簿时,事情变成梨形:从Python中创建Excel中的新工作簿中断

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.6.3上,所以我不能直接检查这个,但看起来你在className中有一个非ASCII字符,而valid_identifier_chars是一个字节字符串,所以这打破了它。

的事情一对夫妇的想法,以检查:

  • 您正在使用的Excel的本地化版本?
  • 是否有最新版本的win32com(错误信息与我的版本的行号完全不符)?
  • 是否有早期版本的python(例如2.5)可以测试它,看看它是否是2.6.4中引入的问题?

如果您确实拥有最新版本的win32com,那么尝试修改build.py并将valid_identifier_chars更改为Unicode字符串。

+0

谢谢瑞恩!你用最后一个建议敲了敲头。我的语言环境'('English_Australia','1252')在string.letters中有非ascii字符,'className'有时是Unicode。因此'in'运算符强制valid_identifier_chars为Unicode,这会失败并出现上述错误。将'className'转换为str可以为我们提供一个解决方法,同时我提出了一个win32com维护者可能的错误。 – 2010-05-14 05:37:32

+0

由于您的语言环境与整个pywin32包的作者相同,所以我有点惊讶,这个所谓的bug在之前没有被注意到:-) – 2010-05-15 23:09:27

你可能想看看优秀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 API打扰.....

祝你好运!