JSITCLUB

파이썬 - 패스워드 설정된 엑셀 파일 열기 본문

파이썬/활용

파이썬 - 패스워드 설정된 엑셀 파일 열기

jsitclub 2022. 7. 11. 17:58

2023.11 수정 - 좀더 빠른방법으로 수정 

 

엑셀에서는 파일에 패스워드를 설정 할 수 있습니다. 이런 엑셀파일을 실행하면 다음과 같은 팝업이 나타납니다.

 

또한 이와같이 패스워드가 설정된 엑셀파일의 데이터를 파이썬으로 읽어오려고 하면 각각 다음과 같은 에러가 나게 되죠.

xlsx일때 : zipfile.BadZipFile: File is not a zip file

xls 일때  : xlrd.biffh.XLRDError: Workbook is encrypted

 

오늘은 파이썬으로 이와 같이 암호가 걸려 있는 파일을 여는 코드를 공유 해보려 합니다.

물론 패스워드는 알고 있어야 합니다.(패스워드 모를때 여는것은 해킹이 되겠죠 ㅎㅎ)

 

제공되는 코드는 win32com을 이용하여 엑셀파일을 열고 있습니다. 그래서 win32com이 설치되어 있어야 합니다.

참고로 이 모듈를 이용해서 powerpoint, word 도 제어가 가능하다고 하네요. 해본적은 없습니다.

 

설치는 pip를 이용하시면 됩니다. 대부분 모듈이름을 그대로 pip에 적어주면 되지만, 다른이름을 적어주니 기억 하세요.

 

설치가 완료 되었으면 다음 코드로 데이터를 가져 올 수 있습니다.

Open() 함수의 매개변수를 자신의 파일명(확장자까지) 과 파일패스워드로 맞춰주시면 됩니다.

파일은 xlsx 와 xls 모두 열기가 가능합니다.

import win32com.client

xlApp = win32com.client.Dispatch("Excel.Application")
print ("Excel library version:", xlApp.Version)

#"myfile_pw.xls"대신 자신의 파일경로 및 파일명으로 
#"password" 대신 설정되 패스워드로 맞춰주세요.
book = xlApp.Workbooks.Open("myfile_pw.xls",True, True, None, "password")

sheet=book.ActiveSheet
print(sheet.Cells(1,1).Value)

 

2023.11

위의 방법으로 사용해 왔었는데, 사용하다보니 두가지 문제가 있었습니다.

- 속도가 느리다

- win32를 사용하므로 리눅스와 같은 다른 os에서는 실행이 되지 않는다

 

사용해 본 결과 새로운 방법의 속도가 훨씬 빠르기 때문에 이 방법을 추천합니다.

 

 

새로운 방법은 msoffcrypto 모듈을 사용하므로 설치가 필요합니다.

>> pip install msoffcrypto-tool

 

import io
import msoffcrypto
import openpyxl

decrypted_workbook = io.BytesIO()

#"myfile_pw.xls"대신 자신의 파일경로 및 파일명으로 
office_file = msoffcrypto.OfficeFile(open("myfile_pw.xlsx", 'rb'))

#"password" 대신 설정되 패스워드로 맞춰주세요.
office_file.load_key(password='password')
office_file.decrypt(decrypted_workbook)

# `filename` can also be a file-like object.
workbook = openpyxl.load_workbook(filename=decrypted_workbook)
sheet=workbook.active

for row_no,row_data in enumerate(sheet.rows):
    print(row_no,row_data)
Comments