设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间13 现在时间13 缓存数据 当初听了胡歌的光棍结果单身到现在,现在听完这首歌我突然害怕了起来[生病]

当初听了胡歌的光棍结果单身到现在,现在听完这首歌我突然害怕了起来[生病] -- 好几年

查看: 808|回复: 1

基于Golang实现Excel表格的导入导出功能

[复制链接]

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
32
主题
22
精华
0
金钱
87
积分
56
注册时间
2023-10-3
最后登录
2025-5-31

发表于 2024-5-23 06:10:22 来自手机 | 显示全部楼层 |阅读模式
最近项目开发中有涉及到Excel的导入与导出功能,特别是导出表格时需要特定的格式(单元格合并等),废话不多说,直接上代码了。
首先用到一个第三方库,实测还是很强大很好用的,就是这个https://github.com/qax-os/excelize
引用库
  1. go get github.com/xuri/excelize/v2
复制代码
导入表格
  1. package main

  2. import (
  3.   "encoding/json"
  4.   "github.com/xuri/excelize/v2"
  5.   "net/http"
  6.   "strings"
  7. )

  8. func fileImport(w http.ResponseWriter, r *http.Request) {
  9.   // 获取请求中的文件名
  10.   formFile, _, err := r.FormFile("filename")
  11.   if err != nil {
  12.     w.Write([]byte("获取文件失败, " + err.Error()))
  13.     return
  14.   }
  15.   // 关闭
  16.   defer formFile.Close()
  17.   //
  18.   reader, err := excelize.OpenReader(formFile)
  19.   if err != nil {
  20.     w.Write([]byte("读取文件失败, " + err.Error()))
  21.     return
  22.   }
  23.   // 关闭
  24.   defer reader.Close()
  25.   rows, err := reader.GetRows("Sheet1")
  26.   if err != nil {
  27.     w.Write([]byte("获取工作表失败, " + err.Error()))
  28.     return
  29.   }
  30.   ret := make([]string, 0, 8)
  31.   for i, row := range rows {
  32.     // 每一行数据的列, 都是从0开始的, 一般0行都是表头
  33.     if i == 0 {
  34.       continue
  35.     }
  36.     value1 := row[0] // 第一列
  37.     value2 := row[1] // 第二列
  38.     // 去除空格
  39.     value1 = strings.Trim(strings.TrimSpace(value1), "\n")
  40.     value2 = strings.Trim(strings.TrimSpace(value2), "\n")
  41.     //
  42.     ret = append(ret, value1+","+value2)
  43.   }
  44.   bytes, _ := json.Marshal(ret)
  45.   w.Write(bytes)
  46.   return
  47. }

  48. func main() {
  49.   // HTTP服务
  50.   http.HandleFunc("/fileImport", fileImport)
  51.   err := http.ListenAndServe(":8192", nil)
  52.   if err != nil {
  53.     panic(err)
  54.   }
  55. }
复制代码
表格格式
1.png

执行后效果
2.png

