golang實(shí)現(xiàn)讀取excel數(shù)據(jù)并導(dǎo)入數(shù)據(jù)庫
Go 語言是一門適合用于編寫高效且并發(fā)的 Web 應(yīng)用程序的編程語言,同時也可以使用它進(jìn)行數(shù)據(jù)處理和分析。在數(shù)據(jù)處理和分析過程中,Excel 是一種常用的電子表格軟件,很多情況下需要將數(shù)據(jù)導(dǎo)入到 Excel 中進(jìn)行分析和處理。在 Go 語言中,可以使用兩種不同的 excelize 包來操作 Excel 文件,分別是 xuri/excelize 和 360EntSecGroup-Skylar/excelize。
1./xuri/excelize/v2
xuri/excelize 是一個用于操作 Excel 文件的第三方庫,可以通過以下方式導(dǎo)入:
import "/xuri/excelize/v2"
xuri/excelize 是 Go 語言社區(qū)中最受歡迎的 Excel 文件操作庫之一,它提供了豐富的功能,可以用于讀取、修改和創(chuàng)建 Excel 文件,包括但不限于以下功能:
- 讀取 Excel 文件中的數(shù)據(jù)
- 修改 Excel 文件中的數(shù)據(jù)
- 在 Excel 文件中插入圖片
- 在 Excel 文件中添加圖表
- 在 Excel 文件中設(shè)置打印選項(xiàng)
- 對 Excel 文件進(jìn)行加密
- 提供更多的文件格式支持(例如 CSV、XML)
以下是 xuri/excelize 讀取 Excel 文件的示例代碼:
package main import ( "fmt" "/xuri/excelize/v2" ) func main() { file, err := excelize.OpenFile("Book1.xlsx") if err != nil { fmt.Println(err) return } cells := file.GetRows("Sheet1") for _, row := range cells { for _, colCell := range row { fmt.Print(colCell, "\t") } fmt.Println() } }
2./360EntSecGroup-Skylar/excelize/v2
360EntSecGroup-Skylar/excelize 是由 360 企業(yè)安全組(360 Enterprise Security Group)開發(fā)的一個 Excel 文件處理庫,可以使用以下方式導(dǎo)入:
import "/360EntSecGroup-Skylar/excelize/v2"
相較于 xuri/excelize,360EntSecGroup-Skylar/excelize 提供了更多的功能,包括但不限于以下功能:
- 讀取 Excel 文件中的數(shù)據(jù)
- 修改 Excel 文件中的數(shù)據(jù)
- 在 Excel 文件中插入圖片
- 在 Excel 文件中添加圖表
- 在 Excel 文件中設(shè)置打印選項(xiàng)
- 對 Excel 文件進(jìn)行加密
- 提供更多的文件格式支持(例如 CSV、XML)
- 提供更多的單元格格式化選項(xiàng)(例如設(shè)置單元格樣式、設(shè)置單元格寬度和高度)
以下是 360EntSecGroup-Skylar/excelize 讀取 Excel 文件的示例代碼:
package main import ( "fmt" "/360EntSecGroup-Skylar/excelize/v2" ) func main() { file, err := excelize.OpenFile("Book1.xlsx") if err != nil { fmt.Println(err) return } cells := file.GetRows("Sheet1") for _, row := range cells { for _, colCell := range row { fmt.Print(colCell, "\t") } fmt.Println() } }
實(shí)戰(zhàn):
// @description: SharedImport 導(dǎo)入 // @param {string} filePath // @param {int64} commitID // @param {http.Header} header // @return {*} func SharedImport(filePath, fileName string, commitID int64, header http.Header) (int64, error) { plog.Info("SharedImport", "processing cpp file with file path specified: %v", filePath) f, err := excelize.OpenFile(filePath) if err != nil { plog.Error("", "%v", err) return -1, err } sheetList := garray.NewStrArrayFrom(f.GetSheetList()) plog.Info("SharedImport", "share file contains sheet list: %v", sheetList.Slice()) if sheetList.Contains(sharedbilltype.SHARE_INFOMATION_CN) { plog.Info("SharedImport", "processing CN share template, finding key cells with chinese") err = ShareCNImport(f, filePath, fileName, commitID, header) if err != nil { plog.Error("", "%v", err) return -1, err } return commitID, nil } else if sheetList.Contains(sharedbilltype.SHARE_INFOMATION_EN) { plog.Info("SharedImport", "processing EN share template, finding key cells with english") err = ShareENImport(f, filePath, fileName, commitID, header) if err != nil { plog.Error("", "%v", err) return -1, err } return commitID, nil } else { msgCN := sharedbilltype.ERR_INVALID_SHARE_TEMPLATE_CN msgEN := sharedbilltype.ERR_INVALID_SHARE_TEMPLATE_EN overviewMsgCN := sharedbilltype.ERR_OVERVIEW_WRONG_FILE_CN overviewMsgEN := sharedbilltype.ERR_OVERVIEW_WRONG_FILE_EN plog.Warn("SharedImport", msgCN) plog.Warn("SharedImport", msgEN) plog.Warn("SharedImport", overviewMsgCN) plog.Warn("SharedImport", overviewMsgEN) err = sharedbillrdb.SaveTInfShareMainValidate([]*sharedbilltype.TableTInfBillShareMainValidate{ NewInvalidFormatRecord(filePath, commitID, msgCN, msgEN, 0, "", 0, "", 0, "", header, fileName), NewInvalidFormatOverviewRecord(filePath, commitID, 0, 0, overviewMsgCN, overviewMsgEN, header, fileName), }) if err != nil { plog.Error("", "%v", err) return -1, err } return commitID, nil } }
3.總結(jié)
/xuri/excelize/v2 和 /360EntSecGroup-Skylar/excelize/v2 都是 Golang 中用于操作 Excel 文件的庫,它們的區(qū)別在于它們是由不同的開發(fā)者維護(hù)的,它們的功能、性能和使用方式也略有不同。
/xuri/excelize/v2 是由 Xuri 開發(fā)的 Excel 文件處理庫,它可以讀取、寫入和編輯 XLSX 格式的 Excel 文件,支持大量的 Excel 功能,如圖表、數(shù)據(jù)透 視表、條件格式等,同時還提供了對 PDF 和 HTML 導(dǎo)出的支持。這個庫的使用文檔詳細(xì),具有良好的可維護(hù)性和易用性。
/360EntSecGroup-Skylar/excelize/v2 是由 360 安全團(tuán)隊(duì)開發(fā)的 Excel 文件處理庫,它也可以讀取、寫入和編輯 XLSX 格式的 Excel 文件,支持大量的 Excel 功能,如公式、圖表、數(shù)據(jù)透 視表、條件格式等,同時還提供了對 CSV、TSV 和 JSON 導(dǎo)出的支持。這個庫的使用文檔相對較少,但是它具有很好的性能和穩(wěn)定性。
因此,選擇使用哪個 Excel 處理庫取決于您的需求和偏好。如果您需要處理較為復(fù)雜的 Excel 文件并導(dǎo)出到 PDF 或 HTML 文件中,那么您可以選擇 /xuri/excelize/v2;如果您需要快速處理大量的 Excel 文件并導(dǎo)出到 CSV、TSV 或 JSON 文件中,那么您可以選擇 /360EntSecGroup-Skylar/excelize/v2。
4.知識延展
golang獲取Excel數(shù)據(jù)更新數(shù)據(jù)庫
package main import ( "bufio" "database/sql" "fmt" "os" "path/filepath" "strconv" "strings" _ "github.com/alexbrainman/odbc" "github.com/xuri/excelize/v2" // "encoding/json" // "reflect" ) func main() { chuliYuanExecl() } func chuliYuanExecl() { fmt.Println("這個程序會打印輸入的內(nèi)容,輸入'exit()' 退出程序!") // fmt.Println("請輸入內(nèi)容:") input := bufio.NewScanner(os.Stdin) for { fmt.Println("=================!開始轉(zhuǎn)換!=====================================") db, err := sql.Open("odbc", "driver={sql server};server=127.0.0.1;port=1433;uid=xx;pwd=xxx;database=xxx") if err != nil { fmt.Printf(err.Error()) } fmt.Print("輸入文件 >> ") input.Scan() if strings.Compare(strings.TrimSpace(input.Text()), "") == 0 { continue } if strings.Compare(strings.TrimSpace(input.Text()), "exit()") == 0 { os.Exit(0) } fmt.Println("你輸入的文件是:", strings.Replace(strings.Replace(strings.Replace(strings.Replace(input.Text(), "& '", "", 1), "'", "", 1), "”", "", 1), "“", "", 1)) yuanPath := strings.Replace(strings.Replace(strings.Replace(strings.Replace(input.Text(), "& '", "", 1), "'", "", 1), "”", "", 1), "“", "", 1) f, err := excelize.OpenFile(yuanPath) if err != nil { fmt.Println(err) return } defer func() { if err := f.Close(); err != nil { fmt.Println(err) } }() fmt.Println("開始加載數(shù)據(jù)庫......") var sheel = "Sheet1" // 獲取 Sheet1 上所有單元格 rows, err := f.GetRows(sheel) if err != nil { fmt.Println(err) return } fmt.Println("正在更新數(shù)據(jù)庫請等待......") // 獲取信息 for i, _ := range rows { // 如果有標(biāo)題或者表頭要跳過 if i < 1 { continue } // 獲取單元格數(shù)據(jù) djbh, err := f.GetCellValue(sheel, "A"+strconv.Itoa(i+1)) if err != nil { fmt.Println(err) return } szdbh, err := f.GetCellValue(sheel, "E"+strconv.Itoa(i+1)) if err != nil { fmt.Println(err) return } bm, err := f.GetCellValue(sheel, "G"+strconv.Itoa(i+1)) if err != nil { fmt.Println(err) return } szdzd, err := f.GetCellValue(sheel, "H"+strconv.Itoa(i+1)) if err != nil { fmt.Println(err) return } djzd, err := f.GetCellValue(sheel, "I"+strconv.Itoa(i+1)) if err != nil { fmt.Println(err) return } if djbh == "" { continue } if szdbh == "" { continue } if bm == "" { continue } if szdzd == "" { continue } if djzd == "" { continue } var ( CGPHID string ) // 數(shù)據(jù)庫查詢 var whcgphsql = `SELECT a.ITEM_BUSINESS_ID FROM ITEM_PURCHASE a LEFT JOIN ITEM b ON a.ITEM_ID= b.ITEM_BUSINESS_ID WHERE b.ITEM_CODE= '` + djbh + `'` dhuserrows, err := db.Query(whcgphsql) defer dhuserrows.Close() for dhuserrows.Next() { err := dhuserrows.Scan(&CGPHID) if err != nil { fmt.Println(err) } } // 數(shù)據(jù)庫更新 var xssql = `UPDATE ` + bm + ` SET ` + szdzd + `='` + szdbh + `' WHERE ` + djzd + `='` + CGPHID + `'` fmt.Println(xssql) x, err := db.Exec(xssql) if err != nil { fmt.Println("UPDATE failed:", err.Error(), x) } } fmt.Println("--------------------- !轉(zhuǎn)換完成!---------------------------") } return }
golang獲取excel中的指定列數(shù)據(jù)
獲取golang中指定列數(shù)據(jù)
func ValueLoc(excel_path, sheet_name string, cols []string) [][]string{ xlsx, err := excelize.OpenFile(excel_path) if err != nil { os.Exit(1) return } rows := xlsx.GetRows(sheet_name) colIndex := make([]int, len(cols)) // 獲取每個col的所在序列號 for index, row := range rows { if index == 0 { num := 0 for _, col := range cols { for key, colCell := range row { if colCell == col { colIndex[num] = key + 1 num++ } } } } } // 對存在的量進(jìn)行重新矯正,以解決初始變量長度問題 res_len := 0 for _, coli := range colIndex { if coli-1 >= 0 { res_len++ } } // 獲取數(shù)據(jù) res_data := make([][]string, len(rows)-1) res_index := 0 for index, row := range rows { if index != 0 { data := make([]string, res_len) for i, colindex := range colIndex { for key, colCell := range row { if key == colindex-1 { data[i] = colCell } } } res_data[res_index] = data res_index++ } } return res_data }
到此這篇關(guān)于golang實(shí)現(xiàn)讀取excel數(shù)據(jù)并導(dǎo)入數(shù)據(jù)庫的文章就介紹到這了,更多相關(guān)go讀取excel數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang實(shí)現(xiàn)將視頻按照時間維度剪切的工具
這篇文章主要為大家詳細(xì)介紹了如何利用Golang實(shí)現(xiàn)將視頻按照時間維度進(jìn)行剪切,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12Golang多線程爬蟲高效抓取大量數(shù)據(jù)的利器
Golang多線程爬蟲是一種高效抓取大量數(shù)據(jù)的利器。Golang語言天生支持并發(fā)和多線程,可以輕松實(shí)現(xiàn)多線程爬蟲的開發(fā)。通過使用Golang的協(xié)程和通道,可以實(shí)現(xiàn)爬蟲的高效并發(fā)抓取、數(shù)據(jù)處理和存儲2023-05-05