Materi
Laporan dari banyak orang jarang seragam. Satu cabang menaruh harga di kolom pertama, cabang lain menulis "JUMLAH" dengan huruf besar atau "Produk " dengan spasi di ujung, dan ada yang menambahkan baris TOTAL buatan sendiri di bawah. Kode yang membaca kolom menurut posisi akan salah tanpa pesan error: harga terbaca sebagai jumlah.
Jalan keluarnya adalah membaca kolom menurut nama judulnya. Ambil baris pertama, normalkan setiap judul dengan str(j).strip().lower(), lalu buat dict nama judul → posisi. Setelah itu setiap nilai diambil dengan baris[kolom["jumlah"]], di mana pun kolom itu berada.
baris = list(ws.iter_rows(values_only=True))
kolom = {str(j).strip().lower(): i for i, j in enumerate(baris[0])}
print(kolom) # {'nama': 0, 'jam lembur': 1}
for b in baris[1:]:
if b[kolom["nama"]] is None:
continue
print(b[kolom["nama"]], b[kolom["jam lembur"]])Baris yang tidak berisi data sungguhan dilewati dengan dua pemeriksaan: kolom kunci (nama produk) kosong, atau isinya kata total dalam huruf apa pun. Membandingkan setelah .lower() menangkap TOTAL, Total, dan total sekaligus.
Pesan error yang akan kamu temui
KeyError: 'jumlah' berarti tidak ada judul yang setelah dinormalkan berbunyi persis "jumlah" — cetak dict kolom untuk melihat ejaan aslinya, misalnya "jml" atau "jumlah unit". AttributeError: 'NoneType' object has no attribute 'strip' berarti ada sel judul kosong; str(j) sebelum .strip() mencegahnya.