导出表格
  1. package main

  2. import (
  3.   "encoding/json"
  4.   "fmt"
  5.   "github.com/xuri/excelize/v2"
  6.   "net/http"
  7.   "strings"
  8. )

  9. func fileExport(w http.ResponseWriter, r *http.Request) {
  10.   file := excelize.NewFile()
  11.   defer file.Close()

  12.   // 设置页
  13.   sheetName := "Sheet1"
  14.   // 创建
  15.   sheet, err := file.NewSheet(sheetName)
  16.   if err != nil {
  17.     w.Write([]byte("创建失败, " + err.Error()))
  18.     return
  19.   }
  20.   // 设置单元格格式
  21.   style := &excelize.Style{
  22.     Border: nil,
  23.     Fill:   excelize.Fill{},
  24.     Font:   nil,
  25.     Alignment: &excelize.Alignment{
  26.       Horizontal:      "center",
  27.       Indent:          0,
  28.       JustifyLastLine: false,
  29.       ReadingOrder:    0,
  30.       RelativeIndent:  0,
  31.       ShrinkToFit:     false,
  32.       TextRotation:    0,
  33.       Vertical:        "center",
  34.       WrapText:        false,
  35.     },
  36.     Protection:    nil,
  37.     NumFmt:        0,
  38.     DecimalPlaces: nil,
  39.     CustomNumFmt:  nil,
  40.     NegRed:        false,
  41.   }
  42.   styleID, _ := file.NewStyle(style)
  43.   // 设置表头
  44.   _ = file.SetCellValue(sheetName, "A1", "款")
  45.   _ = file.SetCellStyle(sheetName, "A1", "A1", styleID)
  46.   _ = file.SetCellValue(sheetName, "B1", "尺码")
  47.   _ = file.SetCellStyle(sheetName, "B1", "B1", styleID)
  48.   // 设置值
  49.   for i := 0; i < 5; i++ {
  50.     lineStr := fmt.Sprintf("%d", i+2)
  51.     //
  52.     _ = file.SetCellValue(sheetName, "A"+lineStr, "基础款")
  53.     _ = file.SetCellStyle(sheetName, "A"+lineStr, "A"+lineStr, styleID)
  54.     //
  55.     _ = file.SetCellValue(sheetName, "B"+lineStr, "1:2:3:4:5:6")
  56.     _ = file.SetCellStyle(sheetName, "B"+lineStr, "B"+lineStr, styleID)
  57.   }
  58.   //
  59.   file.SetActiveSheet(sheet)
  60.   //
  61.   buffer, err := file.WriteToBuffer()
  62.   if err != nil {
  63.     w.Write([]byte("导出失败, " + err.Error()))
  64.     return
  65.   }
  66.   w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", "导出文件.xlsx"))
  67.   w.Header().Set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
  68.   w.Write(buffer.Bytes())
  69. }

  70. func main() {
  71.   // HTTP服务
  72.   http.HandleFunc("/fileImport", fileImport)
  73.   http.HandleFunc("/fileExport", fileExport)
  74.   err := http.ListenAndServe(":8192", nil)
  75.   if err != nil {
  76.     panic(err)
  77.   }
  78. }
复制代码
页面请求 http://127.0.0.1:8192/fileExport 后会直接生成xlsx文件并下载
3.png

