Lewati ke konten utama

openpyxl: Otomatiskan Tugas Excel dengan Python

Pelajari cara membaca, menulis, dan memformat file Excel menggunakan openpyxl. Temukan contoh praktis untuk bekerja dengan format Excel modern (.xlsx) dan fitur lanjutan.
Diperbarui 5 Jun 2026  · 8 mnt baca

openpyxl adalah pustaka Python yang efisien yang memungkinkan Anda membaca dan menulis file Excel dalam format berbasis XML modern (.xlsx, .xlsm) yang diperkenalkan di Excel 2007, dengan dukungan penuh untuk fitur lanjutan mulai dari Excel 2010. Pustaka ini awalnya dikembangkan sebagai port Python dari PHPExcel dan terus dipelihara oleh komunitas pengembang yang aktif. Pustaka ini unggul dalam otomasi data, pelaporan, dan alur kerja pemformatan, sehingga sangat berguna bagi pengguna yang perlu bekerja dengan file Excel tetapi tidak menginstal Excel di sistem mereka.

Banyak organisasi menggunakan openpyxl untuk mengotomatiskan laporan keuangan, membuat bagan dari ekspor basis data, serta menerapkan rumus dan pemformatan pada laporan pemasaran. Pustaka ini menawarkan kontrol terperinci atas file Excel sepenuhnya melalui kode Python.

Apa itu openpyxl?

openpyxl dirancang khusus untuk menyediakan dukungan native bagi format Excel 2010+. Pustaka ini bekerja dengan beberapa format file:

  •  .xlsx - Buku kerja Excel

  •  .xlsm - Buku kerja Excel dengan makro

  •  .xltx - Templat Excel

  •  .xltm - Templat Excel dengan makro

Salah satu keunggulan utama openpyxl adalah tidak memerlukan instalasi Excel di komputer Anda. Ini menjadikannya ideal untuk lingkungan server, sistem pelaporan terotomatisasi, dan pipeline pemrosesan data. Beberapa pustaka Python lainnya, termasuk pandas, menggunakan openpyxl sebagai antarmuka Excel mereka, yang menunjukkan keandalan dan fungsionalitasnya.

Menginstal dan Mengimpor openpyxl

Menginstal openpyxl sangat mudah menggunakan pip:

pip install openpyxl

Untuk keamanan yang lebih baik saat bekerja dengan file dari sumber yang tidak tepercaya, Anda juga dapat menginstal paket opsional defusedxml:

pip install defusedxml

Untuk menggunakan openpyxl dalam skrip Python Anda, impor kelas-kelas yang diperlukan:

from openpyxl import Workbook, load_workbook

Konsep dan Terminologi Utama

Untuk menggunakan openpyxl secara efektif, Anda perlu memahami struktur dasar Excel:

  • Workbook: File Excel itu sendiri, berisi satu atau lebih worksheet
  • Worksheet: Tab/lembar individual di dalam sebuah workbook
  • Cell: Titik data individual di sebuah worksheet, diidentifikasi oleh huruf kolom dan nomor baris (mis., "A1")
  • Row: Deret sel horizontal, diidentifikasi dengan angka (1, 2, 3...)
  • Column: Deret sel vertikal, diidentifikasi dengan huruf (A, B, C...)

Di openpyxl, Anda dapat mereferensikan sel menggunakan:

  • Referensi gaya Excel: sheet[“A1”]

  • Pengindeksan baris-kolom: sheet.cell(row=1, column=1) (Catatan: openpyxl menggunakan pengindeksan berbasis 1, bukan berbasis 0)

Membaca File Excel dengan openpyxl

Berikut contoh praktis yang menunjukkan cara membaca data dari file Excel:

Memuat dan menjelajah workbook

from openpyxl import load_workbook

# Load the workbook - use read_only=True for large files
wb = load_workbook('sample.xlsx', read_only=False, data_only=False)
# data_only=True reads values instead of formulas

