golang實(shí)現(xiàn)讀取excel數(shù)據(jù)并導(dǎo)入數(shù)據(jù)庫(kù)
Go 語(yǔ)言是一門(mén)適合用于編寫(xiě)高效且并發(fā)的 Web 應(yīng)用程序的編程語(yǔ)言,同時(shí)也可以使用它進(jìn)行數(shù)據(jù)處理和分析。在數(shù)據(jù)處理和分析過(guò)程中,Excel 是一種常用的電子表格軟件,很多情況下需要將數(shù)據(jù)導(dǎo)入到 Excel 中進(jìn)行分析和處理。在 Go 語(yǔ)言中,可以使用兩種不同的 excelize 包來(lái)操作 Excel 文件,分別是 xuri/excelize 和 360EntSecGroup-Skylar/excelize。
1./xuri/excelize/v2
xuri/excelize 是一個(gè)用于操作 Excel 文件的第三方庫(kù),可以通過(guò)以下方式導(dǎo)入:
import "/xuri/excelize/v2"
xuri/excelize 是 Go 語(yǔ)言社區(qū)中最受歡迎的 Excel 文件操作庫(kù)之一,它提供了豐富的功能,可以用于讀取、修改和創(chuàng)建 Excel 文件,包括但不限于以下功能:
- 讀取 Excel 文件中的數(shù)據(jù)
- 修改 Excel 文件中的數(shù)據(jù)
- 在 Excel 文件中插入圖片
- 在 Excel 文件中添加圖表
- 在 Excel 文件中設(shè)置打印選項(xiàng)
- 對(duì) 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)開(kāi)發(fā)的一個(gè) Excel 文件處理庫(kù),可以使用以下方式導(dǎo)入:
import "/360EntSecGroup-Skylar/excelize/v2"
相較于 xuri/excelize,360EntSecGroup-Skylar/excelize 提供了更多的功能,包括但不限于以下功能:
- 讀取 Excel 文件中的數(shù)據(jù)
- 修改 Excel 文件中的數(shù)據(jù)
- 在 Excel 文件中插入圖片
- 在 Excel 文件中添加圖表
- 在 Excel 文件中設(shè)置打印選項(xiàng)
- 對(duì) 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 文件的庫(kù),它們的區(qū)別在于它們是由不同的開(kāi)發(fā)者維護(hù)的,它們的功能、性能和使用方式也略有不同。
/xuri/excelize/v2 是由 Xuri 開(kāi)發(fā)的 Excel 文件處理庫(kù),它可以讀取、寫(xiě)入和編輯 XLSX 格式的 Excel 文件,支持大量的 Excel 功能,如圖表、數(shù)據(jù)透 視表、條件格式等,同時(shí)還提供了對(duì) PDF 和 HTML 導(dǎo)出的支持。這個(gè)庫(kù)的使用文檔詳細(xì),具有良好的可維護(hù)性和易用性。
/360EntSecGroup-Skylar/excelize/v2 是由 360 安全團(tuán)隊(duì)開(kāi)發(fā)的 Excel 文件處理庫(kù),它也可以讀取、寫(xiě)入和編輯 XLSX 格式的 Excel 文件,支持大量的 Excel 功能,如公式、圖表、數(shù)據(jù)透 視表、條件格式等,同時(shí)還提供了對(duì) CSV、TSV 和 JSON 導(dǎo)出的支持。這個(gè)庫(kù)的使用文檔相對(duì)較少,但是它具有很好的性能和穩(wěn)定性。
因此,選擇使用哪個(gè) Excel 處理庫(kù)取決于您的需求和偏好。如果您需要處理較為復(fù)雜的 Excel 文件并導(dǎo)出到 PDF 或 HTML 文件中,那么您可以選擇 /xuri/excelize/v2;如果您需要快速處理大量的 Excel 文件并導(dǎo)出到 CSV、TSV 或 JSON 文件中,那么您可以選擇 /360EntSecGroup-Skylar/excelize/v2。
4.知識(shí)延展
golang獲取Excel數(shù)據(jù)更新數(shù)據(jù)庫(kù)
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("這個(gè)程序會(huì)打印輸入的內(nèi)容,輸入'exit()' 退出程序!")
// fmt.Println("請(qǐng)輸入內(nèi)容:")
input := bufio.NewScanner(os.Stdin)
for {
fmt.Println("=================!開(kāi)始轉(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("開(kāi)始加載數(shù)據(jù)庫(kù)......")
var sheel = "Sheet1"
// 獲取 Sheet1 上所有單元格
rows, err := f.GetRows(sheel)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("正在更新數(shù)據(jù)庫(kù)請(qǐng)等待......")
// 獲取信息
for i, _ := range rows {
// 如果有標(biāo)題或者表頭要跳過(guò)
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ù)庫(kù)查詢
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ù)庫(kù)更新
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))
// 獲取每個(gè)col的所在序列號(hào)
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++
}
}
}
}
}
// 對(duì)存在的量進(jìn)行重新矯正,以解決初始變量長(zhǎng)度問(wè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ù)庫(kù)的文章就介紹到這了,更多相關(guān)go讀取excel數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang進(jìn)行簡(jiǎn)單權(quán)限認(rèn)證的實(shí)現(xiàn)
本文主要介紹了golang簡(jiǎn)單權(quán)限認(rèn)證的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Go語(yǔ)言操作金倉(cāng)數(shù)據(jù)庫(kù)的環(huán)境搭建與連接管理
這篇文章主要為大家詳細(xì)介紹了使用Go語(yǔ)言開(kāi)發(fā)數(shù)據(jù)采集服務(wù)時(shí)使用Gokb驅(qū)動(dòng)連接金倉(cāng)數(shù)據(jù)庫(kù)的過(guò)程,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2026-05-05
Go語(yǔ)言實(shí)現(xiàn)并發(fā)控制的常見(jiàn)方式詳解
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言實(shí)現(xiàn)并發(fā)控制的幾種常見(jiàn)方式,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下2024-03-03
一文帶你了解Go語(yǔ)言fmt標(biāo)準(zhǔn)庫(kù)輸出函數(shù)的使用
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中 fmt 標(biāo)準(zhǔn)庫(kù)輸出函數(shù)的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12
Golang 定時(shí)器的終止與重置實(shí)現(xiàn)
在實(shí)際開(kāi)發(fā)過(guò)程中,我們有時(shí)候需要編寫(xiě)一些定時(shí)任務(wù)。很多人都熟悉定時(shí)器的使用,那么定時(shí)器應(yīng)該如何終止與重置,下面我們就一起來(lái)了解一下2021-08-08
使用Go語(yǔ)言計(jì)算字符串編輯距離的代碼實(shí)現(xiàn)
在自然語(yǔ)言處理、拼寫(xiě)糾錯(cuò)、模糊搜索等場(chǎng)景中,我們經(jīng)常需要衡量?jī)蓚€(gè)字符串之間的相似度,編輯距離(Edit Distance) 就是一個(gè)經(jīng)典的衡量方式,它描述了將一個(gè)字符串轉(zhuǎn)換為另一個(gè)字符串所需的最少操作次數(shù),本文給大家介紹了如何使用Go語(yǔ)言計(jì)算字符串編輯距離2025-07-07
GO語(yǔ)言中創(chuàng)建切片的三種實(shí)現(xiàn)方式
這篇文章主要介紹了GO語(yǔ)言中創(chuàng)建切片的三種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
GO將mysql?中?decimal?數(shù)據(jù)類(lèi)型映射到?protobuf的操作方法
這篇文章主要介紹了go如何優(yōu)雅地將?mysql?中?decimal?數(shù)據(jù)類(lèi)型映射到?protobuf,本文主要展示一下在 protobuf中 float與double的一個(gè)區(qū)別,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
Go語(yǔ)言做爬蟲(chóng)狀態(tài)碼返回418的問(wèn)題解決
在使用Go語(yǔ)言做爬蟲(chóng)時(shí),使用http.Get(url)去獲取網(wǎng)頁(yè)內(nèi)容,狀態(tài)碼返回404,本文我們就詳細(xì)的介紹一下解決方法,感興趣的可以了解一下2021-12-12

