当前位置: 首页 > news >正文

Golang导入导出Excel表格

最近项目开发中有涉及到Excel的导入与导出功能,特别是导出表格时需要特定的格式(单元格合并等),废话不多说,直接上代码了。

首先用到一个第三方库,实测还是很强大很好用的,就是这个https://github.com/qax-os/excelize

引用库
go get github.com/xuri/excelize/v2
导入表格
package mainimport ("encoding/json""github.com/xuri/excelize/v2""net/http""strings"
)func fileImport(w http.ResponseWriter, r *http.Request) {// 获取请求中的文件名formFile, _, err := r.FormFile("filename")if err != nil {w.Write([]byte("获取文件失败, " + err.Error()))return}// 关闭defer formFile.Close()//reader, err := excelize.OpenReader(formFile)if err != nil {w.Write([]byte("读取文件失败, " + err.Error()))return}// 关闭defer reader.Close()rows, err := reader.GetRows("Sheet1")if err != nil {w.Write([]byte("获取工作表失败, " + err.Error()))return}ret := make([]string, 0, 8)for i, row := range rows {// 每一行数据的列, 都是从0开始的, 一般0行都是表头if i == 0 {continue}value1 := row[0] // 第一列value2 := row[1] // 第二列// 去除空格value1 = strings.Trim(strings.TrimSpace(value1), "\n")value2 = strings.Trim(strings.TrimSpace(value2), "\n")//ret = append(ret, value1+","+value2)}bytes, _ := json.Marshal(ret)w.Write(bytes)return
}func main() {// HTTP服务http.HandleFunc("/fileImport", fileImport)err := http.ListenAndServe(":8192", nil)if err != nil {panic(err)}
}

表格格式
在这里插入图片描述
执行后效果
在这里插入图片描述

导出表格
package mainimport ("encoding/json""fmt""github.com/xuri/excelize/v2""net/http""strings"
)func fileExport(w http.ResponseWriter, r *http.Request) {file := excelize.NewFile()defer file.Close()// 设置页sheetName := "Sheet1"// 创建sheet, err := file.NewSheet(sheetName)if err != nil {w.Write([]byte("创建失败, " + err.Error()))return}// 设置单元格格式style := &excelize.Style{Border: nil,Fill:   excelize.Fill{},Font:   nil,Alignment: &excelize.Alignment{Horizontal:      "center",Indent:          0,JustifyLastLine: false,ReadingOrder:    0,RelativeIndent:  0,ShrinkToFit:     false,TextRotation:    0,Vertical:        "center",WrapText:        false,},Protection:    nil,NumFmt:        0,DecimalPlaces: nil,CustomNumFmt:  nil,NegRed:        false,}styleID, _ := file.NewStyle(style)// 设置表头_ = file.SetCellValue(sheetName, "A1", "款")_ = file.SetCellStyle(sheetName, "A1", "A1", styleID)_ = file.SetCellValue(sheetName, "B1", "尺码")_ = file.SetCellStyle(sheetName, "B1", "B1", styleID)// 设置值for i := 0; i < 5; i++ {lineStr := fmt.Sprintf("%d", i+2)//_ = file.SetCellValue(sheetName, "A"+lineStr, "基础款")_ = file.SetCellStyle(sheetName, "A"+lineStr, "A"+lineStr, styleID)//_ = file.SetCellValue(sheetName, "B"+lineStr, "1:2:3:4:5:6")_ = file.SetCellStyle(sheetName, "B"+lineStr, "B"+lineStr, styleID)}//file.SetActiveSheet(sheet)//buffer, err := file.WriteToBuffer()if err != nil {w.Write([]byte("导出失败, " + err.Error()))return}w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", "导出文件.xlsx"))w.Header().Set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")w.Write(buffer.Bytes())
}func main() {// HTTP服务http.HandleFunc("/fileImport", fileImport)http.HandleFunc("/fileExport", fileExport)err := http.ListenAndServe(":8192", nil)if err != nil {panic(err)}
}

页面请求 http://127.0.0.1:8192/fileExport 后会直接生成xlsx文件并下载
在这里插入图片描述

合并单元格

