Golang导入导出Excel表格

news/2024/7/21 3:53:46 标签: golang, excel, 导入导出

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

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

引用库
go get github.com/xuri/excelize/v2
导入表格
package main

import (
  "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 main

import (
  "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 main

import (
  "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-excel
  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文件并下载
在这里插入图片描述


http://www.niftyadmin.cn/n/5255491.html

相关文章

【Hadoop_03】HDFS概述与Shell操作

1、集群配置&#xff08;1&#xff09;集群启动/停止方式总结&#xff08;2&#xff09;编写Hadoop集群常用脚本&#xff08;3&#xff09;常考面试题【1】常用端口号【2】常用配置-文件 2、HDFS概述&#xff08;1&#xff09;HDFS产出背景及定义&#xff08;2&#xff09;HDFS…

电子学会C/C++编程等级考试2022年06月(五级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:逃离迷宫 你在一个地下迷宫中找到了宝藏,但是也触发了迷宫机关,导致迷宫将在T分钟后坍塌,为此你需要在T分钟内逃离迷宫,你想知道你能不能逃离迷宫。迷宫是一个边长为m的正方形,其中"S"表示你所在的位置,"…

港推数码货币:机遇与挑战

金融数码化已成潮流&#xff0c;全球各国都在努力探索并推出各自的“央行数字货币”&#xff08;CBDC&#xff09;方案及其可行性。作为国际金融中心的香港也并未落后&#xff0c;近期除了即将公布其“数码港元”的先导计划外&#xff0c;香港金融管理局&#xff08;金管局&…

Lua字符串(包含任意字符,如中文)任意位置截取

常规的截取只需要lua自带的api就可以解决问题&#xff1a;如 string.sub 但是当字符串之中含有中文或者符号的时候&#xff0c;这些接口就麻爪了&#xff0c;当然lua后续更新有可能支持&#xff0c;至少本少当前的Lua版本是不支持的。 废话少说&#xff0c;直接上代码和测试用…

三篇论文解决了大型语言模型 (LLM) 的三个不同问题

讨论三篇论文&#xff0c;它们解决了大型语言模型 (LLM) 的三个不同问题类别&#xff1a; 减少幻觉。Reducing hallucinations. 增强小型、开放可用模型的推理能力。Enhancing the reasoning capabilities of small, openly available models. 加深我们对transformer架构的理…

做数据分析为何要学统计学(9)——什么是回归分析

​回归分析&#xff08;regression analysis)是量化两种或两种以上因素/变量间相互依赖关系的统计分析方法。回归分析根据因素的数量&#xff0c;分为一元回归和多元回归分析&#xff1b;按因素之间依赖关系的复杂程度&#xff0c;可分为线性回归分析和非线性回归分析。我们通过…

kafka rebalance(再均衡)导致的消息积压分析

起因&#xff1a; 某天&#xff0c;项目组收到大量的kafka消息积压告警。查看了kafka日志后&#xff0c;发现 kafka不断地 rebalance(再均衡)。 Rebalance (再均衡)&#xff1a; 分区的所有权从一个消费者转移到另一个消费者&#xff0c;这样的行为被称为Rebalance (再均衡)…

IP与以太网的转发操作

TCP模块在执行连接、收发、断开等各阶段操作时&#xff0c;都需要委托IP模块将数据封装成包发送给通信对象。 网络中有路由器和集线器两种不同的转发设备&#xff0c;它们在传输网络包时有着各自的分工。 (1)路由器根据目标地址判断下一个路由器的位置 (2)集线器在子网中将网…