Di banyak kantor, file Excel adalah media pertukaran data yang paling nyata: laporan bulanan dikirim sebagai .xlsx, data anggota dikumpulkan lewat spreadsheet, dan atasan meminta hasil analisis dalam format Excel supaya mudah dibuka tanpa Python. pandas menutup jarak ini lewat dua method, yaitu to_excel() untuk menulis DataFrame ke file Excel dan read_excel() untuk membacanya kembali. Keduanya bekerja melalui engine pustaka pembantu bernama openpyxl yang sudah terpasang di lingkungan kita. Pada Chapter ini kita menulis satu sheet, menulis banyak sheet dalam satu workbook, lalu membaca keduanya kembali ke DataFrame.

Skrip berikut mengekspor tabel penjualan ke laporan.xlsx, lalu membaca file yang sama menjadi DataFrame baru. Setelah selesai, file contoh dihapus lagi supaya folder kerja tetap bersih.

python
import pandas as pd
from pathlib import Path

penjualan = pd.DataFrame({
    "bulan": ["Januari", "Februari", "Maret"],
    "produk": ["Kopi Gayo", "Kopi Gayo", "Teh Melati"],
    "jumlah": [12, 15, 30],
})

penjualan.to_excel("laporan.xlsx", sheet_name="penjualan", index=False)

kembali = pd.read_excel("laporan.xlsx", sheet_name="penjualan")
print(kembali)
print()
print(kembali.dtypes)

Path("laporan.xlsx").unlink()

Output yang Dihasilkan:

text
      bulan      produk  jumlah
0   Januari   Kopi Gayo      12
1  Februari   Kopi Gayo      15
2     Maret  Teh Melati      30

bulan       str
produk      str
jumlah    int64
dtype: object

Mari kita telaah bagian-bagian pentingnya:

  1. Baris 9 (penjualan.to_excel("laporan.xlsx", ...)): method to_excel() membuat workbook baru dengan satu sheet bernama penjualan; parameter index=False mencegah kolom index angka ikut tertulis, sama seperti pada to_csv().
  2. Baris 11 (pd.read_excel("laporan.xlsx", sheet_name="penjualan")): method read_excel() membuka workbook, memilih sheet sesuai sheet_name, lalu mengubah isi sheet menjadi DataFrame. Nilai default sheet_name=0 berarti sheet pertama bila parameter ini tidak diisi.
  3. Baris 12-14: print(kembali) menampilkan tabel hasil bacaan dan dtypes menunjukkan tipe data terdeteksi kembali: kolom teks menjadi str dan kolom angka menjadi int64.

Berbeda dengan CSV, format Excel menyimpan metadata struktur, sehingga nama sheet dan batas antartabel tersimpan di dalam file. Meskipun begitu, tipe data tetap ditebak ulang saat membaca karena sel Excel hanya menyimpan nilai. Parameter lengkap kedua method ini dirangkum pada halaman read_excel dan to_excel di dokumentasi resmi.

Satu Workbook, Banyak Sheet #

Satu file Excel bisa menampung beberapa tabel dalam sheet yang berbeda; inilah keunggulan utama Excel dibanding CSV. Untuk menulis lebih dari satu sheet, kita memakai pd.ExcelWriter() sebagai context manager dengan blok with, lalu memanggil to_excel() untuk setiap tabel ke writer yang sama:

python
import pandas as pd
from pathlib import Path

penjualan = pd.DataFrame({
    "bulan": ["Januari", "Februari"],
    "jumlah": [12, 30],
})
stok = pd.DataFrame({
    "produk": ["Kopi Gayo", "Teh Melati"],
    "stok": [40, 60],
})

with pd.ExcelWriter("toko.xlsx", engine="openpyxl") as writer:
    penjualan.to_excel(writer, sheet_name="penjualan", index=False)
    stok.to_excel(writer, sheet_name="stok", index=False)

xl = pd.ExcelFile("toko.xlsx", engine="openpyxl")
print(xl.sheet_names)
print()

semua = pd.read_excel("toko.xlsx", sheet_name=None, engine="openpyxl")
for nama, tabel in semua.items():
    print(nama)
    print(tabel)
    print()

Path("toko.xlsx").unlink()

Output yang Dihasilkan:

text
['penjualan', 'stok']

penjualan
      bulan  jumlah
0   Januari      12
1  Februari      30

stok
       produk  stok
0   Kopi Gayo    40
1  Teh Melati    60

Pola kerja di atas perlu diurai satu per satu:

  1. Baris 10-13 (with pd.ExcelWriter(...) as writer): writer membuka workbook toko.xlsx dengan engine="openpyxl". Saat blok with selesai, pandas menyimpan dan menutup file secara rapi; tanpa blok with, file bisa tertinggal dalam keadaan belum tersimpan lengkap.
  2. Baris 11-12: setiap to_excel(writer, sheet_name=...) menambahkan satu sheet ke workbook yang sedang dibuka; nama penjualan dan stok menjadi nama tab di Excel.
  3. Baris 15-16 (pd.ExcelFile(...)): objek ExcelFile membuka workbook sekali saja untuk pemeriksaan ringan; atribut sheet_names menampilkan daftar sheet dalam urutan penulisannya.
  4. Baris 18-22 (pd.read_excel(..., sheet_name=None)): dengan sheet_name=None, pandas membaca semua sheet sekaligus dan mengembalikan dict berisi DataFrame, dengan nama sheet sebagai key. Loop for mencetak setiap pasangan nama dan tabelnya.

Parameter yang Sering Dipakai di read_excel() #

Sheet Excel di dunia nyata sering berisi judul di baris atas, catatan di kolom samping, atau beberapa tabel dalam satu sheet. Parameter berikut membantu read_excel() memilih bagian yang benar-benar berupa data:

ParameterKegunaan
sheet_nameMemilih sheet: angka 0 (default) untuk sheet pertama, nama sheet berupa string, atau None untuk semua sheet
headerMenentukan baris mana yang menjadi nama kolom, misalnya header=2 bila dua baris pertama berisi judul laporan
skiprowsMelewati sejumlah baris di awal sebelum data dimulai
usecolsMembaca kolom tertentu saja, misalnya usecols="A:C" atau usecols=["bulan", "jumlah"]
na_valuesMengubah teks tertentu menjadi NaN, perilakunya sama dengan read_csv()

Seluruh format baca-tulis pandas, termasuk bagian Excel, dirangkum pada halaman IO tools .

Kapan Excel Dipilih #

Excel cocok ketika penerima data adalah manusia yang bekerja dengan aplikasi spreadsheet, atau ketika sumber data memang berupa workbook dengan beberapa sheet. Untuk pertukaran data antarskrip dan antarsistem, CSV lebih ringan dan format biner seperti Parquet lebih utuh. Karena banyak hasil analisis akhirnya dikonsumsi sebagai spreadsheet, kemampuan menulis Excel yang rapi dengan sheet_name dan index=False tetap menjadi bekal penting. Chapter berikutnya beralih ke format teks semi terstruktur yang umum dari sisi lain dunia data: JSON dari API dan layanan web.