[openpyxl] load_workbook 파일 불러오기 질문

조회수 5444회
우분투       18.04
윈도우       10
한셀         2014
anaconda    4.6.14
Python      3.7.2
openpyxl    2.6.2
PyQt5       5.12.2
PyInstaller 3.4
import os
from openpyxl import load_workbook


filename = '/Users/feynman/Desktop/test.xlsx'
# filename = 'C:\\Users\\feynman\\Desktop\\test.xlsx'
# filename = r'C:\Users\feynman\Desktop\test.xlsx'
# filename = 'C:/Users/feynman/Desktop/test.xlsx'

book = load_workbook(filename=filename)
# book = load_workbook(filename='test.xlsx') 같은 위치에 있는 파일에 접근
# book = load_workbook(filename=os.path.join(path, 'filename.xlsx'))

sheet = book.active
sheet['E1'] = 200
book.save(filename='testtest.xlsx')

raise TypeError('expected ' + str(self.expected_type)) TypeError: expected

load_workbook() 함수를 호출하면 에러가 발생합니다.

from openpyxl import Workbook

wb = Workbook()
ws = wb.active
ws['A1'] = 1
wb.save(filename='test.xlsx')

위 방법으로 엑셀 파일을 만들고 load_workbook으로 접근하면 잘 됩니다. 하지만 파일을 수정(셀에 글을 쓴다든가 폰트나 글꼴을 바꾸는 등)을 하면 똑같은 에러가 발생합니다. 어떤 이유로 이런 에러가 발생하는 것일까요? 디버그를 따라가도 잘 모르겠습니다...

추가 내용

우분투에서는 잘 됐기에 윈도우에서도 LibreOffice를 설치하고 엑셀 파일을 만들었습니다. 그리고 한셀과는 다르게 파일을 잘 읽어옵니다. 그러면 한셀 파일을 못 불러온다는 건데 무엇 때문에 이런 걸까요? 그리고 코드 어디를 수정하면 좋을까요? 지금도 디버그 돌리면서 보고 있는데 되는 파일과 안 되는 파일의 차이를 모르겠습니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 사용하는 엑셀 버전이 높은 버전일 가능성이 있습니다.

    해당 openpyxl 모듈 사이트에 보면 "A Python library to read/write Excel 2010 xlsx/xlsm files" 라고 되어 있습니다.

    excel 2010 포맷이하만 제대로 동작할 가능성이 큽니다.

    당연히 openpyxl 에서 저장할땐 2010 포맷에 맞춰 저장을 할 것이니 load_workbook 에서 문제가 없을 것 입니다.

    엑셀에서 저장할 때 낮은 버전으로 저장하고 테스트해보세요.

    • 말씀하신 대로 파일 형식을 '엑셀 2007-2013 통합 문서(*.xlsx)'로 저장했습니다. 혹시나 해서 95-2003 형식으로 해봤는데 xls는 지원하지 않는다는 에러가 발생합니다. 우분투 LibreOffice에서는 잘 됩니다. 윈도우는 한셀 2014를 이용해 엑셀 파일을 저장하고 있는데 이것 때문은 아니겠죠?
      -------------------------------------
      본문 추가 내용에도 적었지만 LibreOffice로 만든 파일을 불러오니 잘 됩니다. 그러면 한셀로 만든 파일의 포맷이 MS 엑셀이나 LibreOffice 엑셀과는 다르다는 뜻이네요?
      알 수 없는 사용자 2019.5.26 15:58
    • 그 부분은 한컴쪽에 질문해보셔야 합니다. 정영훈 2019.5.26 23:14

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)