- 업무 자동화(RPA : Robotic Process Automation) : 사람이 반복적으로 수행하는 규칙적이고 단순한 업무를 소프트웨어 로봇(봇)을 통해 자동화하는 기술
pip install openpyxl
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
wb.close()
from openpyxl import Workbook
wb = Workbook()
ws = wb.create_sheet()
ws.title = "MySheet"
ws.sheet_properties.tabColor = "ff66ff"
ws1 = wb.create_sheet("YourSheet")
ws2 = wb.create_sheet("OurSheet", 2) # 생성 위치 지정
new_ws = wb["OurSheet"] # dictionary 형태로 sheet에 접근
new_ws["A1"] = "Test"
target = wb.copy_worksheet(new_ws)
target.title = "Copied Sheet"
wb.save("example.xlsx")

from openpyxl import Workbook
wb = Workbook()
ws = wb.active
# 작업 부분
ws.title = "example"
wb.save("example.xlsx")
wb.close()
from openpyxl import load_workbook
wb = load_workbook("example.xlsx")
ws = wb.active
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title= "cell"
ws["A1"] = 1
ws["A1"] = 2
ws["A1"] = 3
ws["B1"] = 11
ws["B2"] = 21
ws["B3"] = 31
ws.cell(column=3, row=1, value=111)
print(ws["A1"])
print(ws.cell(column=1, row=1))
print(ws["A1"].value)
print(ws.cell(column=1, row=1).value)
print(ws["A10"].value)
wb.save("example.xlsx")
![]() | Cell 객체, Cell 객체 값, None(내용이 없을 때)를 출력 |
|---|
- 예제1 : 반복문으로 랜덤 숫자로 셀 채우고 파일을 불러 와서 출력해보기
from openpyxl import Workbook
from random import *
wb = Workbook()
ws = wb.active
ws.title= "cell"
for x in range(1, 11):
for y in range(1, 11):
ws.cell(column=y, row=x, value=randint(0, 100))
wb.save("example.xlsx")
from openpyxl import load_workbook
wb = load_workbook("example.xlsx")
ws = wb.active
for x in range(1, ws.max_row):
for y in range(1, ws.max_column):
print(ws.cell(row=x, column=y).value, end=" ")
print()


- 영어 성적만 가지고 오기(한 열 지정)
from openpyxl import Workbook
from random import *
wb = Workbook()
ws = wb.active
ws.append(["번호", "영어", "수학"])
for i in range(1, 11):
ws.append([i, randint(0, 100), randint(0, 100)])
col_b = ws["B"]
for cell in col_b :
print(cell.value)
wb.save("example.xlsx")

- 영어 및 수학 성적 가지고 오기(여러 열 지정)
from openpyxl import Workbook
from random import *
wb = Workbook()
ws = wb.active
ws.append(["번호", "영어", "수학"])
for i in range(1, 11):
ws.append([i, randint(0, 100), randint(0, 100)])
col_range = ws["B:C"]
for cols in col_range:
for cell in cols:
print(cell.value)
wb.save("example.xlsx")

- 문서의 앞 부분만 가지고 오기(한 행 선택하기)
from openpyxl import Workbook
from random import *
wb = Workbook()
ws = wb.active
ws.append(["번호", "영어", "수학"])
for i in range(1, 11):
ws.append([i, randint(0, 100), randint(0, 100)])
row_title = ws[1]
for cell in row_title:
print(cell.value)
wb.save("example.xlsx")

- 모든 학생의 성적 데이터 가지고 오기(여러 행 선택하기)
from openpyxl import Workbook
from random import *
wb = Workbook()
ws = wb.active
ws.append(["번호", "영어", "수학"])
for i in range(1, 11):
ws.append([i, randint(0, 100), randint(0, 100)])
row_range = ws[2:ws.max_row]
for row in row_range:
for cell in row:
print(cell.value, end=" ")
print()
wb.save("example.xlsx")

