xlwt
, OpenPyXL
, XlsxWriter
, PyExcelerate
등이 있는데 그 중 가장 많이 쓰이는 것이 XlsxWriter
와 OpenPyXL
XlsxWriter
는 엑셀의 많은 기능을 지원하고 있음에도 불구하고 커다란 단점이 하나 있으니 바로 기존에 저장해둔 엑셀 파일을 불러들이지 못한다는 것 (=file load 불가)OpenPyXL
은 충실하게 엑셀 기능을 지원하면서도 이러한 단점이 없어서 많이 쓰이고 있음pip install openpyxl
import openpyxl
wb = openpyxl.Workbook()
#워크북을 생성하면 그 안에 워크시트 1개가 자동으로 생성
ws = wb.active
# 활성화 된 워크시트를 가리킴
from openpyxl import load_workbook
wb = openpyxl.load_workbook(filename='filename.xlsx')
#기존 엑셀 파일 불러오기
ws = wb.active
# 현재 활성화 되어 있는 시트를 가리킴
ws = wb['Sheet4']
# 시트명 가리킴
openpyxl
의 load_workbook
메서드를 이용해 엑셀 파일을 읽음def get_excel_data(self, file):
load_wb = load_workbook(file, data_only=True)
load_st = load_wb["sheet_name"]
all_values = []
for row in load_st.rows:
row_value = []
for cell in row:
row_value.append(cell.value)
all_values.append(row_value)
return all_values
Tip! Http 통신을 통해 Excel File 전달받는 방법
request.FILES.getlist("key_name")
은 여러개의 파일이 올 경우 받는 방법으로 list로 파일이 나열됨- 한 개의 파일만 받는 경우
request.FILES
에 key값으로 excel 파일을 전달
- 예시 :
file = request.FILES["file"]
Tip! Postman으로 파일 전송 테스트하기
wb.create_sheet('새시트이름',0)
# 시트명 = '새시트이름', 0번째(=맨 왼쪽을 의미)에 시트를 위치 시키겠다.
print(ws['A1']) # A1 셀 자체를 가리킴
print(ws['A1'].value) # A1 셀의 내용을 확인
#또 다른 셀 접근방법
ws.cell(row = 5, column = 2)
# 세로방향(row)로 5번째, 가로방향(column)으로 2번째 셀을 의미
# 첫째행 타이틀 적기 예제
# 제목 적기
sub = ['번호', '이름', '주소', '이메일']
for kwd, j in zip(sub, list(range(1, len(sub)+1))):
ws.cell(row=1, column=j).value = kwd
print(ws['A'])
# A열의 모든 셀을 가져옴
print(ws['A1'].value) # A1 셀의 내용을 확인
for cell in ws['A']: # A열의 모든 셀을 확인
print(cell.value)
# 셀 A1 (1열1행) 의 데이터 수평수직 가운데 정렬
row = 1
column = 1
ws.cell(row=row, column=num).alignment = openpyxl.styles.Alignment(horizontal='center', vertical='center')
#D열 전부 가운데 정렬
for cell in range(len(ws['D'])):
ws['D'+str(cell+1)].alignment = openpyxl.styles.Alignment(horizontal='center', vertical='center')
#아래는 특정열 지정하여 (3열~15열) 6행 이하부터 전부 가운데 정렬
for num in [3,5,6,7,8,9,10,11,12,14,15]:
for row in range(6, len(ws['O'])+1):
ws.cell(row=row, column=num).alignment = openpyxl.styles.Alignment(horizontal='center', vertical='center')
#각 행마다 A열 값이 None 이면 해당 행을 삭제
#시트 전체 행 탐색 및 적용
tmp = 1
for cell in tuple(ws.columns)[0]:
if cell.value == None:
ws.delete_rows(tmp)
tmp -= 1
tmp += 1
from openpyxl.styles import PatternFill
# 셀 1행 7칸 까지만 배경색 노랑색 변경
y_color = PatternFill(start_color='ffff99', end_color='ffff99', fill_type='solid')
for num in range(1, 7):
ws.cell(1,num).fill = y_color
ws.column_dimensions['A'].width = 50 # A열
ws.column_dimensions['B'].width = 15 # B열
ws.column_dimensions['C'].width = 120 # C열
ws.column_dimensions['D'].width = 20
ws.column_dimensions['E'].width = 10
ws.column_dimensions['F'].width = 10
wb.save(filename='filename.xlsx')
wb.close()
Tip! 추가 내용
import openpyxl
wb =openpyxl.load_workbook('test.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
for cell_obj in list(sheet.columns)[1]:
print(cell_obj.value)
import openpyxl
wb =openpyxl.load_workbook('test.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
for cell_obj in list(sheet.rows)[1]:
print(cell_obj.value)