package mainimport ("encoding/json""fmt""github.com/xuri/excelize/v2""net/http""strings"
)func fileExport(w http.ResponseWriter, r *http.Request) {file := excelize.NewFile()defer file.Close()// 设置页sheetName := "Sheet1"// 创建sheet, err := file.NewSheet(sheetName)if err != nil {w.Write([]byte("创建失败, " + err.Error()))return}// 设置单元格格式style := &excelize.Style{Border: nil, // 边框样式Fill:   excelize.Fill{},Font:   nil, // 字体样式Alignment: &excelize.Alignment{ // 位置样式Horizontal:      "center",Indent:          0,JustifyLastLine: false,ReadingOrder:    0,RelativeIndent:  0,ShrinkToFit:     false,TextRotation:    0,Vertical:        "center",WrapText:        false,},Protection:    nil,NumFmt:        0,DecimalPlaces: nil,CustomNumFmt:  nil,NegRed:        false,}styleID, _ := file.NewStyle(style)// 设置表头_ = file.MergeCell(sheetName, "A1", "A2") // 合并单元格_ = file.SetCellValue(sheetName, "A1", "款")_ = file.SetCellStyle(sheetName, "A1", "A2", styleID)_ = file.MergeCell(sheetName, "B1", "G1") // 合并单元格_ = file.SetCellValue(sheetName, "B1", "尺码")_ = file.SetCellStyle(sheetName, "B1", "G1", styleID)_ = file.SetCellValue(sheetName, "B2", "XS")_ = file.SetCellStyle(sheetName, "B2", "B2", styleID)_ = file.SetCellValue(sheetName, "C2", "S")_ = file.SetCellStyle(sheetName, "C2", "C2", styleID)_ = file.SetCellValue(sheetName, "D2", "M")_ = file.SetCellStyle(sheetName, "D2", "D2", styleID)_ = file.SetCellValue(sheetName, "E2", "L")_ = file.SetCellStyle(sheetName, "E2", "E2", styleID)_ = file.SetCellValue(sheetName, "F2", "XL")_ = file.SetCellStyle(sheetName, "F2", "F2", styleID)_ = file.SetCellValue(sheetName, "G2", "XLL")_ = file.SetCellStyle(sheetName, "G2", "G2", styleID)// 设置值for i := 0; i < 5; i++ {lineStr := fmt.Sprintf("%d", i+3)//_ = file.SetCellValue(sheetName, "A"+lineStr, "基础款")_ = file.SetCellStyle(sheetName, "A"+lineStr, "A"+lineStr, styleID)//split := strings.Split("1:2:3:4:5:6", ":")_ = file.SetCellValue(sheetName, "B"+lineStr, split[0])_ = file.SetCellStyle(sheetName, "B"+lineStr, "B"+lineStr, styleID)_ = file.SetCellValue(sheetName, "C"+lineStr, split[1])_ = file.SetCellStyle(sheetName, "C"+lineStr, "C"+lineStr, styleID)_ = file.SetCellValue(sheetName, "D"+lineStr, split[2])_ = file.SetCellStyle(sheetName, "D"+lineStr, "D"+lineStr, styleID)_ = file.SetCellValue(sheetName, "E"+lineStr, split[3])_ = file.SetCellStyle(sheetName, "E"+lineStr, "E"+lineStr, styleID)_ = file.SetCellValue(sheetName, "F"+lineStr, split[4])_ = file.SetCellStyle(sheetName, "F"+lineStr, "F"+lineStr, styleID)_ = file.SetCellValue(sheetName, "G"+lineStr, split[5])_ = file.SetCellStyle(sheetName, "G"+lineStr, "G"+lineStr, styleID)}//file.SetActiveSheet(sheet)//buffer, err := file.WriteToBuffer()if err != nil {w.Write([]byte("导出失败, " + err.Error()))return}// 设置文件名w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", "导出文件.xlsx"))// 导出的文件格式 xlsx 或者 xsl// xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet// xls application/vnd.ms-excelw.Header().Set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")w.Write(buffer.Bytes())
}func main() {// HTTP服务http.HandleFunc("/fileImport", fileImport)http.HandleFunc("/fileExport", fileExport)err := http.ListenAndServe(":8192", nil)if err != nil {panic(err)}
}

页面请求 http://127.0.0.1:8192/fileExport 后会直接生成xlsx文件并下载
在这里插入图片描述

http://www.lryc.cn/news/257425.html

相关文章:

  • 基于Maven的Spring Boot应用版本号获取解析
  • LLM微调(二)| 微调LLAMA-2和其他开源LLM的两种简单方法
  • AVP对纵向控制ESP(Ibooster)的需求规范
  • 小模型学习(1)-人脸识别
  • sublime Text使用
  • 基于深度学习的yolov7植物病虫害识别及防治系统
  • Leetcode 2963. Count the Number of Good Partitions
  • C语言动态内存经典笔试题分析
  • 截断正态分布stats.truncnorm()X.rvs(10000)
  • 第59天:django学习(八)
  • 举例说明自然语言处理(NLP)技术。
  • echarts地图marker自定义图标并添加点击事件
  • C盘瘦身,C盘清理
  • STM32F103
  • Unity使用打成图集的Sprite作为模型贴图使用的问题
  • el-select赋值对象是对象时,出现赋值与展示不一致问题
  • 在 Node-RED 中引入 ECharts 实现数据可视化
  • docker资源限制
  • 探索HarmonyOS_开发软件安装
  • CSS中控制元素水平布局的七个属性
  • YOLOv8改进 | 2023检测头篇 | 利用AFPN改进检测头适配YOLOv8版(全网独家创新)
  • 测试经理的职责是什么?
  • LinuxBasicsForHackers笔记 -- BASH 脚本
  • 定时任务特辑 | Quartz、xxl-job、elastic-job、Cron四个定时任务框架对比,和Spring Boot集成实战
  • 【面试经典150 | 二叉树】对称二叉树
  • 使用Git进行版本控制
  • 专业课145+总分440+东南大学920考研专业基础综合信号与系统数字电路经验分享
  • Leetcode每日一题
  • USB连接器
  • 软件工程之需求分析