Parameter opsional mengontrol bagaimana workbook dimuat:

  • read_only=True meningkatkan performa untuk file besar namun membatasi kemampuan pengeditan

  • data_only=True mengembalikan nilai hasil perhitungan alih-alih rumus

Iterasi data

Untuk memproses banyak sel secara efisien, gunakan metode iterasi:

# Iterate through rows
for row in sheet.iter_rows(min_row=1, max_row=5, values_only=True):
    print(row)  # Returns a tuple of values

# Iterate through columns
for column in sheet.iter_cols(min_col=1, max_col=3, values_only=True):
    print(column)  # Returns a tuple of values

# Access a range of cells
cell_range = sheet["A1:C5"]
for row in cell_range:
    for cell in row:
        print(cell.value)

Konversi ke struktur data Python

Anda dapat dengan mudah mengubah data Excel menjadi struktur data Python:

# Convert worksheet data to a list of dictionaries
def sheet_to_dict(sheet):
    data = []
    headers = [cell.value for cell in sheet[1]]  # First row as headers
    
    for row in sheet.iter_rows(min_row=2, values_only=True):
        row_data = {}
        for key, value in zip(headers, row):
            row_data[key] = value
        data.append(row_data)
    
    return data

# Example usage
data_dict = sheet_to_dict(sheet)
print(data_dict)

Membuat dan memodifikasi file Excel sama mudahnya dengan openpyxl.

Buat workbook dan tulis data dasar

from openpyxl import Workbook

# Create a new workbook
wb = Workbook()
sheet = wb.active

# Rename the sheet
sheet.title = "Data"

# Write values to cells
sheet["A1"] = "Name"
sheet["B1"] = "Age"
sheet["C1"] = "City"

# Add data
data = [
    ["Alice", 25, "New York"],
    ["Bob", 30, "San Francisco"],
    ["Charlie", 35, "Chicago"]
]

for row_idx, row_data in enumerate(data, start=2):
    for col_idx, cell_value in enumerate(row_data, start=1):
        sheet.cell(row=row_idx, column=col_idx, value=cell_value)

# Save the workbook
wb.save("new_workbook.xlsx")

Memodifikasi file Excel yang ada

from openpyxl import load_workbook

# Load an existing workbook
wb = load_workbook("existing_file.xlsx")
sheet = wb.active

# Modify cell values
sheet["D1"] = "Updated Data"
sheet.cell(row=5, column=2).value = 42

# Save to a new file (to preserve the original)
wb.save("modified_file.xlsx")

Menambahkan data secara dinamis

Metode .append() memudahkan penambahan baris baru:

from openpyxl import Workbook

wb = Workbook()
sheet = wb.active

# Add headers
sheet.append(["Date", "Product", "Quantity", "Price"])

# Add multiple rows of data
sales_data = [
    ["2025-04-01", "Laptop", 5, 1200],
    ["2025-04-01", "Mouse", 10, 25],
    ["2025-04-02", "Monitor", 3, 350]
]

for row in sales_data:
    sheet.append(row)

wb.save("sales_report.xlsx")

Pemformatan dan Styling di Excel

openpyxl menawarkan banyak opsi untuk pemformatan dan styling sel.

Menambahkan font, border, dan perataan

from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, Border, Side, PatternFill, NamedStyle

wb = Workbook()
sheet = wb.active

# Create a header style
header_style = NamedStyle(name="header_style")
header_style.font = Font(bold=True, size=12, color="FFFFFF")
header_style.fill = PatternFill(fill_type="solid", start_color="366092")
header_style.alignment = Alignment(horizontal="center", vertical="center")
header_style.border = Border(
    bottom=Side(border_style="medium", color="000000"),
    left=Side(border_style="thin"),
    right=Side(border_style="thin"),
    top=Side(border_style="thin")
)

# Add the style to the workbook
wb.add_named_style(header_style)

# Apply the style to header row
headers = ["ID", "Product", "Category", "Price"]
for col_idx, header in enumerate(headers, start=1):
    cell = sheet.cell(row=1, column=col_idx, value=header)
    cell.style = "header_style"

