欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang實(shí)現(xiàn)讀取excel數(shù)據(jù)并導(dǎo)入數(shù)據(jù)庫

 更新時間:2025年04月21日 10:54:39   作者:阿友不錯哦  
Go 語言是一門適合用于編寫高效且并發(fā)的 Web 應(yīng)用程序的編程語言,同時也可以使用它進(jìn)行數(shù)據(jù)處理和分析,本文主要介紹了如何通過go語言實(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)文章

  • Go語言中的函數(shù)詳解

    Go語言中的函數(shù)詳解

    函數(shù)是基本的代碼塊,用于執(zhí)行一個任務(wù)。本文詳細(xì)講解了Go語言中的函數(shù),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • GO?集合?map?使用示例小結(jié)

    GO?集合?map?使用示例小結(jié)

    Go語言的集合稱為映射(map),它是一種無序的鍵值對(key-value)的集合,集合是通過鍵(key)來快速檢索值(value)的,鍵(key)類似于索引,它指向值(value)的數(shù)據(jù),這篇文章主要介紹了GO集合map使用總結(jié),本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Go設(shè)計模式之單例模式講解和代碼示例

    Go設(shè)計模式之單例模式講解和代碼示例

    單例是一種創(chuàng)建型設(shè)計模式,讓你能夠保證一個類只有一個實(shí)例,并提供一個訪問該實(shí)例的全局節(jié)點(diǎn),本文就通過代碼示例給大家講講Go單例模式,需要的朋友可以參考下
    2023-07-07
  • 一文帶你了解Go語言中鎖的實(shí)現(xiàn)

    一文帶你了解Go語言中鎖的實(shí)現(xiàn)

    這篇文章主要帶大家一起學(xué)習(xí)一下go鎖和讀寫鎖的總結(jié)文檔,?主要從"參考"部分的文章結(jié)合源碼學(xué)習(xí),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • 一文深入探討Go語言中的if-else語句

    一文深入探討Go語言中的if-else語句

    在Go語言中,條件語句的使用方式相對簡潔明了,所以本文將探討一下如何在Go程序中有效地進(jìn)行條件判斷和邏輯控制,感興趣的小伙伴可以了解下
    2023-08-08
  • Golang實(shí)現(xiàn)將視頻按照時間維度剪切的工具

    Golang實(shí)現(xiàn)將視頻按照時間維度剪切的工具

    這篇文章主要為大家詳細(xì)介紹了如何利用Golang實(shí)現(xiàn)將視頻按照時間維度進(jìn)行剪切,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • Golang 按行讀取文件的三種方法小結(jié)

    Golang 按行讀取文件的三種方法小結(jié)

    本文主要介紹了Golang 按行讀取文件的三種方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Golang多線程爬蟲高效抓取大量數(shù)據(jù)的利器

    Golang多線程爬蟲高效抓取大量數(shù)據(jù)的利器

    Golang多線程爬蟲是一種高效抓取大量數(shù)據(jù)的利器。Golang語言天生支持并發(fā)和多線程,可以輕松實(shí)現(xiàn)多線程爬蟲的開發(fā)。通過使用Golang的協(xié)程和通道,可以實(shí)現(xiàn)爬蟲的高效并發(fā)抓取、數(shù)據(jù)處理和存儲
    2023-05-05
  • go?colly?爬蟲實(shí)現(xiàn)示例

    go?colly?爬蟲實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了go?colly?爬蟲實(shí)現(xiàn)示例,效果是根據(jù)輸入的瀏覽器cookie及excel必要行列號,從excel中讀取公司名稱,查詢公司法人及電話號碼。并寫回到excel中指定行
    2022-09-09
  • Go語言小白入門刷題打印輸出沙漏

    Go語言小白入門刷題打印輸出沙漏

    這篇文章主要介紹了Go語言刷題打印輸出沙漏的示例過程詳解,非常適合剛?cè)腴TGo語言的小白學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11

最新評論