[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




LIST

Copyright © 2014 visionboy.me All Right Reserved.