golang-把sql查询结果导出到excel
package main
import (
"database/sql"
"fmt"
"strconv"
"strings"
_ "github.com/denisenkom/go-mssqldb"
"github.com/xuri/excelize/v2"
)
const (
server = "127.0.0.1"
port = "1433"
user = "root"
password = "password"
database = "databasename"
)
var db *sql.DB
/*初始化数据库连接 赋值给全局变量 db */
func initDB() (err error) {
connStr := fmt.Sprintf("server=%s;user id =%s;password=%s;port=%s;database=%s;encrypt=disable;", server, user, password, port, database)
db, err = sql.Open("mssql", connStr)
if err != nil {
return err
}
// 尝试与数据库建立连接(校验dsn是否正确.)
err = db.Ping()
if err != nil {
return err
}
return nil
}
func SQL2XLSX(sql_string string, fileName string) {
f := excelize.NewFile()
//sql_string := ` select * from table1 `
if rows, err := db.Query(sql_string); err == nil {
index := 0 //写入xls的行数
cloumns, _ := rows.Columns()
//写入自定义字段
for i := 0; i < len(cloumns); i++ {
k := strings.ToUpper(string(rune(97+i))) + "1"
fmt.Println(k, cloumns[i])
f.SetCellValue("Sheet1", k, cloumns[i])
}
values := make([]sql.RawBytes, len(cloumns))
scanArgs := make([]interface{}, len(values))
for i := range values {
scanArgs[i] = &values[i]
}
for rows.Next() {
err = rows.Scan(scanArgs...)
if err != nil {
fmt.Println(err)
}
var value string
for i, col := range values {
if col == nil {
value = " "
} else {
value = string(col)
}
k := strings.ToUpper(string(rune(97+i))) + strconv.Itoa(index+2) //生成XLS列名
fmt.Println(k)
f.SetCellValue("Sheet1", k, value)
// fmt.Println(cloumns[i], ": ", value)
}
index++
}
err = f.SaveAs(fileName)
if err != nil {
fmt.Println(err)
}
}
}
再来个返回列头相同的多个查询导入到一个excel文件
sqllist 是一个sql查询字符串组成的切片
//自定义字段名称
autoField := []string{"列1", "列2", "列3", "列4", "列5", "列6" }
执行 SQL2XLSX(autoField , "1.xlsx")
func SQL2XLSX(autoField []string, fileName string) {
f := excelize.NewFile()
//写入自定义字段
for i := 0; i < len(autoField); i++ {
k := strings.ToUpper(string(rune(97+i))) + "1"
fmt.Println(k, autoField[i])
f.SetCellValue("Sheet1", k, autoField[i])
}
//sql_string := ` QN_goods_in_out_wsh_jxc2 76 `
index := 0 //写入xls的行数
for i, m := range sqllist {
fmt.Println(i, m)
sql_string := m
if rows, err := db.Query(sql_string); err == nil {
cloumns, _ := rows.Columns()
values := make([]sql.RawBytes, len(cloumns))
scanArgs := make([]interface{}, len(values))
for i := range values {
scanArgs[i] = &values[i]
}
for rows.Next() {
err = rows.Scan(scanArgs...)
if err != nil {
fmt.Println(err)
}
var value string
for i, col := range values {
if col == nil {
value = " "
} else {
value = string(col)
}
k := strings.ToUpper(string(rune(97+i))) + strconv.Itoa(index+2) //生成XLS列名
fmt.Println(k)
f.SetCellValue("Sheet1", k, value)
// fmt.Println(cloumns[i], ": ", value)
}
index++
}
err = f.SaveAs(fileName)
if err != nil {
fmt.Println(err)
}
}
}
}
浙公网安备 33010602011771号