- 각 셀의 정보를 가지고 오기
from openpyxl import Workbook
from random import *
from openpyxl.utils.cell import coordinate_from_string
wb = Workbook()
ws = wb.active
ws.append(["번호", "영어", "수학"])
for i in range(1, 11):
ws.append([i, randint(0, 100), randint(0, 100)])
row_range = ws[1:ws.max_row]
for row in row_range:
for cell in row:
print(cell.coordinate, end=" ")
xy = coordinate_from_string(cell.coordinate)
print(xy[0], end="")
print(xy[1], end=" ")
print()
wb.save("example.xlsx")

- 행과 열을 지정하는 방법
from openpyxl import Workbook
from random import *
from openpyxl.utils.cell import coordinate_from_string
wb = Workbook()
ws = wb.active
ws.append(["번호", "영어", "수학"])
for i in range(1, 11):
ws.append([i, randint(0, 100), randint(0, 100)])
# method 1
for row in tuple(ws.rows):
print(row)
print(row[1].value)
for column in tuple(ws.columns):
print(column)
print(column[0].value)
# method 2
for row in ws.iter_rows():
print(row)
print(row[1].value)
for column in ws.iter_cols():
print(column)
print(column[0].value)
# therefore
for row in ws.iter_rows(min_row=2, max_row=11, min_col=2, max_col=3):
print(row[1].value)
print(" ")
for col in ws.iter_cols(min_row=1, max_row=5, min_col=1, max_col=3):
print(col[1].value)
wb.save("example.xlsx")
방법 1 : tuple을 이용하는 방법
- tuple(obj.rows) : 행들의 정보를 한 줄씩 tuple 형태로 묶어서 가지고 옴
- tuple(obj.cols) : 열들의 정보를 한 줄씩 tuple 형태로 묶어서 가지고 옴
방법 2 : iter_rows(), iter_cols() 사용하는 방법
- iter_rows(min_row, max_row, min_col, max_col) : 해당 범위 내의 행의 정보를 가지고 옴
- iter_cols(min_row, max_row, min_col, max_col) : 해당 범위 내의 열의 정보를 가지고 옴
※ 해당 방법은 범위를 지정해줄 수 있기 때문에 해당 방법 사용이 좋음
row 실행 결과 | col 실행 결과 | iter를 이용하여 특정 범위를 출력 |
|---|
from openpyxl import load_workbook
wb = load_workbook("example.xlsx")
ws = wb.active
ws.insert_rows(8)
ws.insert_cols(2, 3)
wb.save("example_insert.xlsx")
전 | 후 |
|---|
from openpyxl import load_workbook
wb = load_workbook("example.xlsx")
ws = wb.active
ws.delete_rows(8, 3)
ws.delete_cols(2)
wb.save("example_delete_row.xlsx")
전 | 후 |
|---|
- 국어 성적을 영어 왼쪽으로 추가하기
from openpyxl import load_workbook
from random import *
wb = load_workbook("example.xlsx")
ws = wb.active
ws.move_range("B1:C11", rows=0, cols=1)
ws["B1"].value = "국어"
for i in range(2, ws.max_row + 1):
ws[f"B{i}"].value = randint(0, 100)
wb.save("example_move.xlsx")
전 | 후 |
|---|
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.merge_cells('B2:D2')
ws['B2'].value = "merged cell"
wb.save("sample_merge.xlsx")

from openpyxl import load_workbook
wb = load_workbook("sample_merge.xlsx")
ws = wb.active
ws.unmerge_cells('B2:D2')
wb.save("sample_merge.xlsx")

성적 정보 (example.xlsx) |
|---|
- 영어 점수가 80점 이상의 학생을 영어 경시대회에 출전하게 하도록 명단을 추리기
from openpyxl import load_workbook
wb = load_workbook("example.xlsx")
ws = wb.active
for row in ws.iter_rows(min_row=2):
if int(row[1].value) >= 80:
print(row[0].value, "번 학생은 영어 장학생입니다.")

- 영어 점수는 사실 생명과학 점수이기 때문에 수정 하기
from openpyxl import load_workbook
wb = load_workbook("example.xlsx")
ws = wb.active
for row in ws.iter_rows(max_row=1):
for cell in row:
if cell.value == "영어":
cell.value = "생명과학"
wb.save("example.xlsx")
import datetime
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws['A1'] = datetime.datetime.today()
ws['A2'] = "=SUM(1, 2, 3)"
ws["A3"] = "=Average(1, 2, 3)"
ws["A4"] = 10
ws["A5"] = 20
ws["A6"] = "=AVERAGE(A4:A5)"
wb.save("calc.xlsx")

