it编程 > 前端脚本 > Golang

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

2人参与 2025-04-24 Golang

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

1./xuri/excelize/v2

xuri/excelize 是一个用于操作 excel 文件的第三方库,可以通过以下方式导入:

import "/xuri/excelize/v2"

xuri/excelize 是 go 语言社区中最受欢迎的 excel 文件操作库之一,它提供了丰富的功能,可以用于读取、修改和创建 excel 文件,包括但不限于以下功能:

以下是 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 企业安全组(360 enterprise security group)开发的一个 excel 文件处理库,可以使用以下方式导入:

import "/360entsecgroup-skylar/excelize/v2"

相较于 xuri/excelize,360entsecgroup-skylar/excelize 提供了更多的功能,包括但不限于以下功能:

以下是 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()
    }
}

实战:

// @description: sharedimport 导入
// @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.总结

/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数据更新数据库

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("这个程序会打印输入的内容,输入'exit()' 退出程序!")
	// fmt.println("请输入内容:")
	input := bufio.newscanner(os.stdin)
	for {

		fmt.println("=================!开始转换!=====================================")

		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("开始加载数据库......")

		var sheel = "sheet1"

		// 获取 sheet1 上所有单元格
		rows, err := f.getrows(sheel)
		if err != nil {
			fmt.println(err)
			return
		}

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

		// 获取信息
		for i, _ := range rows {
			// 如果有标题或者表头要跳过
			if i < 1 {
				continue
			}
			// 获取单元格数据
			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
			)

			// 数据库查询
			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)
				}
			}

			// 数据库更新
			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("--------------------- !转换完成!---------------------------")
	}
	return
}

golang获取excel中的指定列数据

获取golang中指定列数据

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++
					}
				}
			}
		}
	}

	//	对存在的量进行重新矫正,以解决初始变量长度问题
	res_len := 0
	for _, coli := range colindex {
		if coli-1 >= 0 {
			res_len++
		}
	}

	// 获取数据
	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
}

到此这篇关于golang实现读取excel数据并导入数据库的文章就介绍到这了,更多相关go读取excel数据导入数据库内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

Go实现一个轻量级并发任务调度器(支持限速)

04-24

一文弄懂用Go实现MCP服务的示例代码

04-24

Go 跨域中间件解决CORS问题

04-24

Go语言实现优雅关机和重启的示例详解

04-24

Go语言实现Viper配置管理笔记

04-24

一文带你学会使用Go语言实现自己的MCP服务端

04-24

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论