things you need:
- mysql driver package : github.com/go-sql-driver/mysql
- excel package : github.com/360EntSecGroup-Skylar/excelize
language : bahasa indonesia
semisal folder project nya : d:/go/src/goexcel/
oh btw, saya pakai dummy database nya mysql employees, bisa pakai database yang udah ada juga ga masalah, saya belajar pakai tutorial di situs nya novalagung
install dulu package nya, buka terminal di path folder project kita.
go get -u github.com/go-sql-driver/mysql go get -u github.com/360EntSecGroup-Skylar/excelize
buat file main.go dan import package nya. kalau di visual studio code nanti terisi otomatis waktu kita ngetik di func
package main import ( "database/sql" "fmt" "log" "github.com/360EntSecGroup-Skylar/excelize" _ "github.com/go-sql-driver/mysql" )
lalu kita buat type struct untuk kita simpan nanti hasil ambil data dari mysql nya, dept adalah nama data type yang bisa kita pakai
type dept struct { dept_no string dept_name string }
and then, kita buat untuk koneksi ke database,
func connect() (*sql.DB, error) { db, err := sql.Open("mysql", "root:@tcp(localhost:3306)/employees") if err != nil { log.Fatal(err) } err = db.Ping() if err != nil { panic(err.Error()) } return db, nil }
sql.Open() go lang tidak langsung membuka koneksi ke db mysql tapi cuma mempersiapkan jalur, kalau ga ada yang pakai ya cuma nongkrong aja ga di buka. jadi ga bisa dipakai untuk cek apakah koneksi berhasil nyambung atau tidak. untuk cek koneksi ke db kita bisa pakai db.Ping()
sql.Open("mysql", "root:@tcp(localhost:3306)/employees")
disini koneksi ke mysql nya tidak pakai password, komplit nya sih seperti dibawah ini
sql.Open("mysql", "username:password@tcp(host:port)/database")
sep kita lanjut,
kita buat func untuk query sql nya
func sqlQuery() []dept { db, err := connect() if err != nil { log.Fatal(err) } // selalu defer db.close() alias ditutup, defer akan mengeksekusi // db.close() diakhir setelah semua proses selesai // simpan di awal ok, mau didefer di akhir juga bagus defer db.Close() rows, err := db.Query("select * from departments") if err != nil { log.Fatal(err) } // selalu defer close koneksi setelah dipakai defer rows.Close() var result []dept for rows.Next() { var each = dept{} var err = rows.Scan(&each.dept_no, &each.dept_name) if err != nil { log.Fatal(err) } result = append(result, each) } err = rows.Err() if err != nil { log.Fatal(err) } return result }
disini kita pada func sqlQuery kita menggunakan tipe data yang dibuat tadi yaitu array dept, []dept. func akan me return result dari hasil query select table departments di database employees.
kita buat func untuk export ke excel,
func exportExcel(result []dept) { xlsx := excelize.NewFile() sheet1Name := "holy sheet" xlsx.SetSheetName(xlsx.GetSheetName(1), sheet1Name) err := xlsx.AutoFilter(sheet1Name, "A1", "B1", "") for i, each := range result { xlsx.SetCellValue(sheet1Name, fmt.Sprintf("A%d", i+1), each.dept_no) xlsx.SetCellValue(sheet1Name, fmt.Sprintf("B%d", i+1), each.dept_name) } err = xlsx.SaveAs("./file2.xlsx") if err != nil { fmt.Println(err) } }
jadi kira2 begini : buat file baru, dengan nama sheet holy sheet. set nama sheet, tambah fitur auto filter (filter excel) dari A1 sampai dengan B1, iterasi each dari i sampai range result nya, set cell value nya tiap iterasi di A ke i (A1,A2…dst) dept no, dan set juga untuk dept nama di B#. save file nya buat dalam format excel di ./file2.xlsx
terakhir kita panggil function yang sudah dibuat di func main(). main ini ssebagai func yang akan di eksekusi ketika menjalankan program
func main() { var res []dept res = sqlQuery() exportExcel(res) }
untuk mencoba menjalankan program, di terminal pada path folder project lakukan
go run namafile.go
jika benar akan muncul file excel namafile.xlsx misal disini namanya file2.xlsx
selamat makan jangan lupa baca doa sebelum tidur