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 활용법>>
'코딩 연습 > 코딩배우기' 카테고리의 다른 글
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 |
댓글