# Basic styling without named styles
sheet["A2"].font = Font(bold=True, italic=True)
sheet["A3"].alignment = Alignment(horizontal="center")
sheet["A4"].border = Border(bottom=Side(border_style="thin"))

wb.save("styled_workbook.xlsx")

Pemformatan bersyarat

Pemformatan bersyarat memungkinkan Anda menerapkan gaya berdasarkan nilai sel:

from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
from openpyxl.styles.differential import DifferentialStyle
from openpyxl.formatting.rule import Rule, ColorScaleRule

wb = Workbook()
sheet = wb.active

# Add sample data
for row in range(1, 11):
    for col in range(1, 5):
        sheet.cell(row=row, column=col, value=(row-1)*4 + col)

# Add color scale (green to red gradient)
color_scale = ColorScaleRule(
    start_type="min", start_color="63BE7B",  # Green
    mid_type="percentile", mid_value=50, mid_color="FFEB84",  # Yellow
    end_type="max", end_color="F8696B"  # Red
)
sheet.conditional_formatting.add("A1:D10", color_scale)

# Add a rule for values less than 5
red_text = Font(color="FF0000")
red_fill = PatternFill(start_color="FFCCCC", end_color="FFCCCC", fill_type="solid")
dxf = DifferentialStyle(font=red_text, fill=red_fill)
rule = Rule(type="cellIs", operator="lessThan", formula=["5"], dxf=dxf)
sheet.conditional_formatting.add("A1:D10", rule)

wb.save("conditional_format.xlsx")

Fitur Lanjutan

openpyxl mendukung banyak fitur lanjutan Excel yang membantu tugas spreadsheet yang kompleks.

Menambahkan rumus

from openpyxl import Workbook

wb = Workbook()
sheet = wb.active

# Add data
for row in range(1, 6):
    sheet.cell(row=row, column=1, value=row)

# Add formulas
sheet["B1"] = "=A1*2"
sheet["B2"] = "=A2*2"
sheet["C1"] = "=SUM(A1:A5)"
sheet["C2"] = "=AVERAGE(A1:A5)"
sheet["C3"] = "=COUNTIF(A1:A5,\">2\")"

wb.save("formulas.xlsx")

Catatan: Saat menggunakan load_workbook(), rumus tidak dihitung secara otomatis oleh openpyxl. Untuk melihat nilai hasil perhitungan, gunakan load_workbook(“file.xlsx”, data_only=True).  

Menyisipkan bagan

openpyxl dapat membuat berbagai jenis bagan:

from openpyxl import Workbook
from openpyxl.chart import BarChart, LineChart, Reference

wb = Workbook()
sheet = wb.active

# Add data
months = ["Jan", "Feb", "Mar", "Apr", "May"]
values = [30, 45, 37, 50, 62]

for i, (month, value) in enumerate(zip(months, values), start=1):
    sheet.cell(row=i, column=1, value=month)
    sheet.cell(row=i, column=2, value=value)

# Create a bar chart
bar_chart = BarChart()
bar_chart.title = "Monthly Sales"
bar_chart.x_axis.title = "Month"
bar_chart.y_axis.title = "Sales"

# Define the data range
data = Reference(sheet, min_col=2, min_row=1, max_row=5)
categories = Reference(sheet, min_col=1, min_row=1, max_row=5)

# Add the data to the chart
bar_chart.add_data(data)
bar_chart.set_categories(categories)

# Add the chart to the worksheet
sheet.add_chart(bar_chart, "D1")

# Create a line chart on the same data
line_chart = LineChart()
line_chart.title = "Monthly Sales Trend"
line_chart.add_data(data)
line_chart.set_categories(categories)
sheet.add_chart(line_chart, "D15")

wb.save("charts.xlsx")

Menyisipkan Gambar

from openpyxl import Workbook
from openpyxl.drawing.image import Image

wb = Workbook()
sheet = wb.active

