본문 바로가기
코딩 연습/코딩배우기

openpyxl 엑셀 파일 확장자(.xls) 에러 해결하는 방법

by good4me 2022. 4. 10.

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 참고)이 나와있었다.

 

good4me.co.kr

 

위 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

 

 

댓글