• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    golang实现读取excel数据并导入数据库

    发布者: 涵韵3588 | 发布时间: 2025-8-14 14:37| 查看数: 17| 评论数: 0|帖子模式

    Go 语言是一门适合用于编写高效且并发的 Web 应用程序的编程语言,同时也可以使用它进行数据处理和分析。在数据处理和分析过程中,Excel 是一种常用的电子表格软件,很多情况下需要将数据导入到 Excel 中进行分析和处理。在 Go 语言中,可以使用两种不同的 excelize 包来操作 Excel 文件,分别是 xuri/excelize 和 360EntSecGroup-Skylar/excelize。

    1./xuri/excelize/v2

    xuri/excelize 是一个用于操作 Excel 文件的第三方库,可以通过以下方式导入:
    1. import "/xuri/excelize/v2"
    复制代码
    xuri/excelize 是 Go 语言社区中最受欢迎的 Excel 文件操作库之一,它提供了丰富的功能,可以用于读取、修改和创建 Excel 文件,包括但不限于以下功能:

    • 读取 Excel 文件中的数据
    • 修改 Excel 文件中的数据
    • 在 Excel 文件中插入图片
    • 在 Excel 文件中添加图表
    • 在 Excel 文件中设置打印选项
    • 对 Excel 文件进行加密
    • 提供更多的文件格式支持(例如 CSV、XML)
    以下是 xuri/excelize 读取 Excel 文件的示例代码:
    1. package main

    2. import (
    3.     "fmt"

    4.     "/xuri/excelize/v2"
    5. )

    6. func main() {
    7.     file, err := excelize.OpenFile("Book1.xlsx")
    8.     if err != nil {
    9.         fmt.Println(err)
    10.         return
    11.     }

    12.     cells := file.GetRows("Sheet1")
    13.     for _, row := range cells {
    14.         for _, colCell := range row {
    15.             fmt.Print(colCell, "\t")
    16.         }
    17.         fmt.Println()
    18.     }
    19. }
    复制代码
    2./360EntSecGroup-Skylar/excelize/v2

    360EntSecGroup-Skylar/excelize 是由 360 企业安全组(360 Enterprise Security Group)开发的一个 Excel 文件处理库,可以使用以下方式导入:
    1. import "/360EntSecGroup-Skylar/excelize/v2"
    复制代码
    相较于 xuri/excelize,360EntSecGroup-Skylar/excelize 提供了更多的功能,包括但不限于以下功能:

    • 读取 Excel 文件中的数据
    • 修改 Excel 文件中的数据
    • 在 Excel 文件中插入图片
    • 在 Excel 文件中添加图表
    • 在 Excel 文件中设置打印选项
    • 对 Excel 文件进行加密
    • 提供更多的文件格式支持(例如 CSV、XML)
    • 提供更多的单元格格式化选项(例如设置单元格样式、设置单元格宽度和高度)
    以下是 360EntSecGroup-Skylar/excelize 读取 Excel 文件的示例代码:
    1. package main

    2. import (
    3.     "fmt"

    4.     "/360EntSecGroup-Skylar/excelize/v2"
    5. )

    6. func main() {
    7.     file, err := excelize.OpenFile("Book1.xlsx")
    8.     if err != nil {
    9.         fmt.Println(err)
    10.         return
    11.     }

    12.     cells := file.GetRows("Sheet1")
    13.     for _, row := range cells {
    14.         for _, colCell := range row {
    15.             fmt.Print(colCell, "\t")
    16.         }
    17.         fmt.Println()
    18.     }
    19. }
    复制代码
    实战:
    1. // @description: SharedImport 导入
    2. // @param {string} filePath
    3. // @param {int64} commitID
    4. // @param {http.Header} header
    5. // @return {*}
    6. func SharedImport(filePath, fileName string, commitID int64, header http.Header) (int64, error) {
    7.     plog.Info("SharedImport", "processing cpp file with file path specified: %v", filePath)
    8.     f, err := excelize.OpenFile(filePath)
    9.     if err != nil {
    10.         plog.Error("", "%v", err)
    11.         return -1, err
    12.     }
    13.     sheetList := garray.NewStrArrayFrom(f.GetSheetList())
    14.     plog.Info("SharedImport", "share file contains sheet list: %v", sheetList.Slice())
    15.     if sheetList.Contains(sharedbilltype.SHARE_INFOMATION_CN) {
    16.         plog.Info("SharedImport", "processing CN share template, finding key cells with chinese")
    17.         err = ShareCNImport(f, filePath, fileName, commitID, header)
    18.         if err != nil {
    19.             plog.Error("", "%v", err)
    20.             return -1, err
    21.         }
    22.         return commitID, nil
    23.     } else if sheetList.Contains(sharedbilltype.SHARE_INFOMATION_EN) {
    24.         plog.Info("SharedImport", "processing EN share template, finding key cells with english")
    25.         err = ShareENImport(f, filePath, fileName, commitID, header)
    26.         if err != nil {
    27.             plog.Error("", "%v", err)
    28.             return -1, err
    29.         }
    30.         return commitID, nil
    31.     } else {
    32.         msgCN := sharedbilltype.ERR_INVALID_SHARE_TEMPLATE_CN
    33.         msgEN := sharedbilltype.ERR_INVALID_SHARE_TEMPLATE_EN
    34.         overviewMsgCN := sharedbilltype.ERR_OVERVIEW_WRONG_FILE_CN
    35.         overviewMsgEN := sharedbilltype.ERR_OVERVIEW_WRONG_FILE_EN
    36.         plog.Warn("SharedImport", msgCN)
    37.         plog.Warn("SharedImport", msgEN)
    38.         plog.Warn("SharedImport", overviewMsgCN)
    39.         plog.Warn("SharedImport", overviewMsgEN)
    40.         err = sharedbillrdb.SaveTInfShareMainValidate([]*sharedbilltype.TableTInfBillShareMainValidate{
    41.             NewInvalidFormatRecord(filePath, commitID, msgCN, msgEN, 0, "", 0, "", 0, "", header, fileName),
    42.             NewInvalidFormatOverviewRecord(filePath, commitID, 0, 0, overviewMsgCN, overviewMsgEN, header, fileName),
    43.         })
    44.         if err != nil {
    45.             plog.Error("", "%v", err)
    46.             return -1, err
    47.         }
    48.         return commitID, nil
    49.     }
    50. }
    复制代码
    3.总结

    /xuri/excelize/v2 和 /360EntSecGroup-Skylar/excelize/v2 都是 Golang 中用于操作 Excel 文件的库,它们的区别在于它们是由不同的开发者维护的,它们的功能、性能和使用方式也略有不同。
    /xuri/excelize/v2 是由 Xuri 开发的 Excel 文件处理库,它可以读取、写入和编辑 XLSX 格式的 Excel 文件,支持大量的 Excel 功能,如图表、数据透 视表、条件格式等,同时还提供了对 PDF 和 HTML 导出的支持。这个库的使用文档详细,具有良好的可维护性和易用性。
    /360EntSecGroup-Skylar/excelize/v2 是由 360 安全团队开发的 Excel 文件处理库,它也可以读取、写入和编辑 XLSX 格式的 Excel 文件,支持大量的 Excel 功能,如公式、图表、数据透 视表、条件格式等,同时还提供了对 CSV、TSV 和 JSON 导出的支持。这个库的使用文档相对较少,但是它具有很好的性能和稳定性。
    因此,选择使用哪个 Excel 处理库取决于您的需求和偏好。如果您需要处理较为复杂的 Excel 文件并导出到 PDF 或 HTML 文件中,那么您可以选择 /xuri/excelize/v2;如果您需要快速处理大量的 Excel 文件并导出到 CSV、TSV 或 JSON 文件中,那么您可以选择 /360EntSecGroup-Skylar/excelize/v2。

    4.知识延展

    golang获取Excel数据更新数据库
    1. package main

    2. import (
    3.         "bufio"
    4.         "database/sql"
    5.         "fmt"
    6.         "os"
    7.         "path/filepath"
    8.         "strconv"
    9.         "strings"

    10.         _ "github.com/alexbrainman/odbc"
    11.         "github.com/xuri/excelize/v2"
    12.         // "encoding/json"
    13.         // "reflect"
    14. )

    15. func main() {

    16.         chuliYuanExecl()
    17. }

    18. func chuliYuanExecl() {

    19.         fmt.Println("这个程序会打印输入的内容,输入'exit()' 退出程序!")
    20.         // fmt.Println("请输入内容:")
    21.         input := bufio.NewScanner(os.Stdin)
    22.         for {

    23.                 fmt.Println("=================!开始转换!=====================================")

    24.                 db, err := sql.Open("odbc", "driver={sql server};server=127.0.0.1;port=1433;uid=xx;pwd=xxx;database=xxx")
    25.                 if err != nil {
    26.                         fmt.Printf(err.Error())
    27.                 }

    28.                 fmt.Print("输入文件 >> ")
    29.                 input.Scan()
    30.                 if strings.Compare(strings.TrimSpace(input.Text()), "") == 0 {
    31.                         continue
    32.                 }
    33.                 if strings.Compare(strings.TrimSpace(input.Text()), "exit()") == 0 {
    34.                         os.Exit(0)
    35.                 }
    36.                 fmt.Println("你输入的文件是:", strings.Replace(strings.Replace(strings.Replace(strings.Replace(input.Text(), "& '", "", 1), "'", "", 1), "”", "", 1), "“", "", 1))
    37.                 yuanPath := strings.Replace(strings.Replace(strings.Replace(strings.Replace(input.Text(), "& '", "", 1), "'", "", 1), "”", "", 1), "“", "", 1)
    38.                 f, err := excelize.OpenFile(yuanPath)
    39.                 if err != nil {
    40.                         fmt.Println(err)
    41.                         return
    42.                 }
    43.                 defer func() {
    44.                         if err := f.Close(); err != nil {
    45.                                 fmt.Println(err)
    46.                         }
    47.                 }()

    48.                 fmt.Println("开始加载数据库......")

    49.                 var sheel = "Sheet1"

    50.                 // 获取 Sheet1 上所有单元格
    51.                 rows, err := f.GetRows(sheel)
    52.                 if err != nil {
    53.                         fmt.Println(err)
    54.                         return
    55.                 }

    56.                 fmt.Println("正在更新数据库请等待......")

    57.                 // 获取信息
    58.                 for i, _ := range rows {
    59.                         // 如果有标题或者表头要跳过
    60.                         if i < 1 {
    61.                                 continue
    62.                         }
    63.                         // 获取单元格数据
    64.                         djbh, err := f.GetCellValue(sheel, "A"+strconv.Itoa(i+1))
    65.                         if err != nil {
    66.                                 fmt.Println(err)
    67.                                 return
    68.                         }
    69.                         szdbh, err := f.GetCellValue(sheel, "E"+strconv.Itoa(i+1))
    70.                         if err != nil {
    71.                                 fmt.Println(err)
    72.                                 return
    73.                         }
    74.                         bm, err := f.GetCellValue(sheel, "G"+strconv.Itoa(i+1))
    75.                         if err != nil {
    76.                                 fmt.Println(err)
    77.                                 return
    78.                         }
    79.                         szdzd, err := f.GetCellValue(sheel, "H"+strconv.Itoa(i+1))
    80.                         if err != nil {
    81.                                 fmt.Println(err)
    82.                                 return
    83.                         }
    84.                         djzd, err := f.GetCellValue(sheel, "I"+strconv.Itoa(i+1))
    85.                         if err != nil {
    86.                                 fmt.Println(err)
    87.                                 return
    88.                         }

    89.                         if djbh == "" {
    90.                                 continue
    91.                         }
    92.                         if szdbh == "" {
    93.                                 continue
    94.                         }
    95.                         if bm == "" {
    96.                                 continue
    97.                         }
    98.                         if szdzd == "" {
    99.                                 continue
    100.                         }
    101.                         if djzd == "" {
    102.                                 continue
    103.                         }

    104.                         var (
    105.                                 CGPHID  string
    106.                         )

    107.                         // 数据库查询
    108.                         var whcgphsql = `SELECT
    109.                                         a.ITEM_BUSINESS_ID
    110.                                 FROM
    111.                                         ITEM_PURCHASE a
    112.                                         LEFT JOIN ITEM b ON a.ITEM_ID= b.ITEM_BUSINESS_ID
    113.                                 WHERE
    114.                                         b.ITEM_CODE= '` + djbh + `'`

    115.                         dhuserrows, err := db.Query(whcgphsql)
    116.                         defer dhuserrows.Close()
    117.                         for dhuserrows.Next() {
    118.                                 err := dhuserrows.Scan(&CGPHID)
    119.                                 if err != nil {
    120.                                         fmt.Println(err)
    121.                                 }
    122.                         }

    123.                         // 数据库更新
    124.                         var xssql = `UPDATE ` + bm + ` SET ` + szdzd + `='` + szdbh + `' WHERE ` + djzd + `='` + CGPHID + `'`
    125.                         fmt.Println(xssql)
    126.                         x, err := db.Exec(xssql)
    127.                         if err != nil {
    128.                                 fmt.Println("UPDATE failed:", err.Error(), x)
    129.                         }
    130.                 }
    131.                 fmt.Println("--------------------- !转换完成!---------------------------")
    132.         }
    133.         return
    134. }
    复制代码
    golang获取excel中的指定列数据
    获取golang中指定列数据
    1. func ValueLoc(excel_path, sheet_name string, cols []string) [][]string{
    2.         xlsx, err := excelize.OpenFile(excel_path)
    3.         if err != nil {
    4.                 os.Exit(1)
    5.                 return
    6.         }

    7.         rows := xlsx.GetRows(sheet_name)
    8.         colIndex := make([]int, len(cols))

    9.         // 获取每个col的所在序列号
    10.         for index, row := range rows {
    11.                 if index == 0 {
    12.                         num := 0
    13.                         for _, col := range cols {
    14.                                 for key, colCell := range row {
    15.                                         if colCell == col {
    16.                                                 colIndex[num] = key + 1
    17.                                                 num++
    18.                                         }
    19.                                 }
    20.                         }
    21.                 }
    22.         }

    23.         //        对存在的量进行重新矫正,以解决初始变量长度问题
    24.         res_len := 0
    25.         for _, coli := range colIndex {
    26.                 if coli-1 >= 0 {
    27.                         res_len++
    28.                 }
    29.         }

    30.         // 获取数据
    31.         res_data := make([][]string, len(rows)-1)
    32.         res_index := 0
    33.         for index, row := range rows {
    34.                 if index != 0 {
    35.                         data := make([]string, res_len)
    36.                         for i, colindex := range colIndex {
    37.                                 for key, colCell := range row {
    38.                                         if key == colindex-1 {
    39.                                                 data[i] = colCell
    40.                                         }
    41.                                 }
    42.                         }
    43.                         res_data[res_index] = data
    44.                         res_index++
    45.                 }
    46.         }
    47.         return res_data
    48. }
    复制代码
    到此这篇关于golang实现读取excel数据并导入数据库的文章就介绍到这了,更多相关go读取excel数据导入数据库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表