# Add an image
img = Image("logo.png")

# Resize the image (optional)
img.width = 150
img.height = 75

# Add the image to cell A1
sheet.add_image(img, "A1")

wb.save("with_image.xlsx")

Catatan: Anda memerlukan pustaka Pillow terinstal untuk bekerja dengan gambar: pip install pillow

Manajemen Sheet, Row, dan Column

openpyxl menyediakan fungsi untuk mengelola struktur file Excel Anda:

Membuat dan menghapus sheet

from openpyxl import Workbook

wb = Workbook()

# Create new sheets
wb.create_sheet("Data")
wb.create_sheet("Summary", 0)  # Add at the beginning

# Remove a sheet
wb.remove(wb["Sheet"])  # Remove the default sheet

print(wb.sheetnames)  # ['Summary', 'Data']

wb.save("multiple_sheets.xlsx")

Mengganti nama sheet

wb = Workbook()
sheet = wb.active
sheet.title = "Sales Report"
wb.save("renamed_sheet.xlsx")

Menyalin worksheet

from openpyxl import Workbook

wb = Workbook()
source = wb.active
source.title = "Original"

# Add some data to copy
source["A1"] = "Test Data"

# Create a copy
wb.copy_worksheet(source)

# The copied sheet will have "Copy of Original" name
wb.save("copied_sheet.xlsx")

Menyisipkan dan menghapus baris serta kolom

from openpyxl import Workbook

wb = Workbook()
sheet = wb.active

# Add some data
for i in range(1, 6):
    for j in range(1, 4):
        sheet.cell(row=i, column=j, value=f"R{i}C{j}")

# Insert a row at position 2
sheet.insert_rows(2)

# Insert multiple rows
sheet.insert_rows(5, 3)  # Insert 3 rows at position 5

# Insert a column at position 2
sheet.insert_cols(2)

# Delete rows
sheet.delete_rows(7, 2)  # Delete 2 rows starting at row 7

# Delete columns
sheet.delete_cols(3)  # Delete column C

wb.save("modified_structure.xlsx")

Membekukan panel dan menambahkan filter

from openpyxl import Workbook

wb = Workbook()
sheet = wb.active

# Add headers
headers = ["ID", "Name", "Department", "Salary"]
for col_idx, header in enumerate(headers, start=1):
    sheet.cell(row=1, column=col_idx, value=header)

# Add data
data = [
    [1, "John Smith", "HR", 55000],
    [2, "Jane Doe", "IT", 65000],
    [3, "Bob Johnson", "Finance", 60000]
]
for row_idx, row_data in enumerate(data, start=2):
    for col_idx, value in enumerate(row_data, start=1):
        sheet.cell(row=row_idx, column=col_idx, value=value)

# Freeze the header row
sheet.freeze_panes = "A2"

# Add autofilter
sheet.auto_filter.ref = "A1:D4"

wb.save("freeze_and_filter.xlsx")

Keterbatasan dan Masukan Komunitas

Meskipun openpyxl kaya fitur, pengguna mencatat beberapa keterbatasan:

  • Dukungan terbatas untuk named range
  • Contoh dokumentasi bisa minim untuk fitur lanjutan
  • Performa dapat lambat untuk file yang sangat besar (meskipun mode read-only membantu)

Terlepas dari keterbatasan ini, openpyxl memiliki dukungan komunitas yang kuat. Isu dapat dilaporkan di pelacak GitLab, dan dukungan profesional terkadang tersedia. Untuk informasi dan bantuan lebih lanjut, Anda dapat merujuk ke:

Kesimpulan

openpyxl adalah pustaka yang mapan untuk otomasi Excel berbasis Python yang menawarkan dukungan lengkap untuk membaca, menulis, dan memformat file Excel. Pustaka ini memungkinkan kontrol terperinci atas keluaran spreadsheet dalam alur kerja otomatis, mulai dari memanipulasi sel individual hingga membuat bagan dan menerapkan pemformatan kompleks.

