[Python] Excel다루기
Posted by Albert 777Day 19Hour 33Min 39Sec ago [2023-03-04]
1.엑셀파일생성
from openpyxl import Workbook
wb = Workbook() ' 새 워크북 생성
ws = wb.active ' 현재 활성화된 sheet 가져옴
ws.title = "NadoSheet" ' sheet 의 이름을 변경
wb.save("sample.xlsx")
wb.close()
2. 신규sheep생성 및 복
from openpyxl import Workbook
wb = Workbook()
' wb.active
ws = wb.create_sheet() ' 새로운 Sheet 기본 이름으로 생성
ws.title = "MySheet" ' Sheet 이름 변경
ws.sheet_properties.tabColor = "ff66ff" ' RGB 형태로 값을 넣어주면 탭 색상 변경
' Sheet, MySheet, YourSheet
ws1 = wb.create_sheet("YourSheet") ' 주어진 이름으로 Sheet 생성
ws2 = wb.create_sheet("NewSheet", 2) ' 2번째 index 에 Sheet 생성
new_ws = wb["NewSheet"] ' Dict 형태로 Sheet 에 접근
print(wb.sheetnames) ' 모든 Sheet 이름 확인
' Sheet 복사
new_ws["A1"] = "Test"
target = wb.copy_worksheet(new_ws)
target.title = "Copied Sheet"
wb.save("sample.xlsx")
3. Cell 정보 다루기
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = "NadoSheet"
' A1 셀에 1 이라는 값을 입력
ws["A1"] = 1
ws["A2"] = 2
ws["A3"] = 3
ws["B1"] = 4
ws["B2"] = 5
ws["B3"] = 6
print(ws["A1"]) ' A1 셀의 정보를 출력
print(ws["A1"].value) ' A1 셀의 '값'을 출력
print(ws["A10"].value) ' 값이 없을 땐 'None' 을 출력
' row = 1, 2, 3, ...
' column = A(1), B(2), C(3), ...
print(ws.cell(column=1, row=1).value) ' ws["A1"].value
print(ws.cell(column=2, row=1).value) ' ws["B1"].value
c = ws.cell(column=3, row=1, value=10) ' ws["C1"].value = 10
print(c.value) ' ws["C1"]
from random import *
' 반복문을 이용해서 랜덤 숫자 채우기
index = 1
for x in range(1, 11): ' 10 개 row
for y in range(1, 11): ' 10 개 column
'ws.cell(row=x, column=y, value=randint(0, 100)) ' 0~100 사이의 숫자
ws.cell(row=x, column=y, value=index)
index += 1
wb.save("sample.xlsx")
4. 엑셀 파일 불러와서 출력하기
from openpyxl import load_workbook ' 파일 불러오기
wb = load_workbook("sample.xlsx") ' sample.xlsx 파일에서 wb 을 불러옴
ws = wb.active ' 활성화된 Sheet
' cell 데이터 불러오기
' for x in range(1, 11):
' for y in range(1, 11):
' print(ws.cell(row=x, column=y).value, end=" ") ' 1 2 3 4 ..
' print()
' cell 갯수를 모를 때
for x in range(1, ws.max_row + 1):
for y in range(1, ws.max_column + 1):
print(ws.cell(row=x, column=y).value, end=" ") ' 1 2 3 4 ..
print()
5. Cell range
from openpyxl import Workbook
from random import *
wb = Workbook()
ws = wb.active
' 1줄씩 데이터 넣기
ws.append(["번호", "영어", "수학"]) ' A, B, C
for i in range(1, 11): ' 10개 데이터 넣기
ws.append([i, randint(0, 100), randint(0, 100)])
col_B = ws["B"] ' 영어 column 만 가지고 오기
'print(col_B)
' for cell in col_B:
' print(cell.value)
col_range = ws["B:C"] ' 영어, 수학 column 함께 가지고 오기
' for cols in col_range:
' for cell in cols:
' print(cell.value)
row_title = ws[1] ' 1번째 row 만 가지고 오기
' for cell in row_title:
' print(cell.value)
' row_range = ws[2:6] ' 1번째 줄인 title 을 제외하고 2번째 줄에서 6번째 줄까지 가지고 오기
' for rows in row_range:
' for cell in rows:
' print(cell.value, end=" ")
' print()
' from openpyxl.utils.cell import coordinate_from_string
' row_range = ws[2:ws.max_row] ' 2번째 줄부터 마지막 줄까지
' for rows in row_range:
' for cell in rows:
' ' print(cell.value, end=" ")
' ' print(cell.coordinate, end=" ") ' A/10, AZ/250
' xy = coordinate_from_string(cell.coordinate)
' 'print(xy, end=" ")
' print(xy[0], end="") ' A
' print(xy[1], end=" ") ' 1
' print()
' 전체 rows
'print(tuple(ws.rows))
' for row in tuple(ws.rows):
' print(row[2].value)
' 전체 columns
'print(tuple(ws.columns))
' for column in tuple(ws.columns):
' print(column[0].value)
' for row in ws.iter_rows(): ' 전체 row
' print(row[2].value)
' for column in ws.iter_cols(): ' 전체 column
' print(column[0].value)
' 2번째 줄부터 11번째 줄까지, 2번째 열부터 3번째 열까지
' for row in ws.iter_rows(min_row=2, max_row=11, min_col=2, max_col=3):
' ' print(row[0].value, row[1].value) ' 수학, 영어
' print(row)
for col in ws.iter_cols(min_row=1, max_row=5, min_col=1, max_col=3):
print(col)
wb.save("sample.xlsx")
6. Excel내용 에서 특정 내용 찾아 변경하기
from openpyxl import load_workbook
wb = load_workbook("sample.xlsx")
ws = wb.active
for row in ws.iter_rows(min_row=2):
' 번호, 영어, 수학
if int(row[1].value) > 80:
print(row[0].value, "번 학생은 영어 천재")
for row in ws.iter_rows(max_row=1):
for cell in row:
if cell.value == "영어":
cell.value = "컴퓨터"
wb.save("sample_modified.xlsx")
7. 특정row 및 column 추가
from openpyxl import load_workbook
wb = load_workbook("sample.xlsx")
ws = wb.active
' ws.insert_rows(8) ' 8번째 줄이 비워짐
' ws.insert_rows(8, 5) ' 8번째 줄 위치에 5줄을 추가
' wb.save("sample_insert_rows.xlsx")
' ws.insert_cols(2) ' B번째 열이 비워짐 (새로운 빈 열이 추가)
ws.insert_cols(2, 3) ' B번째 열로부터 3열 추가
wb.save("sample_insert_cols.xlsx")
8. 특정row 및 column 삭제
from openpyxl import load_workbook
wb = load_workbook("sample.xlsx")
ws = wb.active
' ws.delete_rows(8) ' 8 번째 줄에 있는 7 번 학생 데이터 삭제
' ws.delete_rows(8, 3) ' 8번째 줄부터 총 3줄 삭제
' wb.save("sample_delete_row.xlsx")
' ws.delete_cols(2) ' 2번째 열 (B) 삭제
ws.delete_cols(2, 2) ' 2번재 열로부터 총 2개 열 삭제
wb.save("sample_delete_col.xlsx")
9. 특정범위 Data값을 특정위치로 이동
from openpyxl import load_workbook
wb = load_workbook("sample.xlsx")
ws = wb.active
' 번호 영어 수학
' 번호 (국어) 영어 수학
' ws.move_range("B1:C11", rows=0, cols=1)
' ws["B1"].value = "국어" ' B1 셀에 '국어' 입력
' 번호 영어 수학
ws.move_range("C1:C11", rows=5, cols=-1)
wb.save("sample_korean.xlsx")
10 차트그리기
from openpyxl import load_workbook
wb = load_workbook("sample.xlsx")
ws = wb.active
from openpyxl.chart import BarChart, Reference, LineChart
' B2:C11 까지의 데이터를 차트로 생성
bar_value = Reference(ws, min_row=2, max_row=11, min_col=2, max_col=3)
bar_chart = BarChart() ' 차트 종류 설정 (Bar, Line, Pie, ..)
bar_chart.add_data(bar_value) ' 차트 데이터 추가
ws.add_chart(bar_chart, "E1") ' 차트 넣을 위치 정의
' B1:C11 까지의 데이터
line_value = Reference(ws, min_row=1, max_row=11, min_col=2, max_col=3)
line_chart = LineChart()
line_chart.add_data(line_value, titles_from_data=True) ' 계열 > 영어, 수학 (제목에서 가져옴)
line_chart.title = "성적표" ' 제목
line_chart.style = 10 ' 미리 정의된 스타일을 적용, 사용자가 개별 지정도 가능
line_chart.y_axis.title = "점수" ' Y축의 제목
line_chart.x_axis.title = "번호" ' X축의 제목
ws.add_chart(line_chart, "M1")
wb.save("sample_chart.xlsx")
11 Cell Style
from openpyxl.styles import Font, Border, Side, PatternFill, Alignment
from openpyxl import load_workbook
wb = load_workbook("sample.xlsx")
ws = wb.active
' 번호, 영어, 수학
a1 = ws["A1"] ' 번호
b1 = ws["B1"] ' 영어
c1 = ws["C1"] ' 수학
' A 열의 너비를 5로 설정
ws.column_dimensions["A"].width = 5
' 1 행의 높이를 50 으로 설정
ws.row_dimensions[1].height = 50
' 스타일 적용
a1.font = Font(color="FF0000", italic=True, bold=True) ' 글자 색은 빨갛게, 이탤릭, 두껍게 적용
b1.font = Font(color="CC33FF", name="Arial", strike=True) ' 폰트를 Arial 로 설정, 취소선 적용
c1.font = Font(color="0000FF", size=20, underline="single") ' 글자 크기를 20으로, 밑줄 적용
' 테두리 적용
thin_border = Border(left=Side(style="thin"), right=Side(style="thin"), top=Side(style="thin"), bottom=Side(style="thin"))
a1.border = thin_border
b1.border = thin_border
c1.border = thin_border
' 90 점 넘는 셀에 대해서 초록색으로 적용
for row in ws.rows:
for cell in row:
' 각 cell 에 대해서 정렬
cell.alignment = Alignment(horizontal="center", vertical="center")
' center, left, right, top, bottom
if cell.column == 1: ' A 번호열은 제외
continue
' cell 이 정수형 데이터이고 90 점보다 높으면
if isinstance(cell.value, int) and cell.value > 90:
cell.fill = PatternFill(fgColor="00FF00", fill_type="solid") ' 배경을 초록색으로 설정
cell.font = Font(color="FF0000") ' 폰트 색상 변경
' 틀 고정
ws.freeze_panes = "B2" ' B2 기준으로 틀 고정
wb.save("sample_style.xlsx")
12 Formula (Cell계산)
import datetime
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws["A1"] = datetime.datetime.today() ' 오늘 날짜 정보
ws["A2"] = "=SUM(1, 2, 3)" ' 1 + 2 + 3 = 6 (합계)
ws["A3"] = "=AVERAGE(1, 2, 3)" ' 6 (평균)
ws["A4"] = 10
ws["A5"] = 20
ws["A6"] = "=SUM(A4:A5)" ' 30
wb.save("sample_formula.xlsx")
13 Formula Dataonly(계산된 함수가 아니라 계산된 값을 출력하기)
참고로 실행 후 엑셀 파일 열어서 저장 후 다시 실행하면 계산된 Cell값이 출력되는걸 확인 할 수 있다.
from openpyxl import load_workbook
' wb = load_workbook("sample_formula.xlsx")
' ws = wb.active
' ' 수식 그대로 가져오고 있음
' for row in ws.values:
' for cell in row:
' print(cell)
wb = load_workbook("sample_formula.xlsx", data_only=True)
ws = wb.active
' 수식이 아닌 실제 데이터를 가지고 옴
' evaluate 되지 않은 상태의 데이터는 None 이라고 표시
for row in ws.values:
for cell in row:
print(cell)
14 Cell merge
from openpyxl import Workbook
from openpyxl.styles import Alignment
wb = Workbook()
ws = wb.active
' 병합하기
ws.merge_cells("B2:D2") ' B2 부터 D2 까지 합치겠음
ws["B2"].value = "Merged Cell"
cel = ws["B2"]
cel.alignment = Alignment(horizontal="center", vertical="center")
wb.save("sample_merge.xlsx")
15 Cell unmerge
from openpyxl import load_workbook
wb = load_workbook("sample_merge.xlsx")
ws = wb.active
' B2:D2 병합되어 있던 셀을 해제
ws.unmerge_cells("B2:D2")
wb.save("sample_unmerge.xlsx")
16 Excel에 이미지 추가 Pillow 라이브러리 필요하므로
(pip install Pillow) 로 설치하여 주어야 한다.
from openpyxl import Workbook
from openpyxl.drawing.image import Image
wb = Workbook()
ws = wb.active
img = Image("sample.png")
' C3 위치에 img.png 파일의 이미지를 삽입
ws.add_image(img, "C3")
wb.save("sample_image.xlsx")
' ImportError : You must install Pillow to fetch image....
원글: https://www.youtube.com/watch?v=exgO1LFl9x8