์์ ์๋ํ
Python์ openpyxl ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด Excel ํ์ผ์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์์ฑํ๊ณ ํธ์งํ ์ ์์ต๋๋ค. ๋ฐ๋ณต์ ์ธ ๋ฐ์ดํฐ ์
๋ ฅ, ๋ณด๊ณ ์ ์์ฑ, ๋ฐ์ดํฐ ๋ถ์ ๋ฑ์ ์๋ํํด๋ณด๊ฒ ์ต๋๋ค.
์ค์นํ๊ธฐโ
# openpyxl ์ค์น
pip install openpyxl
# ์ฐจํธ ๊ธฐ๋ฅ๊น์ง ์ฌ์ฉํ๋ ค๋ฉด
pip install openpyxl[charts]
๊ธฐ๋ณธ ์์ โ
์ํฌ๋ถ ์์ฑ ๋ฐ ์ ์ฅโ
from openpyxl import Workbook
# ์ ์ํฌ๋ถ ์์ฑ
wb = Workbook()
# ํ์ฑ ์ํธ ๊ฐ์ ธ์ค๊ธฐ
ws = wb.active
# ์ํธ ์ด๋ฆ ๋ณ๊ฒฝ
ws.title = "๋งค์ถ ๋ฐ์ดํฐ"
# ์
์ ๊ฐ ์ฐ๊ธฐ
ws['A1'] = "์๋
ํ์ธ์"
ws['B1'] = 42
ws['C1'] = 3.14
# ํ์ผ ์ ์ฅ
wb.save('example.xlsx')
๊ธฐ์กด ํ์ผ ์ฝ๊ธฐโ
from openpyxl import load_workbook
# ์์
ํ์ผ ์ด๊ธฐ
wb = load_workbook('example.xlsx')
# ์ํธ ์ด๋ฆ ๋ชฉ๋ก
print(wb.sheetnames) # ['๋งค์ถ ๋ฐ์ดํฐ', 'Sheet2']
# ํน์ ์ํธ ์ ํ
ws = wb['๋งค์ถ ๋ฐ์ดํฐ']
# ๋๋ ํ์ฑ ์ํธ
ws = wb.active
# ์
๊ฐ ์ฝ๊ธฐ
value = ws['A1'].value
print(value)
์ ๋ค๋ฃจ๊ธฐโ
์ ์ ๊ทผ ๋ฐฉ๋ฒโ
# ๋ฐฉ๋ฒ 1: ์
์ขํ ์ฌ์ฉ
ws['A1'] = "์ด๋ฆ"
# ๋ฐฉ๋ฒ 2: row, column ์ธ๋ฑ์ค ์ฌ์ฉ (1๋ถํฐ ์์)
ws.cell(row=1, column=1).value = "์ด๋ฆ"
ws.cell(row=1, column=2).value = "๋์ด"
# ์
๊ฐ ์ฝ๊ธฐ
name = ws['A1'].value
age = ws.cell(row=1, column=2).value
์ฌ๋ฌ ์ ์ ๋ฐ์ดํฐ ์ฐ๊ธฐโ
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
# ํ ๋จ์๋ก ๋ฐ์ดํฐ ์ถ๊ฐ
data = [
["์ด๋ฆ", "๋์ด", "์ง์
"],
["๊น์ฒ ์", 30, "๊ฐ๋ฐ์"],
["์ด์ํฌ", 28, "๋์์ด๋"],
["๋ฐ๋ฏผ์", 35, "๊ธฐํ์"]
]
for row in data:
ws.append(row)
wb.save('์ง์๋ช
๋จ.xlsx')
๋ฒ์๋ก ์ ์ฝ๊ธฐโ
# ํน์ ๋ฒ์ ์ฝ๊ธฐ
for row in ws['A1:C4']:
for cell in row:
print(cell.value, end='\t')
print()
# ๋ชจ๋ ํ ์ํ
for row in ws.iter_rows(min_row=2, values_only=True):
print(row)
# ๋ชจ๋ ์ด ์ํ
for col in ws.iter_cols(min_col=1, max_col=3, values_only=True):
print(col)
# ํน์ ๋ฒ์์ ๊ฐ๋ง ๊ฐ์ ธ์ค๊ธฐ
for row in ws.iter_rows(min_row=2, max_row=5, min_col=1, max_col=3, values_only=True):
name, age, job = row
print(f"{name}: {age}์ธ, {job}")
์ ์คํ์ผ๋งโ
ํฐํธ ์คํ์ผโ
from openpyxl.styles import Font
# ๊ตต๊ฒ, ํฌ๊ธฐ, ์์
ws['A1'].font = Font(
name='๋ง์ ๊ณ ๋',
size=14,
bold=True,
italic=False,
color='FF0000' # ๋นจ๊ฐ์ (RGB ํฅ์ค)
)
์ ๋ฐฐ๊ฒฝ์โ
from openpyxl.styles import PatternFill
# ๋ฐฐ๊ฒฝ์ ์ฑ์ฐ๊ธฐ
ws['A1'].fill = PatternFill(
start_color='FFFF00', # ๋
ธ๋์
end_color='FFFF00',
fill_type='solid'
)
ํ ๋๋ฆฌโ
from openpyxl.styles import Border, Side
# ํ
๋๋ฆฌ ์คํ์ผ
thin_border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
ws['A1'].border = thin_border
์ ๋ ฌโ
from openpyxl.styles import Alignment
# ๊ฐ์ด๋ฐ ์ ๋ ฌ
ws['A1'].alignment = Alignment(
horizontal='center',
vertical='center',
wrap_text=True # ํ
์คํธ ์ค๋ฐ๊ฟ
)
์ซ์ ํ์โ
# ํตํ ํ์
ws['B2'].number_format = '#,##0์'
# ๋ฐฑ๋ถ์จ
ws['C2'].number_format = '0.00%'
# ๋ ์ง
ws['D2'].number_format = 'yyyy-mm-dd'
# ์์์
ws['E2'].number_format = '0.00'
์์ ์ฌ์ฉํ๊ธฐโ
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
# ๋ฐ์ดํฐ ์
๋ ฅ
ws['A1'] = "์ํ"
ws['B1'] = "๋จ๊ฐ"
ws['C1'] = "์๋"
ws['D1'] = "ํฉ๊ณ"
ws['A2'] = "์ฌ๊ณผ"
ws['B2'] = 1000
ws['C2'] = 5
# ์์ ์
๋ ฅ (B2 * C2)
ws['D2'] = "=B2*C2"
# SUM ํจ์
ws['A10'] = "์ดํฉ"
ws['D10'] = "=SUM(D2:D9)"
# ํ๊ท
ws['A11'] = "ํ๊ท "
ws['D11'] = "=AVERAGE(D2:D9)"
# IF ํจ์
ws['E2'] = "=IF(D2>5000, '๊ณ ๊ฐ', '์ ๊ฐ')"
wb.save('์์์์ .xlsx')
์ฐจํธ ๋ง๋ค๊ธฐโ
๋ง๋ ์ฐจํธโ
from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference
wb = Workbook()
ws = wb.active
# ๋ฐ์ดํฐ ์
๋ ฅ
data = [
["์", "๋งค์ถ"],
["1์", 1000],
["2์", 1500],
["3์", 1200],
["4์", 1800],
]
for row in data:
ws.append(row)
# ์ฐจํธ ์์ฑ
chart = BarChart()
chart.title = "์๋ณ ๋งค์ถ"
chart.x_axis.title = "์"
chart.y_axis.title = "๋งค์ถ (๋ง์)"
# ๋ฐ์ดํฐ ๋ฒ์ ์ค์
data_ref = Reference(ws, min_col=2, min_row=1, max_row=5)
categories = Reference(ws, min_col=1, min_row=2, max_row=5)
chart.add_data(data_ref, titles_from_data=True)
chart.set_categories(categories)
# ์ฐจํธ ์ถ๊ฐ
ws.add_chart(chart, "D2")
wb.save('์ฐจํธ์์ .xlsx')
์ ์ฐจํธโ
from openpyxl.chart import LineChart, Reference
# ์ ์ฐจํธ ์์ฑ
chart = LineChart()
chart.title = "์ฃผ๊ฐ ๋ฐฉ๋ฌธ์ ์"
chart.style = 10
chart.y_axis.title = '๋ฐฉ๋ฌธ์'
chart.x_axis.title = '์์ผ'
data_ref = Reference(ws, min_col=2, min_row=1, max_col=3, max_row=8)
chart.add_data(data_ref, titles_from_data=True)
categories = Reference(ws, min_col=1, min_row=2, max_row=8)
chart.set_categories(categories)
ws.add_chart(chart, "E2")
์ ์ฐจํธโ
from openpyxl.chart import PieChart, Reference
chart = PieChart()
chart.title = "ํ๋งค ๋น์จ"
data_ref = Reference(ws, min_col=2, min_row=1, max_row=5)
labels = Reference(ws, min_col=1, min_row=2, max_row=5)
chart.add_data(data_ref, titles_from_data=True)
chart.set_categories(labels)
ws.add_chart(chart, "D2")
์ค์ ์์ โ
1. ์๋ ๋งค์ถ ๋ณด๊ณ ์ ์์ฑโ
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.chart import BarChart, Reference
from datetime import datetime
def create_sales_report(sales_data, filename):
"""๋งค์ถ ๋ณด๊ณ ์ ์๋ ์์ฑ"""
wb = Workbook()
ws = wb.active
ws.title = "๋งค์ถ ํํฉ"
# ์ ๋ชฉ
ws['A1'] = "์๊ฐ ๋งค์ถ ๋ณด๊ณ ์"
ws['A1'].font = Font(size=16, bold=True)
ws['A1'].alignment = Alignment(horizontal='center')
ws.merge_cells('A1:E1')
# ์์ฑ์ผ
ws['A2'] = f"์์ฑ์ผ: {datetime.now().strftime('%Y-%m-%d')}"
# ํค๋
headers = ["์ ํ๋ช
", "ํ๋งค์๋", "๋จ๊ฐ", "๋งค์ถ์ก", "๋น๊ณ "]
ws.append([]) # ๋น ํ
ws.append(headers)
# ํค๋ ์คํ์ผ
header_fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid')
header_font = Font(color='FFFFFF', bold=True)
for col in range(1, 6):
cell = ws.cell(row=4, column=col)
cell.fill = header_fill
cell.font = header_font
cell.alignment = Alignment(horizontal='center')
# ๋ฐ์ดํฐ ์
๋ ฅ
total_sales = 0
for item in sales_data:
product, quantity, price = item
sales = quantity * price
total_sales += sales
remark = "๋ชฉํ๋ฌ์ฑ" if sales >= 1000000 else "๋
ธ๋ ฅํ์"
ws.append([product, quantity, price, sales, remark])
# ๋ฐ์ดํฐ ์คํ์ผ
thin_border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
for row in ws.iter_rows(min_row=4, max_row=ws.max_row, min_col=1, max_col=5):
for cell in row:
cell.border = thin_border
cell.alignment = Alignment(horizontal='center')
# ์ซ์ ํ์
for row in range(5, ws.max_row + 1):
ws.cell(row=row, column=2).number_format = '#,##0' # ์๋
ws.cell(row=row, column=3).number_format = '#,##0์' # ๋จ๊ฐ
ws.cell(row=row, column=4).number_format = '#,##0์' # ๋งค์ถ์ก
# ํฉ๊ณ ํ
total_row = ws.max_row + 1
ws.cell(row=total_row, column=1).value = "์ด ๋งค์ถ"
ws.cell(row=total_row, column=4).value = f"=SUM(D5:D{ws.max_row})"
ws.cell(row=total_row, column=1).font = Font(bold=True)
ws.cell(row=total_row, column=4).font = Font(bold=True)
ws.cell(row=total_row, column=4).fill = PatternFill(
start_color='FFC000', end_color='FFC000', fill_type='solid'
)
# ์ฐจํธ ์ถ๊ฐ
chart = BarChart()
chart.title = "์ ํ๋ณ ๋งค์ถ ํํฉ"
chart.y_axis.title = '๋งค์ถ์ก (์)'
data_ref = Reference(ws, min_col=4, min_row=4, max_row=ws.max_row - 1)
categories = Reference(ws, min_col=1, min_row=5, max_row=ws.max_row - 1)
chart.add_data(data_ref, titles_from_data=True)
chart.set_categories(categories)
ws.add_chart(chart, "G4")
# ์ด ๋๋น ์กฐ์
ws.column_dimensions['A'].width = 15
ws.column_dimensions['B'].width = 12
ws.column_dimensions['C'].width = 12
ws.column_dimensions['D'].width = 15
ws.column_dimensions['E'].width = 12
wb.save(filename)
print(f"๋ณด๊ณ ์ ์์ฑ ์๋ฃ: {filename}")
# ์ฌ์ฉ ์์
sales_data = [
("๋
ธํธ๋ถ", 15, 1200000),
("๋ง์ฐ์ค", 50, 25000),
("ํค๋ณด๋", 30, 80000),
("๋ชจ๋ํฐ", 20, 350000),
("ํค๋์
", 25, 120000)
]
create_sales_report(sales_data, "๋งค์ถ๋ณด๊ณ ์.xlsx")
2. ์ฌ๋ฌ ์์ ํ์ผ ํตํฉโ
from openpyxl import Workbook, load_workbook
import os
def merge_excel_files(folder_path, output_file):
"""์ฌ๋ฌ ์์
ํ์ผ์ ํ๋๋ก ํตํฉ"""
wb_output = Workbook()
ws_output = wb_output.active
ws_output.title = "ํตํฉ ๋ฐ์ดํฐ"
# ํค๋๋ฅผ ํ ๋ฒ๋ง ์ถ๊ฐํ๊ธฐ ์ํ ํ๋๊ทธ
header_written = False
# ํด๋ ๋ด ๋ชจ๋ ์์
ํ์ผ ์ฒ๋ฆฌ
for filename in os.listdir(folder_path):
if not filename.endswith(('.xlsx', '.xls')):
continue
file_path = os.path.join(folder_path, filename)
print(f"์ฒ๋ฆฌ ์ค: {filename}")
try:
wb = load_workbook(file_path)
ws = wb.active
# ๋ฐ์ดํฐ ๋ณต์ฌ
for i, row in enumerate(ws.iter_rows(values_only=True), 1):
# ์ฒซ ๋ฒ์งธ ํ์ผ์ ํค๋๋ง ํฌํจ
if i == 1:
if not header_written:
ws_output.append(row)
header_written = True
else:
ws_output.append(row)
except Exception as e:
print(f"์ค๋ฅ ({filename}): {e}")
wb_output.save(output_file)
print(f"\nํตํฉ ์๋ฃ: {output_file}")
print(f"์ด ํ ์: {ws_output.max_row}")
# ์ฌ์ฉ ์์
merge_excel_files('/Users/username/๋ถ๊ธฐ๋ณ๋ฐ์ดํฐ', 'ํตํฉ๋ฐ์ดํฐ.xlsx')
3. ์ก์ฅ ์๋ ์์ฑโ
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, Border, Side
from datetime import datetime
def create_invoice(invoice_data, filename):
"""์ก์ฅ ์๋ ์์ฑ"""
wb = Workbook()
ws = wb.active
# ํ์ฌ ์ ๋ณด
ws['A1'] = "์ฃผ์ํ์ฌ ํ
ํฌ์๋ฃจ์
"
ws['A1'].font = Font(size=18, bold=True)
ws['A2'] = "์์ธ์ ๊ฐ๋จ๊ตฌ ํ
ํค๋๋ก 123"
ws['A3'] = "Tel: 02-1234-5678"
ws['A4'] = "์ฌ์
์๋ฒํธ: 123-45-67890"
# ์ก์ฅ ์ ๋ชฉ
ws['A6'] = "๊ฑฐ ๋ ๋ช
์ธ ์"
ws['A6'].font = Font(size=16, bold=True)
ws['A6'].alignment = Alignment(horizontal='center')
ws.merge_cells('A6:F6')
# ๊ณ ๊ฐ ์ ๋ณด
ws['A8'] = "๋ฐ๋ ๋ถ:"
ws['B8'] = invoice_data['customer_name']
ws['A9'] = "๋ ์ง:"
ws['B9'] = datetime.now().strftime('%Y๋
%m์ %d์ผ')
ws['A10'] = "์ก์ฅ๋ฒํธ:"
ws['B10'] = invoice_data['invoice_number']
# ํ
์ด๋ธ ํค๋
headers = ["๋ฒํธ", "ํ๋ชฉ", "์๋", "๋จ๊ฐ", "๊ธ์ก", "๋น๊ณ "]
ws.append([]) # ๋น ํ
ws.append(headers)
# ํค๋ ์คํ์ผ
header_row = 12
for col in range(1, 7):
cell = ws.cell(row=header_row, column=col)
cell.font = Font(bold=True)
cell.alignment = Alignment(horizontal='center')
# ํ๋ชฉ ๋ฐ์ดํฐ
total = 0
for i, item in enumerate(invoice_data['items'], 1):
product, quantity, price, note = item
amount = quantity * price
total += amount
ws.append([i, product, quantity, price, amount, note])
# ์ซ์ ํ์
row = ws.max_row
ws.cell(row=row, column=3).number_format = '#,##0'
ws.cell(row=row, column=4).number_format = '#,##0์'
ws.cell(row=row, column=5).number_format = '#,##0์'
# ํ
๋๋ฆฌ
thin_border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
for row in ws.iter_rows(min_row=12, max_row=ws.max_row, min_col=1, max_col=6):
for cell in row:
cell.border = thin_border
cell.alignment = Alignment(horizontal='center')
# ํฉ๊ณ
ws.append([])
total_row = ws.max_row + 1
ws.cell(row=total_row, column=4).value = "ํฉ๊ณ"
ws.cell(row=total_row, column=5).value = total
ws.cell(row=total_row, column=4).font = Font(bold=True, size=12)
ws.cell(row=total_row, column=5).font = Font(bold=True, size=12)
ws.cell(row=total_row, column=5).number_format = '#,##0์'
# VAT (10%)
vat_row = total_row + 1
vat = total * 0.1
ws.cell(row=vat_row, column=4).value = "VAT (10%)"
ws.cell(row=vat_row, column=5).value = vat
ws.cell(row=vat_row, column=5).number_format = '#,##0์'
# ์ด์ก
grand_total_row = vat_row + 1
ws.cell(row=grand_total_row, column=4).value = "์ด์ก"
ws.cell(row=grand_total_row, column=5).value = total + vat
ws.cell(row=grand_total_row, column=4).font = Font(bold=True, size=14)
ws.cell(row=grand_total_row, column=5).font = Font(bold=True, size=14)
ws.cell(row=grand_total_row, column=5).number_format = '#,##0์'
# ์ด ๋๋น
ws.column_dimensions['A'].width = 8
ws.column_dimensions['B'].width = 20
ws.column_dimensions['C'].width = 10
ws.column_dimensions['D'].width = 12
ws.column_dimensions['E'].width = 15
ws.column_dimensions['F'].width = 15
wb.save(filename)
print(f"์ก์ฅ ์์ฑ ์๋ฃ: {filename}")
# ์ฌ์ฉ ์์
invoice_data = {
'customer_name': '(์ฃผ)๊ธ๋ก๋ฒํ
ํฌ',
'invoice_number': 'INV-2024-001',
'items': [
("์น ์ฌ์ดํธ ๊ฐ๋ฐ", 1, 5000000, "๋ฉ์ธ ํ๋ก์ ํธ"),
("์ ์ง๋ณด์ (1๊ฐ์)", 1, 500000, "์๊ฐ"),
("๋๋ฉ์ธ ๋ฑ๋ก", 1, 15000, "์ฐ๊ฐ"),
("ํธ์คํ
", 12, 30000, "์๊ฐ")
]
}
create_invoice(invoice_data, "์ก์ฅ_2024_001.xlsx")
4. ๋ฐ์ดํฐ ๋ถ์ ๋ฐ ํผ๋ฒ ํ ์ด๋ธโ
from openpyxl import Workbook
from collections import defaultdict
def create_sales_analysis(raw_data, filename):
"""๋งค์ถ ๋ฐ์ดํฐ ๋ถ์ ๋ฐ ์์ฝ"""
wb = Workbook()
# ์๋ณธ ๋ฐ์ดํฐ ์ํธ
ws_raw = wb.active
ws_raw.title = "์๋ณธ ๋ฐ์ดํฐ"
# ํค๋
headers = ["๋ ์ง", "์ ํ", "์นดํ
๊ณ ๋ฆฌ", "์๋", "๋จ๊ฐ", "๋งค์ถ"]
ws_raw.append(headers)
# ๋ฐ์ดํฐ ์
๋ ฅ
for row in raw_data:
ws_raw.append(row)
# ์นดํ
๊ณ ๋ฆฌ๋ณ ์ง๊ณ
category_sales = defaultdict(int)
product_sales = defaultdict(int)
for row in raw_data:
date, product, category, quantity, price, sales = row
category_sales[category] += sales
product_sales[product] += sales
# ์นดํ
๊ณ ๋ฆฌ๋ณ ์์ฝ ์ํธ
ws_category = wb.create_sheet("์นดํ
๊ณ ๋ฆฌ๋ณ ๋งค์ถ")
ws_category.append(["์นดํ
๊ณ ๋ฆฌ", "๋งค์ถ์ก"])
for category, sales in sorted(category_sales.items(), key=lambda x: x[1], reverse=True):
ws_category.append([category, sales])
# ์ ํ๋ณ ์์ฝ ์ํธ
ws_product = wb.create_sheet("์ ํ๋ณ ๋งค์ถ")
ws_product.append(["์ ํ", "๋งค์ถ์ก"])
for product, sales in sorted(product_sales.items(), key=lambda x: x[1], reverse=True):
ws_product.append([product, sales])
# ์คํ์ผ ์ ์ฉ (๋ชจ๋ ์ํธ)
for ws in wb.worksheets:
# ํค๋ ์คํ์ผ
for cell in ws[1]:
cell.font = Font(bold=True)
# ์ซ์ ํ์
if ws.max_row > 1:
for row in range(2, ws.max_row + 1):
if ws.max_column >= 2:
ws.cell(row=row, column=ws.max_column).number_format = '#,##0์'
wb.save(filename)
print(f"๋ถ์ ์๋ฃ: {filename}")
# ์ฌ์ฉ ์์
sales_data = [
["2024-01-01", "๋
ธํธ๋ถ", "์ ์์ ํ", 2, 1200000, 2400000],
["2024-01-02", "๋ง์ฐ์ค", "์ ์์ ํ", 5, 25000, 125000],
["2024-01-03", "์ฑ
์", "๊ฐ๊ตฌ", 3, 150000, 450000],
["2024-01-04", "์์", "๊ฐ๊ตฌ", 4, 80000, 320000],
["2024-01-05", "ํค๋ณด๋", "์ ์์ ํ", 3, 80000, 240000],
]
create_sales_analysis(sales_data, "๋งค์ถ๋ถ์.xlsx")
5. CSV to Excel ๋ณํ๊ธฐโ
import csv
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
def csv_to_excel(csv_file, excel_file):
"""CSV ํ์ผ์ ์คํ์ผ์ด ์ ์ฉ๋ Excel๋ก ๋ณํ"""
wb = Workbook()
ws = wb.active
# CSV ์ฝ๊ธฐ
with open(csv_file, 'r', encoding='utf-8') as f:
reader = csv.reader(f)
for i, row in enumerate(reader, 1):
ws.append(row)
# ์ฒซ ํ ์คํ์ผ (ํค๋)
if i == 1:
for cell in ws[i]:
cell.font = Font(bold=True, color='FFFFFF')
cell.fill = PatternFill(
start_color='4472C4',
end_color='4472C4',
fill_type='solid'
)
# ์ด ๋๋น ์๋ ์กฐ์
for column in ws.columns:
max_length = 0
column_letter = column[0].column_letter
for cell in column:
if cell.value:
max_length = max(max_length, len(str(cell.value)))
adjusted_width = min(max_length + 2, 50)
ws.column_dimensions[column_letter].width = adjusted_width
wb.save(excel_file)
print(f"๋ณํ ์๋ฃ: {csv_file} -> {excel_file}")
# ์ฌ์ฉ ์์
csv_to_excel('data.csv', 'data.xlsx')
์์ฃผ ๋ฌป๋ ์ง๋ฌธโ
Q1. .xls ํ์ผ๋ ์ฝ์ ์ ์๋์?โ
A: openpyxl์ .xlsx ์ ์ฉ์
๋๋ค. .xls ํ์ผ์ xlrd ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ธ์.
# .xls ํ์ผ ์ฝ๊ธฐ
import xlrd
workbook = xlrd.open_workbook('old_file.xls')
sheet = workbook.sheet_by_index(0)
# ์
๊ฐ ์ฝ๊ธฐ
value = sheet.cell_value(0, 0)
Q2. ๋์ฉ๋ ์์ ํ์ผ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์?โ
A: read_only=True์ write_only=True ๋ชจ๋๋ฅผ ์ฌ์ฉํ์ธ์.
# ์ฝ๊ธฐ ์ ์ฉ ๋ชจ๋ (๋ฉ๋ชจ๋ฆฌ ํจ์จ์ )
wb = load_workbook('large_file.xlsx', read_only=True)
# ์ฐ๊ธฐ ์ ์ฉ ๋ชจ๋
wb = Workbook(write_only=True)
ws = wb.create_sheet()
for row in data:
ws.append(row)
wb.save('output.xlsx')
Q3. ๊ธฐ์กด ์์ ํ์ผ์ ์์ ํ๋ฉด ์์์ด ์ฌ๋ผ์ ธ์.โ
A: openpyxl์ ์ผ๋ถ ๊ณ ๊ธ ์์์ ๋ณด์กดํ์ง ๋ชปํ ์ ์์ต๋๋ค. ์ค์ํ ์์์ ๋ฐฑ์
ํ๊ณ ์์
ํ์ธ์.
# ํ์ผ ๋ณต์ฌ๋ณธ ๋ง๋ค๊ธฐ
import shutil
shutil.copy('original.xlsx', 'backup.xlsx')
# ๋ณต์ฌ๋ณธ ์์
wb = load_workbook('original.xlsx')
# ... ์์
...
wb.save('original.xlsx')
Q4. ์ฌ๋ฌ ์ํธ๋ฅผ ํ ๋ฒ์ ์์ ํ ์ ์๋์?โ
A: ๋ค, ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋ชจ๋ ์ํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
wb = load_workbook('workbook.xlsx')
for sheet_name in wb.sheetnames:
ws = wb[sheet_name]
print(f"์ฒ๋ฆฌ ์ค: {sheet_name}")
# ๊ฐ ์ํธ ์์
for row in ws.iter_rows(values_only=True):
print(row)