from openpyxl import load_workbook
wb = load_workbook("calc.xlsx")
ws = wb.active
for row in ws.values:
for cell in row:
print(cell)

from openpyxl import load_workbook
# 수식이 아닌 실제 데이터를 가지고 옴
# evaluate되지 않는 데이터는 None으로 표시됨
wb = load_workbook("calc.xlsx", data_only=True)
ws = wb.active
for row in ws.values:
for cell in row:
print(cell)
data_only : 수식이 아닌 데이터만 가져오는 여부 선택
다음과 같이 excel 함수를 입력한 셀의 값은 None값으로 출력함 (이는 evaluate되지 않는 데이터는 None으로 표시하기 때문임)

excel 파일에 들어가서 저장을 해야지 정상적으로 값이 나오게 된다. (이는 excel에서 저장을 해야 숫자 값으로 저장함

from openpyxl import load_workbook
from openpyxl.chart import BarChart, Reference
wb = load_workbook("example.xlsx")
ws = wb.active
line_value = Reference(ws, min_row=1, max_row=11, min_col=2, max_col=4)
line_chart = BarChart()
line_chart.add_data(line_value, titles_from_data=True)
line_chart.title = "Line Chart"
line_chart.style = 10
line_chart.y_axis.title = "Score"
line_chart.x_axis.title = "Student"
ws.add_chart(line_chart, "F1")
wb.save("example_chart.xlsx")

from openpyxl.styles import Font, Border, Side, PatternFill, Alignment
from openpyxl import load_workbook
wb = load_workbook("example.xlsx")
ws = wb.active
a1 = ws["A1"]
b1 = ws["B1"]
c1 = ws["C1"]
ws.column_dimensions["A"].width = 5
ws.row_dimensions[1].height = 50
wb.save("example_style.xlsx")

from openpyxl.styles import Font, Border, Side, PatternFill, Alignment
from openpyxl import load_workbook
wb = load_workbook("example.xlsx")
ws = wb.active
a1 = ws["A1"]
b1 = ws["B1"]
c1 = ws["C1"]
a1.font = Font(color="FF0000", italic=True, bold=True)
b1.font = Font(color="CC33FF", name="Arial", strike=True)
c1.font = Font(color="0000FF", size=20, underline="single")
wb.save("example_style.xlsx")

from openpyxl.styles import Font, Border, Side, PatternFill, Alignment
from openpyxl import load_workbook
wb = load_workbook("example.xlsx")
ws = wb.active
a1 = ws["A1"]
b1 = ws["B1"]
c1 = ws["C1"]
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
wb.save("example_style.xlsx")

from openpyxl.styles import Font, Border, Side, PatternFill, Alignment
from openpyxl import load_workbook
wb = load_workbook("example.xlsx")
ws = wb.active
a1 = ws["A1"]
b1 = ws["B1"]
c1 = ws["C1"]
for row in ws.rows:
for cell in row:
cell.alignment = Alignment(horizontal="center", vertical="center")
if cell.column == 1:
continue
if isinstance(cell.value, int) and cell.value > 80:
cell.fill = PatternFill(fgColor="00FF00", fill_type="solid")
cell.font = Font(color="FF0000")
wb.save("example_style.xlsx")

from openpyxl.styles import Font, Border, Side, PatternFill, Alignment
from openpyxl import load_workbook
wb = load_workbook("example.xlsx")
ws = wb.active
a1 = ws["A1"]
b1 = ws["B1"]
c1 = ws["C1"]
ws.freeze_panes = "B2"
wb.save("example_style.xlsx")

from openpyxl import Workbook
from openpyxl.drawing.image import Image
wb = Workbook()
ws = wb.active
img = Image('img.png')
ws.add_image(img, 'C3')
wb.save('image.xlsx')
Pillow를 install를 해야 실행됨 |
|---|
여기까진가..