golang使用excelize库操作excel文件的方法详解
脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用
今天我们讲一下使用excelize操作excel,首先熟悉一下excel的文件构成,excel分为以下结构:
1. excel文件,2. sheet页, 3. 行row, 4. 列col, 5. 项cell
对应结构如下图:
1. 准备工作
我们读取的文件格式如上图所示, 我们先定义一个StockInfo结构来存储相应字段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | type StockInfo struct { ID uint64 `gorm: "primaryKey;autoIncrement" ` CompanyNo string `gorm: "column:company_no" ` CompanyAbbr string `gorm: "column:company_abbr" ` StockNo string `gorm: "column:stock_no" ` StockName string `gorm: "column:stock_name" ` ListingTime time.Time `gorm: "column:listing_time" ` GmtCreate time.Time `gorm: "column:gmt_create" ` GmtModified time.Time `gorm: "column:gmt_modified" ` } func (stock *StockInfo) TableName() string { return "stock_info" } |
这里我们会使用gorm将数据存储到数据库,所以这里我们添加了gorm的标签。
安装excelize库:
2. 使用excelize读取excel文件
操作步骤:
1.先获取文件excel.File对象,excelize提供了两个函数获取文件File对象
1 2 | func OpenFile(filename string , opt ...Options) (*File, error ) func OpenReader(r io.Reader, opt ...Options) (*File, error ) |
这里我们使用如下方式获取File实例:
1 2 3 4 | file, err := excelize.OpenFile( "stock.xlsx" ) if err != nil { log.Fatalf( "open excel file err, error:%+v\n" , err) } |
亦可以使用如下方式:
1 2 3 4 5 6 7 8 9 | fileReader,err := os.OpenFile( "stock.xlsx" , os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666 ) if err != nil { log.Fatalf( "open excel file err, error:%+v\n" , err) } file, err := excelize.OpenReader(fileReader) if err != nil { log.Fatalf( "open excel file err, error:%+v\n" , err) } |
2.获取sheet, excelize库提供了如下操作的sheet的函数
1 2 3 4 5 6 7 8 | // 根据sheet的名称获取sheet的索引 func (f *File) GetSheetIndex(name string ) int // 根据sheet的索引获取sheet的名称 func (f *File) GetSheetName(index int ) (name string ) // 获取所有sheet的名称列表 func (f *File) GetSheetList() (list [] string ) // 获取所有sheet的索引对应的名称集合 func (f *File) GetSheetMap() map [ int ] string |
这里我们我先通过GetSheetList获取所有的sheet名称列表,然后对每个sheet进行操作
3.读取excel中数据
读取方式一:直接读取Row和Col的数据二维数组,然后进行读取操作,使用如下函数
下面代码实现按行列读取,将读取到的集合以StockInfo的结构存放到Slice
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | func GetStockList1(file *excelize.File) ([]StockInfo, error ){ var list []StockInfo for _,sheetName := range file.GetSheetList() { rows, err := file.GetRows(sheetName) if err != nil { log.Printf( "excel get rows error, err:%+v\n" , err) return nil , err } for index, row := range rows { // 跳过第一行标题 if index == 0 { continue } lt, err := time.Parse( "2006-01-02" , strings.TrimSpace(row[ 4 ])) if err != nil { return nil , err } list = append (list, StockInfo{ CompanyNo: row[ 0 ], CompanyAbbr: row[ 1 ], StockNo: row[ 2 ], StockName: row[ 3 ], ListingTime: lt, GmtCreate: time.Now(), }) } } return list, nil } |
读取方式二:使用Rows函数,返回Rows的对象进行操作, 函数原型如下:
然后配合Rows对象的Next方法和Columns方法,获取列数据,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | func GetStockList2(file *excelize.File) ([]StockInfo, error ){ var list []StockInfo for _,sheetName := range file.GetSheetList() { rows, err := file.Rows(sheetName) if err != nil { return nil , err } for rows.Next() { // 这里读到第一行标题的时候,跳过 if rows.CurrentRow() == 1 { // 这一句一定要调用,否则两列数据叠加在一起 rows.Columns() continue } // 获取当前行的列 cols,_ := rows.Columns() // 按列进行处理 lt, _ := time.Parse( "2006-01-02" , strings.TrimSpace(cols[ 4 ])) list = append (list, StockInfo{ CompanyNo: strings.TrimSpace(cols[ 0 ]) , CompanyAbbr: strings.TrimSpace(cols[ 1 ]), StockNo: strings.TrimSpace(cols[ 2 ]), StockName: strings.TrimSpace(cols[ 3 ]), ListingTime: lt, GmtCreate: time.Now(), }) } } return list, nil } |
读取方式三:使用GetCellValue函数,根据具体的sheet和Cell的行和列名称进行获取Cell值,GetCellValue函数如下:
直接使用file的GetCellValue的函数操作,使用excel的"A2","E4"这种行列定位cell的方法进行操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | func GetStockList3(file *excelize.File) ([]StockInfo, error ){ var list []StockInfo for _,sheetName := range file.GetSheetList() { rows, err := file.Rows(sheetName) if err != nil { return nil , err } // 从第二行开始读取 for i := 2 ; i <= rows.TotalRows(); i++ { // 根据sheet中Cell的位置获取,例如A1表示第一行的第一列 companyNo, _ := file.GetCellValue(sheetName,fmt.Sprintf( "A%d" ,i)) companyAbbr, _ := file.GetCellValue(sheetName,fmt.Sprintf( "B%d" ,i)) stockNo, _ := file.GetCellValue(sheetName,fmt.Sprintf( "C%d" ,i)) stockName, _ := file.GetCellValue(sheetName,fmt.Sprintf( "D%d" ,i)) cell4, err := file.GetCellValue(sheetName, fmt.Sprintf( "E%d" ,i)) if err != nil { log.Printf( "get cell error, err:%+v\n" , err) } lt, _ := time.Parse( "2006-01-02" , strings.TrimSpace(cell4)) list = append (list, StockInfo{ CompanyNo: companyNo , CompanyAbbr: companyAbbr, StockNo: stockNo, StockName: stockName, ListingTime: lt, GmtCreate: time.Now(), }) } } return list, nil } |
4.数据读取成功后,我们使用gorm将数据存储到数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | dsn := "root:root@tcp(127.0.0.1:3306)/stock?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { log.Fatalf( "connect mysql error:%+v\n" ,err) } file, err := excelize.OpenFile( "stock.xlsx" ) if err != nil { log.Fatalf( "open excel file err, error:%+v\n" , err) } list1, err := GetStockList3(file) if err != nil { log.Fatalf( "get stock list1 error:%+v\n" , err) } log.Printf( "read stock list:%+v\n" , list1) defer file. Close () db.Omit( "GmtModified" ).Create(&list1) |
3. 使用excelize将数据写入excel文件
操作步骤:
1.首先我们从mysql数据库,将上面例子从的数据库读出来
1 2 3 4 5 6 7 8 9 10 11 | dsn := "root:root@tcp(127.0.0.1:3306)/stock?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { log.Fatalf( "connect mysql error:%+v\n" ,err) } var stocks []StockInfo db.Find(&stocks) log.Printf( "stocks:%+v\n" , stocks) |
2.创建excelize的file对象,用来操作excel文件
3.将数据写入到excel
写入方式一: 按行添加数据方法:
第一个参数为sheet的名称,第二个参数表示从哪一列开始,第三个参数为连续写入的列的slice,代码如下:
1 2 3 4 5 6 7 8 9 10 11 | func WriteToExcel1(file *excelize.File, stocks []StockInfo) error { rowsCount := len (stocks) for i := 1 ; i <= rowsCount ;i++ { ex file.SetSheetRow( "stock" ,fmt.Sprintf( "A%d" ,i),&[] interface {}{stocks[i- 1 ].CompanyNo, stocks[i- 1 ].CompanyAbbr, stocks[i- 1 ].StockNo, stocks[i- 1 ].StockName}) } return nil } |
写入方式二: 按Cell设置数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | func WriteToExcel2(file *excelize.File, stocks []StockInfo) error { rowsCount := len (stocks) for i := 1 ; i <= rowsCount ;i++ { file.SetCellStr( "stock" ,fmt.Sprintf( "A%d" ,i),stocks[i- 1 ].CompanyNo) file.SetCellValue( "stock" ,fmt.Sprintf( "B%d" ,i),stocks[i- 1 ].CompanyAbbr) file.SetCellValue( "stock" ,fmt.Sprintf( "C%d" ,i),stocks[i- 1 ].StockNo) file.SetCellValue( "stock" ,fmt.Sprintf( "D%d" ,i),stocks[i- 1 ].StockName) file.SetCellValue( "stock" ,fmt.Sprintf( "E%d" ,i),stocks[i- 1 ].ListingTime) } return nil } |
将excel数据保存到文件
4. 参考资料:
包地址:https://pkg.go.dev/github.com/xuri/excelize/v2
总结
到此这篇关于golang使用excelize库操作excel文件的文章就介绍到这了,更多相关golang excelize库操作excel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
- Go语言操作Excel利器之excelize类库详解
- 如何使用 Go 和 Excelize 构建电子表格
- Go Excelize API源码阅读GetPageLayout及SetPageMargins
- Go Excelize API源码解读GetSheetViewOptions与SetPageLayout
- Go Excelize API源码阅读SetSheetViewOptions示例解析
- Go Excelize API源码解析GetSheetFormatPr使用示例
- Go Excelize API源码阅读Close及NewSheet方法示例解析
- go中Excelize处理excel表实现带数据校验的文件导出
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
最新评论