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를 사용합니다.또한 조기 바인딩은 대소문자를 구분합니다.
이 문제를 해결하는 두 가지 방법이 있습니다.
동적 모듈을 사용하여 코드가 지연 방향으로 작동하도록 합니다.사용 예:
"win32com.client.dynamic.Dispatch()" instead of "win32com.client.Dispatch()"
초기 바운드 지향 방식에는 대/소문자를 구분하는 키워드를 사용합니다.사용 예:
"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_py
Excel을 올바르게 발송할 수 있도록 해줍니다.
해결 방법은 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\
해당 폴더 이름에 밑줄을 추가하거나 삭제하면 코드를 다시 실행할 때 폴더가 다시 만들어집니다.
에 대한 모자 팁
- https://www.pyxll.com/_forum/index.php?topic=436.0
- https://gist.github.com/rdapaz/63590adb94a46039ca4a10994dff9dbe
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
'programing' 카테고리의 다른 글
모듈의 Python 명명 규칙 (0) | 2023.08.28 |
---|---|
중복된 개별 반품 선택 (0) | 2023.08.28 |
빌드가 프로젝트 리포지토리보다 설정 리포지토리를 선호하도록 구성되었지만 'maven' 저장소가 빌드 파일 'build.gradle'에 의해 추가되었습니다. (0) | 2023.08.28 |
'%query2%'와 같은 필드1이 아닌 곳을 선택하는 방법 (0) | 2023.08.28 |
실행 중인 도커 컨테이너로 mysql 가져오기가 작동하지 않음 (0) | 2023.08.28 |