2010-05-14 9 views
1

주식 표준 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) 
>>> 

여기서 잘못된 점이 무엇입니까? 어리석은 짓을했거나 파이썬/win32com/Excel이 어떻게 든 부러 졌나요?

답변

1

나는 2.6.3에 있는데, 직접 확인할 수는 없지만 className에 ASCII가 아닌 문자가 있고, valid_identifier_chars이 바이트 문자열이므로이 문제가 발생합니다. . 일에

몇 생각은 확인 :

  • 당신은 엑셀의 지역화 된 버전을 사용하고 있습니까?
  • 최신 버전의 win32com을 가지고 있습니까? (오류 메시지가 내 버전의 줄 번호와 정확히 일치하지 않습니다)?
  • 2.6.4에서 도입 된 문제인지 확인하기 위해 이전 버전의 Python (예 : 2.5)이 있습니까?

최신 버전의 win32com을 사용한다면 build.py를 편집하고 유니 코드 문자열을 valid_identifier_chars으로 변경하는 것이 좋습니다.

+0

감사합니다. Ryan! 그 마지막 제안으로 머리에 못을 박았습니다. 내 로캘 '('English_Australia ','1252 ')'은 string.letters에 ASCII가 아닌 문자가 있고'className'은 때로는 유니 코드입니다. 따라서 in 연산자는 valid_identifier_chars를 유니 코드로 강제합니다. 위의 오류로 실패합니다. 'className'을 str로 변환하면 win32com 관리자에게 버그가 발생할 수 있습니다. –

+0

로캘이 전체 pywin32 패키지 작성자의 로캘과 동일하다면, 나는이 버그가 이전에 발견되지 않았다는 사실에 약간 놀랐습니다. –

3

당신이 통합 문서 만들기 http://www.python-excel.org/

에서 우수한 XL의 *의 t 패키지에서 볼 수도는/시트로 간단합니다 :

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를 귀찮게 할 필요가 없습니다 .....

행운을 빌어 요 !!

관련 문제