랭귀지/python

[python]방대한 XLS (Excel) 파일을 읽고(쓰기)

유키공 2017. 12. 21. 20:08
나는 한 프로젝트에서 거대한 XLS 파일을 읽어야 했습니다.

물론 COM 호출을 통하여 모든 셀 내용에 접근할 수 있지만, 너무 느린 단점이 있습니다.

간단한 트릭이 있어요: 그냥 엑셀에게 XLS 파일을 열어 그것을 CSV로 저장해 달라고 요구한 다음, 

파이썬의 CSV 모듈을 사용하여 그 파일을 읽어 들이면 됩니다!
이 방법이 방대한 XLS 데이터 파일을 읽는 가장 빠른 방법입니다.

 
import os

import win32com.client


filename = 'myfile.xls'

filepath = os.path.abspath(filename) # 언제나 확실하게 절대 경로를 사용하자!


# 엑셀을 시작하고 XLS 파일을 연다:

excel = win32com.client.Dispatch('Excel.Application')
excel.Visible = True

workbook = excel.Workbooks.Open(filepath)

# CSV로 저장한다:

xlCSVWindows                  =0x17       # from enum XlFileFormat

workbook.SaveAs(Filename=filepath+".csv",FileFormat=xlCSVWindows)


# 작업책과 엑셀을 닫는다.

workbook.Close(SaveChanges=False)

excel.Quit()
힌트: 이 트릭을 다른 곳에서도 사용할 수 있습니다. 
(파이썬으로 CSV를 만들고, 엑셀을 열어) 방대한 양의 데이터를 엑셀 안으로 반입합니다. 
이 방법은 COM 호출을 통하여 데이터 셀을 채우는 것보다 훨씬 더 빠릅니다.

힌트: excel.Workbooks.Open()을 사용할 때,os.path.abspath()로 언제나 확실하게 절대 경로를 사용해야합니다.

힌트: 또한 엑셀에게 HTML로 저장해 달라고 요청한 다음, 그 HTML을 htmllib이나 sgmllib 또는 BeautifulSoup로 해석할 수도 있습니다. 포맷팅, 컬러, 셀 스팬, 문서 저자나 심지어 수식에 이르기까지 더 많은 정보를 얻을 수 있을 것입니다. !

힌트: 엑셀 VBA 문서는 *.chm을 C:\Program Files\Microsoft Office\에서 검색해 보세요
예를 들어: 엑셀 2000이라면, C:\Program Files\Microsoft Office\Office\1036\VBAXL9.CHM이 도움말입니다.

힌트: VBA 도움말 파일을 헤매지 않고서 한 행위에 상응하는 VBA 코드를 찾고 싶다면, 그냥 그 행위에 대한 매크로를 기록한 다음 열어 보세요!
이렇게 하면 자동으로 VBA 코드가 만들어집니다 (손쉽게 파이썬으로 변환할 수 있습니다).
이 트릭을 보여주는 비디오를 만들었습니다 (프랑스어에요, 죄송): http://sebsauvage.net/temp/wink/excel_vbarecord.html

힌트: 가끔, 엑셀 상수가 필요하다. 상수 목록을 얻으려면:

1.     makepy.py를 실행합니다 (예- C:\Python24\Lib\site-packages\win32com\client\makepy.py) 

2.     목록에서, "Microsoft Excel 9.0 Object Library (1.3)" (뭐 그런거)를 선택해서 ok를 클릭합니다. 

3.     C:\Python24\Lib\site-packages\win32com\gen_py\ 디렉토리를 들여다 보시면.
그 라이브러리를 감싼 포장자가 보일 것입니다 

4.     (예를 들어 00020813-0000-0000-C000-000000000046x0x1x3.py) 

5.        이 파일을 엽니다: Excel 상수와 그의 값이 들어있습니다 (그것을 코드에 붙여 넣으면 됩니다.) 
예를 들어:

xlCSVMSDOS                    =0x18       # from enum 
XlFileFormat
       xlCSVWindows                  =0x17       # from enum 
XlFileFormat 

힌트: 데이터를 엑셀 안으로 넣고 싶으면, 파이썬으로 HTML 문서를 만들어 Excel에게 그 파일을 열도록 요구할 수도 있습니다. 셀 폰트 색상이나 기타 등등을 설정할 수 있을 것.

작은-힌트 1: 생성된 HTML 코드에 \n을 많이 사용합시다 (특히 </td> 뒤에 말이다). 

엑셀은 기다란 줄을 좋아하지 않아요.

작은-힌트 2: CSS 스타일을 사용하여 여러 셀을 포맷하거나 색상을 설정할 수도 있습니다. 

그냥 생성된 HTML에 <style> 스타일 시트를 포함시켜 두면 됩니다.
작은-힌트 3: CSS를 사용하면, 심지어 셀 포맷도 할 수 있습니다 (텍스트, 숫자, 등등). 

예를 들어, <style><!--.mystyle{mso-number-format:"\@";}--></style> 이라면 

<td class=mystyle>25</td>를 사용하여 셀을 강제로 텍스트 셀로 만들 수 있습니다.

(충분히 쓸모가 있습니다. 

예를 들어, 엑셀이 국제 전화 번호를 계산하지 못하도록 막는데 말이 - 멍청이 어플리케이션 !)
또는 mso-number-format:"0\.000";로 하면 3자리 정밀도로 숫자 포맷을 강제할 수 있다.