회사에서 파이썬으로 자동화 Tool을 개발하던 중, 문제를 하나 발견했다.
((내가 하려던 작업은 기존에 있던 엑셀파일을 분석하고(읽고), 수정하는 작업이었다.))
분명 파이참 내에서 실행하면 정상적으로 엑셀 파일을 불러오고, 읽을 수 있는데
exe 즉 실행파일로만 생성해서 실행해보면 원인 모를 오류로 개발한 Tool이 꺼지는 현상이 일어났다..
Log를 보니 아래와 같았다.
zipfile.BadZipFile: File is not a zip file
원인은 사내 보안망!
개발한 Tool 내에서 보안이 걸려있는 엑셀 파일들은 일반적으로 사용하는
openpyxl
이나xlsxwriter
로 엑셀 파일을 읽거나 수정할 수 없다.
xlwings
모듈을 사용해주면 해결할 수 있다.
openpyxl, xlsxwriter
와xlwings
차이?
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()
와.. 진짜 감사합니다ㅠㅠ 큰 도움 받았습니다!!