Bagi pengguna yang perlu membuat atau menganalisis file Excel secara terprogram, khususnya saat membangun laporan atau memproses data tabel, openpyxl menyediakan seperangkat alat yang luas. Kemampuannya untuk bekerja tanpa memerlukan instalasi Excel menjadikannya sangat berharga untuk lingkungan server dan pipeline data otomatis.

Baik Anda membuat model keuangan, menganalisis data, atau menghasilkan laporan, openpyxl memberi Anda alat untuk menangani file Excel secara efisien melalui kode Python.


Vinod Chugani's photo
Author
Vinod Chugani
LinkedIn

Vinod Chugani memulai kariernya di Tokyo sebagai Kepala Meja Penjualan Hedge Fund termuda di JPMorgan dan kemudian mencetak rekor penjualan individu di Lehman Brothers, lalu membangun bisnis distribusi elektronik di 30 negara dengan pendapatan melampaui SG$100 juta sebelum beralih ke data. Lulusan Ekonomi Duke dan alumni NYC Data Science Academy, ia menjadi salah satu dari tiga penerima beasiswa dari lebih dari 100 pelamar untuk kursus Building AI Applications oleh Hugo Bowne-Anderson di Maven. Saat ini, ia menulis untuk DataCamp, KDnuggets, Machine Learning Mastery, dan Statology tentang topik mulai dari statistika hingga AI agensial, dan membimbing para profesional data di NYC Data Science Academy dengan lebih dari 1.000 sesi tatap muka atas namanya.

 

openpyxl FAQs

Format file apa yang didukung openpyxl?

openpyxl mendukung beberapa format Excel, termasuk .xlsx, .xlsm, .xltx, dan xltm. Pustaka ini tidak mendukung format .xls yang lebih lama yang digunakan oleh Excel 2003 dan sebelumnya.

Apakah openpyxl dapat membaca dan mengevaluasi rumus Excel?

openpyxl dapat membaca dan menulis rumus, tetapi tidak mengevaluasinya. Untuk melihat hasil rumus, file harus terlebih dahulu dibuka dan disimpan di Excel.

Apakah saya perlu menginstal Microsoft Excel untuk menggunakan openpyxl?

Tidak, openpyxl bekerja sepenuhnya di Python dan tidak memerlukan Excel terinstal di perangkat Anda.

​Bisakah saya menyisipkan gambar ke Excel dengan openpyxl?

Ya, tetapi Anda harus menginstal pustaka Pillow, dan file gambar harus ada di disk saat memanggil add_image().

Apakah openpyxl cocok untuk file Excel berukuran besar?

Ya, terutama saat menggunakan mode read_only=True, yang meningkatkan performa untuk membaca spreadsheet besar.

Topik

Belajar bersama DataCamp

Program

Pengembang Python Tingkat Menengah

32 Hr
Pelajari Python untuk pengembangan perangkat lunak, mulai dari menulis fungsi hingga mendefinisikan kelas. Dapatkan keterampilan yang diperlukan untuk memulai karir Anda sebagai pengembang!
Lihat DetailRight Arrow
Mulai Kursus
Lihat Lebih BanyakRight Arrow
Terkait

blogs

Tutorial Korelasi di R

Dapatkan pengenalan dasar-dasar korelasi di R: pelajari lebih lanjut tentang koefisien korelasi, matriks korelasi, plotting korelasi, dan sebagainya.
David Woods's photo

David Woods

13 mnt

blogs

Spaghetti Plot dan Jalur Badai

Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Hugo Bowne-Anderson's photo

Hugo Bowne-Anderson

13 mnt

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Dario Radečić's photo

Dario Radečić

15 mnt

blogs

12 Alternatif ChatGPT Terbaik yang Bisa Anda Coba pada 2026

Artikel ini menyajikan daftar alternatif ChatGPT yang akan meningkatkan produktivitas Anda.
Javier Canales Luna's photo

Javier Canales Luna

14 mnt

Lihat Lebih BanyakLihat Lebih Banyak