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

【go】Excelize处理excel表 带合并单元格、自动换行与固定列宽的文件导出

文章目录

  • 1 简介
  • 2 相关需求与实现
    • 2.1 导出带单元格合并的excel文件
    • 2.2 导出增加自动换行和固定列宽的excel文件

1 简介

  • 之前整理过使用Excelize导出原始excel文件与增加数据校验的excel导出。【go】Excelize处理excel表 带数据校验的文件导出

  • 本文整理使用Excelize导出带单元格合并的excel文件与导出增加自动换行和固定列宽的excel文件

2 相关需求与实现

2.1 导出带单元格合并的excel文件

  • 需求:入参是一个map,其键是每个sheet页的名字,其值是一个二维切片。在每个sheet页中依次写入切片中的数据。返回文件名和错误信息。
    合并单元格:前三列,如果此格和上行格相同,则合并
  • 代码:
// 增加合并单元格的文件导出
func WriteExcelMerge(datas map[string][][]string) (string, error) {file := excelize.NewFile()for sheetName, data := range datas {index, _ := file.NewSheet(sheetName)for i, row := range data {for j, val := range row {// 列行数字索引转excel坐标索引cellName, _ := excelize.CoordinatesToCellName(j+1, i+1)// 设置,写入file.SetCellValue(sheetName, cellName, val)}}// 创建表格file.SetActiveSheet(index)}for sheet, _ := range datas {// 获取表格中的所有行rows, err := file.GetRows(sheet)if err != nil {return "", err}for i := 1; i < len(rows); i++ {currRow := rows[i]prevRow := rows[i-1]// 判断前3列是否相等if currRow[0] == prevRow[0] &&currRow[1] == prevRow[1] &&currRow[2] == prevRow[2] {// 合并相邻单元格for j := 1; j <= 3; j++ {cellName1, _ := excelize.CoordinatesToCellName(j, i) // 列,行cellName2, _ := excelize.CoordinatesToCellName(j, i+1)err := file.MergeCell(sheet, cellName1, cellName2)if err != nil {return "", err}}}}}filename := "aaa" + ".xlsx"// 创建目录_, err := os.ReadDir("aaa/")if err != nil {// 不存在就创建err = os.MkdirAll("aaa/", fs.ModePerm)if err != nil {return "", err}}file.DeleteSheet("Sheet1")err = file.SaveAs("aaa/" + filename)if err != nil {return "", err}return filename, nil
}func main() {datas := make(map[string][][]string)datas["xxx"] = [][]string{{"a", "b", "c", "D1", "E1", "G1", "H1", "I1"}, {"a", "b", "c", "D1"}, {"a", "b", "c", "D1"}}datas["yyy"] = [][]string{{"X1", "Y1", "Z1"}, {"X2", "Y2", "Z2"}, {"X3", "Y3", "Z3"}}fileName, err := WriteExcelMerge(datas)if err != nil {fmt.Println("Write excel error: ", err)return}fmt.Println("Write excel success, file name is: ", fileName)
}
  • 输出文件:
    合并:
    在这里插入图片描述
    未合并:在这里插入图片描述

2.2 导出增加自动换行和固定列宽的excel文件

  • 需求:同上
    其中,第一列设置自动换行+固定列宽20;第二列固定列宽20
  • 代码:
func WriteExcelAuto(datas map[string][][]string, widths map[string]float64, wrapTexts []string) (string, error) {file := excelize.NewFile()// 自动换行styleID, err := file.NewStyle(&excelize.Style{Alignment: &excelize.Alignment{WrapText: true,},})if err != nil {return "", err}for sheetName, data := range datas {index, _ := file.NewSheet(sheetName)for i, row := range data {for j, val := range row {// 列行数字索引转excel坐标索引cellName, _ := excelize.CoordinatesToCellName(j+1, i+1)// 设置,写入file.SetCellValue(sheetName, cellName, val)}}// 设置自动换行for _, v := range wrapTexts {file.SetColStyle(sheetName, v, styleID)}// 设置列宽for k, v := range widths {file.SetColWidth(sheetName, k, k, v)}// 创建表格file.SetActiveSheet(index)}filename := "aaa" + ".xlsx"// 创建目录_, err = os.ReadDir("aaa/")if err != nil {// 不存在就创建err = os.MkdirAll("aaa/", fs.ModePerm)if err != nil {return "", err}}file.DeleteSheet("Sheet1")err = file.SaveAs("aaa/" + filename)if err != nil {return "", err}return filename, nil
}func main() {datas := make(map[string][][]string)datas["xxx"] = [][]string{{"AAAAAAAAAAAAAAAAAAAAA", "B1", "C1", "d1", "E1", "G1", "H1", "I1"}, {"A2", "B2", "C2"}, {"A3", "B3", "C3"}}datas["yyy"] = [][]string{{"X1", "Y1", "Z1"}, {"X2", "Y2", "Z2"}, {"X3", "Y3", "Z3"}}widths := map[string]float64{"A": 20,"B": 20,}wraps := []string{"A",}fileName, err := WriteExcelAuto(datas, widths, wraps)if err != nil {fmt.Println("Write excel error: ", err)return}fmt.Println("Write excel success, file name is: ", fileName)
}
  • 输出文件:
    在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • JCR一区级 | Matlab实现PSO-Transformer-LSTM多变量回归预测
  • PWM再理解(1)
  • 【Node.js】初识 Node.js
  • CentOS 8中 更新或下载时报错:为仓库 ‘appstream‘ 下载元数据失败 : Cannot prepare internal mirrorlist
  • 彻底解决idea的编解码问题
  • c# .net core中间件,生命周期
  • 物联网实训室的核心功能有哪些?
  • WebPack5.0 快速入门
  • 什么是diff算法?
  • C++20中的constinit说明符
  • 【数据结构】二叉树———Lesson2
  • 十七、【文本编辑器(三)】图像坐标变换
  • 低代码中间件学习体验分享:业务系统的创新引擎
  • 从 Pandas 到 Polars 十八:数据科学 2025,对未来几年内数据科学领域发展的预测或展望
  • 云监控(华为) | 实训学习day2(10)
  • Docker容器管理
  • Java,console输出实时的转向GUI textbox
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Python - 闭包Closure
  • 从零开始在ubuntu上搭建node开发环境
  • 技术发展面试
  • 什么软件可以剪辑音乐?
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 怎么将电脑中的声音录制成WAV格式
  • 自定义函数
  • 阿里云ACE认证学习知识点梳理
  • # SpringBoot 如何让指定的Bean先加载
  • #Linux(权限管理)
  • #QT(串口助手-界面)
  • #stm32整理(一)flash读写
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (42)STM32——LCD显示屏实验笔记
  • (C语言)fread与fwrite详解
  • (ZT)一个美国文科博士的YardLife
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (三)终结任务
  • (实战篇)如何缓存数据
  • (算法设计与分析)第一章算法概述-习题
  • (未解决)macOS matplotlib 中文是方框
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)基于IDEA的JAVA基础1
  • (原)Matlab的svmtrain和svmclassify
  • (原創) 未来三学期想要修的课 (日記)
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • .FileZilla的使用和主动模式被动模式介绍
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .Net CF下精确的计时器
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .NET 直连SAP HANA数据库