[PyQt5] 사내 보안망 DRM 피해서 파일 읽기, 불러오기, 수정하기 | zipfile.BadZipFile: File is not a zip file

PoemSilver·2023년 1월 3일
0

자동화 GUI(PyQt5)

목록 보기
2/2

🎺 Error 원인 🎺

회사에서 파이썬으로 자동화 Tool을 개발하던 중, 문제를 하나 발견했다.
((내가 하려던 작업은 기존에 있던 엑셀파일을 분석하고(읽고), 수정하는 작업이었다.))

분명 파이참 내에서 실행하면 정상적으로 엑셀 파일을 불러오고, 읽을 수 있는데

exe 즉 실행파일로만 생성해서 실행해보면 원인 모를 오류로 개발한 Tool이 꺼지는 현상이 일어났다..

Log를 보니 아래와 같았다.

zipfile.BadZipFile: File is not a zip file


원인은 사내 보안망!

개발한 Tool 내에서 보안이 걸려있는 엑셀 파일들은 일반적으로 사용하는 openpyxl이나 xlsxwriter로 엑셀 파일을 읽거나 수정할 수 없다.


🔮 해결방법

xlwings 모듈을 사용해주면 해결할 수 있다.

openpyxl, xlsxwriterxlwings 차이?

openpyxl xlsxwriter 는 Excel File의 포맷을 지원해주는 라이브러리.

xlwings 는 Excel 내부 매크로를 사용한 라이브러리. 직접 Excel 파일을 열어 내부 매크로로 작업을 끝낸다.


예를 들면

openpyxl 사용했을 때

import openpyxl as op

# 파일 불러오기
filesave = QFileDialog.getOpenFileName(self, "Excel File 선택",'', "Exel files(*.xlsx);; 모든 파일(*)")

# workbook 지정하기(작업할 파일 지정)
workbook = op.load_workbook(filesave[0])
worksheet = workbook.active
.
.
.
workbook.close()

로 코드를 작성했다면 아래와 같이 바꿔줄 수 있다.

xlwings 사용하기

import xlwings as xw

# 파일 불러오기
filesave = QFileDialog.getOpenFileName(self, "Excel File 선택",'', "Exel files(*.xlsx);; 모든 파일(*)")

# workbook 지정하기(작업할 파일 지정)
workbook = xw.Book(filesave[0])
# 현재 작업할 시트 지정(번호로 지정. 몇 번째 시트인지)
worksheet = workbook.sheets(1)
.
.
.
workbook.close()

이 때, xlwings는 엑셀 내부 매크로로 작업하는 것이기 때문에 Excel 파일이 열렸다가, 작업이 끝나면 자동으로 꺼진다.

이 과정을 보이지 않게 하려면 app = xw.App(visible=False) 코드를 추가해준다.

xlwings 사용하기

import xlwings as xw

# 파일 불러오기
filesave = QFileDialog.getOpenFileName(self, "Excel File 선택",'', "Exel files(*.xlsx);; 모든 파일(*)")

# 추가된 코드
app = xw.App(visible=False)

# workbook 지정하기(작업할 파일 지정)
workbook = xw.Book(filesave[0])
# 현재 작업할 시트 지정(번호로 지정. 몇 번째 시트인지)
worksheet = workbook.sheets(1)
.
.
.
workbook.close()

# 추가된 코드2
app.kill()

0개의 댓글