Otomatisasi adalah superpower yang sering dilupakan di kantor Indonesia. Sementara rekan kerja masih klik-klik Excel dengan sabar, kamu bisa fokus ke tugas lebih penting — atau sekadar minum kopi santai.
Artikel ini bukan hanya teori. Kita akan langsung bikin script Python yang mengubah file CSV penjualan harian menjadi laporan Excel berformat profesional: header berwarna, data terformat rapi, formula SUM otomatis, dan nama file otomatis sesuai tanggal. Semua bisa berjalan terjadwal setiap pagi tanpa kamu sentuh.
Kenapa Otomatisasi Excel dengan Python?
Kamu mungkin tanya: "Kenapa nggak pakai macro Excel aja?". Fair question. Alasannya sederhana:
- Fleksibilitas: Python bisa baca data dari berbagai sumber (CSV, API, database) dengan mudah. Excel macro lebih terbatas.
- Maintainability: Script Python lebih mudah di-debug dan di-update dibanding VBA. Apalagi kalau tim kamu multi-person.
- Skalabilitas: Kalau nanti laporan berkembang jadi puluhan file? Python handle dengan loop. VBA mulai berkeringat.
- No Excel License Required: Script bisa jalan di server atau VPS tanpa perlu instal Microsoft Office. Hemat biaya lisensi perusahaan.
OpenPyXL adalah library Python yang memungkinkan kita baca, edit, dan buat file Excel (.xlsx) tanpa perlu Excel itself. Powerful banget.
Setup & Install Library
Pertama, pastikan kamu punya Python 3.6+ terinstal. Buka terminal/command prompt dan jalankan:
pip install openpyxlItu aja. Nggak perlu ribet. Kalau kamu juga ingin baca data dari CSV (rekomendasi), instal pandas juga:
pip install pandas openpyxlUntuk testing lokal, kamu butuh dummy CSV. Contoh file penjualan_raw.csv:
tanggal,produk,qty,harga,total
2024-01-15,Laptop,2,15000000,30000000
2024-01-15,Mouse,10,500000,5000000
2024-01-15,Keyboard,5,1500000,7500000
2024-01-15,Monitor,3,4000000,12000000Script Utama: Bikin Laporan Otomatis
Sekarang kita ke bagian seru. Script ini akan:
- Baca file CSV penjualan harian
- Hitung total per produk dan grand total
- Bikin file Excel dengan header berwarna
- Tambah formula SUM otomatis
- Simpan dengan nama file berdasarkan tanggal
Berikut script lengkapnya:
import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from datetime import datetime
import os
def buat_laporan_penjualan(csv_path, output_dir='laporan'):
"""
Membuat laporan Excel otomatis dari file CSV penjualan.
"""
# Pastikan folder output ada
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# Baca CSV
df = pd.read_csv(csv_path)
# Buat workbook baru
wb = Workbook()
ws = wb.active
ws.title = "Laporan Penjualan"
# Header styling
header_fill = PatternFill(start_color="4472C4", end_color="4472C4", fill_type="solid")
header_font = Font(bold=True, color="FFFFFF", size=12)
header_alignment = Alignment(horizontal="center", vertical="center")
border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
# Tulis header
headers = ['Tanggal', 'Produk', 'Qty', 'Harga', 'Total']
for col_idx, header in enumerate(headers, 1):
cell = ws.cell(row=1, column=col_idx, value=header)
cell.fill = header_fill
cell.font = header_font
cell.alignment = header_alignment
cell.border = border
# Tulis data dari DataFrame
for row_idx, row in enumerate(df.values, 2):
for col_idx, value in enumerate(row, 1):
cell = ws.cell(row=row_idx, column=col_idx, value=value)
cell.border = border
cell.alignment = Alignment(horizontal="left", vertical="center")
# Format rupiah untuk kolom harga dan total
if col_idx in [4, 5]:
cell.number_format = '#,##0'
# Tambah row untuk total
last_row = len(df) + 2
ws.cell(row=last_row, column=1, value="GRAND TOTAL")
ws.cell(row=last_row, column=1).font = Font(bold=True)
# Formula SUM otomatis di kolom Total
total_cell = ws.cell(row=last_row, column=5)
total_cell.value = f"=SUM(E2:E{last_row-1})"
total_cell.font = Font(bold=True)
total_cell.number_format = '#,##0'
total_cell.fill = PatternFill(start_color="FFF2CC", end_color="FFF2CC", fill_type="solid")
# Set lebar kolom
ws.column_dimensions['A'].width = 15
ws.column_dimensions['B'].width = 20
ws.column_dimensions['C'].width = 10
ws.column_dimensions['D'].width = 18
ws.column_dimensions['E'].width = 18
# Nama file berdasarkan tanggal hari ini
tanggal_hari_ini = datetime.now().strftime('%Y%m%d')
filename = f"Laporan_Penjualan_{tanggal_hari_ini}.xlsx"
filepath = os.path.join(output_dir, filename)
# Simpan file
wb.save(filepath)
print(f"✓ Laporan berhasil dibuat: {filepath}")
print(f"✓ Total baris data: {len(df)}")
print(f"✓ Grand total sudah dihitung otomatis dengan formula")
return filepath
if __name__ == "__main__":
buat_laporan_penjualan('penjualan_raw.csv')Simpan script di atas dengan nama buat_laporan.py. Jalankan dengan:
python buat_laporan.pyHasilnya? File Laporan_Penjualan_20240115.xlsx otomatis muncul di folder laporan/ dengan format rapi, header biru, dan formula SUM yang siap tinggal pakai. Bos akan terkesan.
Jadwalkan Script Agar Jalan Otomatis
Keren, tapi script ini masih harus dijalankan manual. Biar benar-benar otomatis, kita perlu jadwalkannya. Ada dua cara: Windows Task Scheduler atau cron job Linux.
Cara 1: Windows Task Scheduler (Paling Gampang)
Cocok kalau kamu kerja di Windows dan file penjualan harian sudah tersedia di folder tertentu.
- Buka Task Scheduler (ketik di Windows search).
- Klik "Create Basic Task" di sidebar kanan.
- Beri nama: "Otomatisasi Laporan Penjualan Harian".
- Di tab Trigger, pilih "Daily" dan set waktu (misalnya 08:00 pagi).
- Di tab Action, pilih "Start a program". Isi:
- Program/script:
python(atau path lengkap Python, misal:C:\Users\YourName\AppData\Local\Programs\Python\Python311\python.exe) - Add arguments:
C:\path\ke\buat_laporan.py - Start in:
C:\path\ke\folder\script\
- Program/script:
- Klik Finish. Done!
Sekarang script otomatis jalan setiap pukul 08:00 pagi. Kamu bisa tidur sambil Excel sedang dikerjakan.
Cara 2: Cron Job (Linux/Mac)
Kalau kamu pakai Linux atau Mac, pakai cron. Buka terminal dan ketik:
crontab -eTambahkan baris berikut (misalnya jalankan pukul 06:00 pagi):
0 6 * * * /usr/bin/python3 /home/username/buat_laporan.pyPenjelasan: 0 6 = jam 06:00, * * * = setiap hari setiap bulan setiap tahun. Simpan dan selesai.
Cek apakah cron job sudah terdaftar:
crontab -lTips & Troubleshooting
- File CSV tidak ditemukan? Pastikan path file sudah benar. Gunakan absolute path, bukan relative path, supaya tidak error saat task scheduler menjalankannya.
- Permission denied di Linux? Jalankan
chmod +x buat_laporan.pyuntuk beri permission execute. - Mau baca dari database langsung? Ganti bagian
pd.read_csv()dengan koneksi database pakai sqlalchemy atau psycopg2. Begitu juga email laporan otomatis pakai smtplib. - File Excel corrupt? Pastikan tidak ada dua proses menulis file yang sama secara bersamaan. Tambah timestamp ke filename untuk safety.
- Kolom terlalu sempit/lebar? Edit nilai
ws.column_dimensions['A'].width = 15sesuai kebutuhan.
Bonus: Kirim Laporan via Email Otomatis
Agar laporan langsung masuk inbox bos, tambahkan kode ini di akhir script:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email import encoders
def kirim_email(filepath, email_penerima, email_pengirim, password):
msg = MIMEMultipart()
msg['From'] = email_pengirim
msg['To'] = email_penerima
msg['Subject'] = f"Laporan Penjualan {datetime.now().strftime('%Y-%m-%d')}"
body = "Laporan penjualan harian terlampir."
msg.attach(MIMEText(body, 'plain'))
attachment = open(filepath, 'rb')
part = MIMEBase('application', 'octet-stream')
part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', f'attachment; filename= {os.path.basename(filepath)}')
msg.attach(part)
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(email_pengirim, password)
server.send_message(msg)
server.quit()
print(f"✓ Email terkirim ke {email_penerima}")
# Panggil di akhir buat_laporan_penjualan()
kirim_email(filepath, 'boss@perusahaan.com', 'your_email@gmail.com', 'your_app_password')Catatan: Untuk Gmail, pakai App Password bukan password akun biasa (di security settings Gmail). Dokumentasi lengkap bisa cek di OpenPyXL official docs.
Kesimpulan
Otomatisasi laporan Excel bukan lagi mimpi. Dengan Python dan OpenPyXL, kamu bisa menghemat puluhan jam kerja manual setiap bulan — dan fokus ke tugas yang lebih meaningful. Script di artikel ini bisa langsung kamu copy-paste dan sesuaikan dengan data kamu sendiri.
Ingat: automation adalah gift yang terus memberi. Setiap kali script berjalan, kamu menyelamatkan 30 menit waktu kamu. Kalau 22 hari kerja, itu 11 jam per bulan. Setahun? 132 jam — atau hampir 3 minggu kerja penuh yang bisa kamu hemat. Mulai automasi sekarang, dan rasakan bedanya!
Untuk tutorial Python & RPA lainnya, pantengin terus duamasatech.com. Happy automating! 🚀