goodthings4me.tistory.com
파이썬 openpyxl 모듈로 엑셀 파일 여러 개를 병합하려고 했으나 오류가 발생 - openpyxl does not
support the old .xls file format, please use xlrd to read this file, or convert it to the more recent .xlsx file format. - 하였다.
openpyxl .xls 파일 포맷 지원하지 않는 오류 해결하는 방법(.xlsx 파일 포맷으로 변환하는 방법)
오류 메시지
Traceback (most recent call last):
File "d:\pythonDev\onch_excel_merge.py", line 28, in <module>
wb = load_workbook(f'{final_dir}\{file}', data_only=True) # data_only= 값만 불러오기
File "d:\pythonDev\venv\lib\site-packages\openpyxl\reader\excel.py", line 315, in load_workbook
reader = ExcelReader(filename, read_only, keep_vba,
File "d:\pythonDev\venv\lib\site-packages\openpyxl\reader\excel.py", line 124, in __init__
self.archive = _validate_archive(fn)
File "d:\pythonDev\venv\lib\site-packages\openpyxl\reader\excel.py", line 94, in _validate_archive
raise InvalidFileException(msg)
openpyxl.utils.exceptions.InvalidFileException: openpyxl does not
support the old .xls file format, please use xlrd to read this file, or convert it to the more recent .xlsx file format.
메시지 읽은 후 xlrd 라이브러리 설치 - pip install xlrd
xlrd를 이용하여 워크북을 open 했으나 또 에러가 발생했다.
# wb = xlrd.open_workbook(f'{final_dir}\{file}') # xlrd.compdoc.CompDocError: Workbook corruption: seen[3] == 4
wb = xlrd.open_workbook(file_contents = f'{final_dir}\{file}'.read())
xlrd.compdoc.CompDocError: Workbook corruption: seen[3] == 4
구글에서 더 검색하여 pyexcel, pyexcel-xls, pyexcel-xlsx 등의 라이브러리를 설치하여 시도를 했으나 위 이미지와 같은 에러 메시지가 계속 나왔다.
두어 시간 동안 위 라이브러리들 관련 자료를 찾아봤으나 해결이 안되었고, 다른 방법을 찾아 해 보았더니 해결이 되었다.
win32com(pywin32 모듈)을 통해 MS excel 등의 실행을 제어할 수 있다고 되어있었고(https://wikidocs.net/153174 참고), 구글에서 win32com 관련 자료를 찾아보니 .xls를 .xlsx로 변환하는 방법(https://lpla.tistory.com/28 참고)이 나와있었다.
위 2개의 웹 페이지 내용을 기준으로 내 코드에서 활용한 절차대로 요약하여 설명하면,
win32com 모듈을 통해 .xls to .xlsx 할 수 있는데,
win32com(pywin32)은 MS 윈도우 프로그램을 파이썬에서 제어할 수 있도록 만든 API이고, 이를 통해서 Excel, Word 등의 실행 상태에서 제어할 수 있다고 한다.
wincom(pywin32) 설치는 pip install pywin32 명령으로 하지만,
최신 버전의 안정성 문제로 인해 버전을 다운그레이드 설치하여 사용할 것을 권하고 있다.
pip install pywin32==225
pip install --upgrade pywin32==225
내 코드에 넣은 소스
import win32com.client as win32
xls_file = f'{final_dir}\{file}'
excel_app = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel_app.Workbooks.Open(xls_file)
wb.SaveAs(xls_file + 'x', FileFormat = 51) # FileFormat = 51은 .xlsx 확장자, 56은 .xls
wb.Close()
excel_app.Application.Quit()
참고로, 이 반대인 .xlsx를 .xls로 바꾸는 방법은
from win32com.client import Dispatch
excel_app = Dispatch('Excel.Application')
wb = excel_app.Workbooks.Add('A.xlsx')
wb.SaveAs('파일명.xlsx'[:-1], FileFormat = 56)
excel_app.Quit()
☞ openpylx 활용법>>
[Python] 파이썬을 활용한 업무자동화 - 엑셀 자동화(with openpyxl) 연습 코드 정리
업무 자동화(RPA)를 위한 툴로 많이 사용되는 것은 엑셀이다. 특히, 엑셀 VBA로 여러 데이터 관련 복잡한 업무를 자동화하는데, 엑셀이 아닌 파이썬으로도 가능한지 찾다가 유튜브에서 영상 하나
goodthings4me.tistory.com
'코딩 연습 > 코딩배우기' 카테고리의 다른 글
SSG.COM 실시간 급상승 키워드, 베스트 상품 100위 추출(with 파이썬) (0) | 2022.04.11 |
---|---|
뉴스픽 파트너스 기사 링크 주소 복사 (5) | 2022.04.10 |
파이썬 소수 찾기 (0) | 2022.04.09 |
다음 영화 이미지 다운로드 - 지식인 문제 해결(파이썬 크롤링 문의) (0) | 2022.04.08 |
파이썬 GUI 모듈 tkinter 연습(쿠팡 파트너스 상품 링크 관리 프로그램 만들기) (0) | 2022.04.07 |
댓글