代码之家  ›  专栏  ›  技术社区  ›  Marcelo Cantos

从python break在Excel中创建新工作簿

  •  1
  • Marcelo Cantos  · 技术社区  · 14 年前

    我正在尝试使用标准的win32com方法从python中驱动Excel2007。然而,当我试图创建一个新的工作簿时,事情会变得复杂起来:

    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 回复  |  直到 14 年前
        1
  •  1
  •   Ryan Ginstrom    14 年前

    我在2.6.3上,所以我不能直接检查这个,但看起来您在 className 不知何故 valid_identifier_chars 是一个字节字符串,所以这会破坏它。

    对要检查的问题有几点想法:

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

    如果你有最新版本的win32com,你可以尝试编辑build.py并更改它。 有效的标识符字符 到Unicode字符串。

        2
  •  3
  •   Ben Hughes    14 年前

    您可能想看看卓越的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…..

    祝你好运!!