合并单元格
  1. package main

  2. import (
  3.   "encoding/json"
  4.   "fmt"
  5.   "github.com/xuri/excelize/v2"
  6.   "net/http"
  7.   "strings"
  8. )

  9. func fileExport(w http.ResponseWriter, r *http.Request) {
  10.   file := excelize.NewFile()
  11.   defer file.Close()

  12.   // 设置页
  13.   sheetName := "Sheet1"
  14.   // 创建
  15.   sheet, err := file.NewSheet(sheetName)
  16.   if err != nil {
  17.     w.Write([]byte("创建失败, " + err.Error()))
  18.     return
  19.   }
  20.   // 设置单元格格式
  21.   style := &excelize.Style{
  22.     Border: nil, // 边框样式
  23.     Fill:   excelize.Fill{},
  24.     Font:   nil, // 字体样式
  25.     Alignment: &excelize.Alignment{ // 位置样式
  26.       Horizontal:      "center",
  27.       Indent:          0,
  28.       JustifyLastLine: false,
  29.       ReadingOrder:    0,
  30.       RelativeIndent:  0,
  31.       ShrinkToFit:     false,
  32.       TextRotation:    0,
  33.       Vertical:        "center",
  34.       WrapText:        false,
  35.     },
  36.     Protection:    nil,
  37.     NumFmt:        0,
  38.     DecimalPlaces: nil,
  39.     CustomNumFmt:  nil,
  40.     NegRed:        false,
  41.   }
  42.   styleID, _ := file.NewStyle(style)
  43.   // 设置表头
  44.   _ = file.MergeCell(sheetName, "A1", "A2") // 合并单元格
  45.   _ = file.SetCellValue(sheetName, "A1", "款")
  46.   _ = file.SetCellStyle(sheetName, "A1", "A2", styleID)

  47.   _ = file.MergeCell(sheetName, "B1", "G1") // 合并单元格
  48.   _ = file.SetCellValue(sheetName, "B1", "尺码")
  49.   _ = file.SetCellStyle(sheetName, "B1", "G1", styleID)
  50.   _ = file.SetCellValue(sheetName, "B2", "XS")
  51.   _ = file.SetCellStyle(sheetName, "B2", "B2", styleID)
  52.   _ = file.SetCellValue(sheetName, "C2", "S")
  53.   _ = file.SetCellStyle(sheetName, "C2", "C2", styleID)
  54.   _ = file.SetCellValue(sheetName, "D2", "M")
  55.   _ = file.SetCellStyle(sheetName, "D2", "D2", styleID)
  56.   _ = file.SetCellValue(sheetName, "E2", "L")
  57.   _ = file.SetCellStyle(sheetName, "E2", "E2", styleID)
  58.   _ = file.SetCellValue(sheetName, "F2", "XL")
  59.   _ = file.SetCellStyle(sheetName, "F2", "F2", styleID)
  60.   _ = file.SetCellValue(sheetName, "G2", "XLL")
  61.   _ = file.SetCellStyle(sheetName, "G2", "G2", styleID)
  62.   // 设置值
  63.   for i := 0; i < 5; i++ {
  64.     lineStr := fmt.Sprintf("%d", i+3)
  65.     //
  66.     _ = file.SetCellValue(sheetName, "A"+lineStr, "基础款")
  67.     _ = file.SetCellStyle(sheetName, "A"+lineStr, "A"+lineStr, styleID)
  68.     //
  69.     split := strings.Split("1:2:3:4:5:6", ":")
  70.     _ = file.SetCellValue(sheetName, "B"+lineStr, split[0])
  71.     _ = file.SetCellStyle(sheetName, "B"+lineStr, "B"+lineStr, styleID)
  72.     _ = file.SetCellValue(sheetName, "C"+lineStr, split[1])
  73.     _ = file.SetCellStyle(sheetName, "C"+lineStr, "C"+lineStr, styleID)
  74.     _ = file.SetCellValue(sheetName, "D"+lineStr, split[2])
  75.     _ = file.SetCellStyle(sheetName, "D"+lineStr, "D"+lineStr, styleID)
  76.     _ = file.SetCellValue(sheetName, "E"+lineStr, split[3])
  77.     _ = file.SetCellStyle(sheetName, "E"+lineStr, "E"+lineStr, styleID)
  78.     _ = file.SetCellValue(sheetName, "F"+lineStr, split[4])
  79.     _ = file.SetCellStyle(sheetName, "F"+lineStr, "F"+lineStr, styleID)
  80.     _ = file.SetCellValue(sheetName, "G"+lineStr, split[5])
  81.     _ = file.SetCellStyle(sheetName, "G"+lineStr, "G"+lineStr, styleID)
  82.   }
  83.   //
  84.   file.SetActiveSheet(sheet)
  85.   //
  86.   buffer, err := file.WriteToBuffer()
  87.   if err != nil {
  88.     w.Write([]byte("导出失败, " + err.Error()))
  89.     return
  90.   }
  91.   // 设置文件名
  92.   w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", "导出文件.xlsx"))
  93.   // 导出的文件格式 xlsx 或者 xsl
  94.   // xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
  95.   // xls application/vnd.ms-excel
  96.   w.Header().Set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
  97.   w.Write(buffer.Bytes())
  98. }

  99. func main() {
  100.   // HTTP服务
  101.   http.HandleFunc("/fileImport", fileImport)
  102.   http.HandleFunc("/fileExport", fileExport)
  103.   err := http.ListenAndServe(":8192", nil)
  104.   if err != nil {
  105.     panic(err)
  106.   }
  107. }
复制代码
页面请求 http://127.0.0.1:8192/fileExport 后会直接生成xlsx文件并下载
4.png

以上就是基于Golang实现Excel表格的导入导出功能的详细内容,更多关于Golang导入导出Excel表格的资料请关注晓枫资讯其它相关文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
22
积分
24
注册时间
2022-12-28
最后登录
2022-12-28

发表于 2025-4-9 08:46:48 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

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