programing

win32com을 사용하여 Excel 파일에 액세스할 때 문제 발생

css3 2023. 8. 28. 21:20

win32com을 사용하여 Excel 파일에 액세스할 때 문제 발생

여분러!
저는 Python의 win32com.client 모듈을 사용하여 VBA 매크로가 포함된 Excel 파일의 셀에 액세스하고 있습니다.
코에있문장에 있는 xl = win32com.client.gencache.EnsureDispatch("Excel.Application") .
AttributeError: module 'win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x6' has no attribute 'MinorVersion'
유사한 상황에 직면한 사람이 있습니까? 만그렇면, 이에대가 해무은까니엇 입책결? (의 소스 (GitHub에서 win32com의 소스 코드를 살펴보았지만, 그다지 의미가 없습니다.)

이 속성 오류의 주요 원인은 COM 서버가 지연 바인딩(동적)에서 초기 바인딩(정적)으로 전환되었기 때문입니다.

  • Late Binding에서는 메서드가 호출될 때마다 개체가 메서드에 대해 쿼리되고 성공하면 호출할 수 있습니다.
  • 얼리 바인딩에서 객체 모델의 정보는 객체 호출에 의해 제공된 유형 정보에서 미리 결정됩니다.초기 바인딩은 MakePy를 사용합니다.또한 조기 바인딩은 대소문자를 구분합니다.

이 문제를 해결하는 두 가지 방법이 있습니다.

  1. 동적 모듈을 사용하여 코드가 지연 방향으로 작동하도록 합니다.사용 예:

    "win32com.client.dynamic.Dispatch()" instead of "win32com.client.Dispatch()" 
    
  2. 초기 바운드 지향 방식에는 대/소문자를 구분하는 키워드를 사용합니다.사용 예:

    "excel.Visible()" instead of "excel.VISIBLE()" or "excel.visible()"
    

시험삼아 해보기

"win32com.client.dynamic.Dispatch()" instead of "win32com.client.gencache.EnsureDispatch"

win32com.client.gencache로 지정합니다.Dispatch가 MakePy 프로세스를 강제로 수행하는지 확인합니다.

로 이름 GenPy폴더가 작동해야 합니다.

위치에 있습니다.C:\Users\ _insert_username_ \AppData\Local\Temp\gen_py

이름을 변경하면 새 이름이 만들어집니다.Gen_pyExcel을 올바르게 발송할 수 있도록 해줍니다.

해결 방법은 gen_py 폴더(C:\Users\\AppData\Local\)를 찾는 것입니다.Temp\gen_py) 및 해당 내용을 삭제합니다.이것은 다른 프로그램과 함께 COM을 사용할 때 저에게 효과가 있습니다.

만약 내가 파이썬이 새로운 엑셀 인스턴스를 시작하기를 원한다면 (예를 들어 내 xlsm 파일의 매크로에 액세스하기 위해),

xlApp = win32com.client.DispatchEx("Excel.Application")

이렇게 하면 이미 열려 있던 인스턴스를 손상시키지 않고 응용프로그램을 닫을 수 있습니다.

그렇지 않다면, 그냥 사용할 수 있어요

xlApp = win32com.client.Dispatch("Excel.Application")

그게 당신에게 효과가 있습니까?

이전 답변인 발송 확인을 더 잘 이해할 수 있을 것으로 믿지만, 이 문제가 있지만 코드를 수정할 수 없거나 원하지 않는 경우 폴더 이름을 변경하여 문제를 해결할 수 있었습니다.다음 행을 실행하면 동일한 오류가 발생했습니다.

from win32com.client.gencache import EnsureDispatch
import sys
xl = EnsureDispatch("Excel.Application")  # Error here
print(sys.modules[xl.__module__].__file__)

안타깝게도 오류가 발생하면 파일 위치를 알 수 없습니다.에게는 이 저는이폴사용습니다했를더:다니▁for습▁folder.C:\Users\<username>\AppData\Local\Temp\gen_py\해당 폴더 이름에 밑줄을 추가하거나 삭제하면 코드를 다시 실행할 때 폴더가 다시 만들어집니다.

에 대한 모자 팁

pyxll 링크에는 잠재적으로 다른 폴더 위치를 호출할 다른 코드 블록이 있습니다.제가 사용하지 않아서 여기에 코드를 올리지 않습니다.위의 수정은 나에게 효과가 있었지만, 만약 당신이 토끼굴 아래로 더 내려갈 수 있다면.

이전에 언급한 폴더 삭제는 저에게 효과가 없었습니다.conda. conda install - canaconda pywin32를 사용하여 새로운 버전의 pywin32를 설치하여 이 문제를 해결했습니다.

이 폴더를 삭제하기만 하면 됩니다.C:\Users\<your username>\AppData\Local\Temp\gen_py커널을 다시 시작하고 스크립트를 다시 실행합니다.나를 위해 일했습니다.

언급URL : https://stackoverflow.com/questions/47608506/issue-in-using-win32com-to-access-excel-file