본문 바로가기

Dev/Python

Python 엑셀파일 다루기(Feat.openpyxl & xlrd)

728x90
반응형

프로그램을 하면 엑셀 파일을 파싱하는 작업을 하는 경우가 종종 있다.

 

java에선 poi를 통해서 하면 되지만.. 파이썬은 처음인지라....

 

찾아보니 openpyxl 라이브러리를 알게 되었다 사용법도 간단한거 같아 사용했다.

 

1. 라이브러리 설치

pip install openpyxl 

 

이후는 임포트해서 사용하면 된다.

 

사용법은 아래와 같다.

from openpyxl import load_workbook

def excel_test(request) : 
	file = request.FILES['fileInput']
	print("upload File", file)
    
	wb = openpyxl.load_workbook(filename=file, data_only=True)
    
	sheet_ranges = wb['Sheet1']
    
	for row in sheet_ranges.rows :
		print(row)        

파일을 읽고 sheet를 지정해주 읽으면 끝..

 

근데 나는 xls 파일 문제인지. 엑셀 파일 문제인지...

ExceptionType :  <class 'zipfile.BadZipFile'> 
Exception :  File is not a zip file 

이런 오류가 발생했다.. 찾아보니... xls만 아니라 xlsx에서도 문제가 되는거 같았다..

그래서 찾아보니. xls 파일을 읽을려면 xlrd를 사용해보라는 글을 봤다.

 

xlrd는 환경구축시 기본으로 되어 있는거 같지만 없다면

pip install xlrd
file = request.FILES['fileInput']
book = xlrd.open_workbook(file)
print(book.sheet_names())

이렇게 사용하면 또 오류가 발생한다;;;

Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\envs\excelcalculater\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\ProgramData\Anaconda3\envs\excelcalculater\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:\pythonProject\excelcalculater\ExcelCalculate\calculate\views.py", line 18, in calculate
    book = xlrd.open_workbook(file)
  File "C:\ProgramData\Anaconda3\envs\excelcalculater\lib\site-packages\xlrd\__init__.py", line 110, in open_workbook
    filename = os.path.expanduser(filename)
  File "C:\ProgramData\Anaconda3\envs\excelcalculater\lib\ntpath.py", line 293, in expanduser
    path = os.fspath(path)
TypeError: expected str, bytes or os.PathLike object, not InMemoryUploadedFile

웹상에서 구축을 하다 보니 파일 위치를 정상적으로 찾지 못하는거 같다. 

 

아래의 방법으로 하면 파일을 읽는다.. xlrd의 경우 xlsx파일도 리딩이 가능하다.

 

 

file = request.FILES['fileInput']
wb = xlrd.open_workbook(file_contents=file.read())
print(wb.sheet_names())

=======================

wb.sheet_name() # sheet명 읽기 리턴은 리스트형식
wb.sheet_by_name(sheetname) # sheet 이름으로 가지고오기
wb.sheet_by_index(index) # sheet index 번호로 가지고 오기

sheet = wb.sheet_by_name(i)

sheet.nrows #해당 sheet의 row값 
sheet.ncols #해당 sheet의 col 값

sheet.row_values(row_index) # sheet row값 읽기
sheet.cell_value(row_index,cell_index) #셀 값 가져오기 row값을 먼저 세팅

 

 

 

python xlrd를 가지고 참고할만한 소스를 아래에서 찾으시면 될듯 하여 공유 드려요~

www.programcreek.com/python/example/52921/xlrd.open_workbook

 

Python Examples of xlrd.open_workbook

The following are 30 code examples for showing how to use xlrd.open_workbook(). These examples are extracted from open source projects. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by

www.programcreek.com

 

 

728x90
반응형