【Go】excelize库实现excel导入导出封装(三),基于excel模板导出excel

这篇具有很好参考价值的文章主要介绍了【Go】excelize库实现excel导入导出封装(三),基于excel模板导出excel。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

大家好,这里是符华~

关于excelize库实现excel导入导出封装,我已经写了两篇了,我想要的功能基本已经实现了,现在还差一个模板导出,这篇文章就来讲讲如何实现用模板导出excel。

前两篇:

【Go】excelize库实现excel导入导出封装(一),自定义导出样式、隔行背景色、自适应行高、动态导出指定列、动态更改表头

【Go】excelize库实现excel导入导出封装(二),基于map、多个sheet、多级表头、树形结构表头导出,横向、纵向合并单元格导出


根据模板导出excel,在开发中也是经常会遇到的一种导出方式。一想到模板导出,我自然而然就想到了Java里的 easypoi 框架。easypoi 呢在Java里面也是一个操作excel使用率很高的框架,然后这个框架的模板导出呢,是有设定模板指令的,就是下面这种:

根据模板导出 excel,Go,excelize,golang,excel

用的时候就是这样:

根据模板导出 excel,Go,excelize,golang,excel

填充数据就是把数据放到map里面,map的key对应模板里面设置的字段名(比如 name、sfz 这几个字段名),map的value就是我们要导出的结果值。

然后呢我就想,Go里面用模板导出应该也是用模板指令的吧?但是呢其实在 excelize 库中,它并不支持类似的模板指令,这么看来 excelize 库好像不支持用模板导出?那有啥办法可以实现这个功能?


欸嘿,还真有,只不过这个模板导出呢就和 excelize 没啥关系了,但因为是自己封装导入导出,那我就干脆把这个模板导出也一起封装进来、一起放到这个专栏系列里面了。

实现

excelize 虽然没有模板指令,但是Go标准库中的 text/templatehtml/template 包提供了强大的模板功能,所以我们本篇文章的实现也是基于 html/template 来实现的。

html/template 的模板指令和 easypoi 的模板指令有点类似,但细节上还是有很大差异的,具体使用用法可以看看这篇文章:Go语言标准库之html/template详解 。

我们可以使用 text/templatehtml/template 来解析模板,但是需要注意的是,这两个库并不能直接解析excel模板,它们只能解析文本格式的文件,不能解析二进制格式的文件。

所以用的时候,我们准备好了一个excel模板时,还需要将这个excel文件另存为xml文件。

有了xml文件也不能直接用,有些地方的数据可能需要处理一下,比如遍历list的时候,需要将 range 遍历放到正确的位置。

检查好之后,再使用 template.ParseFiles 函数解析这个xml文件,接下来就可以填充数据了。填充好后,将渲染模板并输出为excel文件。

准备模板

我们先准备好excel模板

根据模板导出 excel,Go,excelize,golang,excel

然后再另存为xml文件

根据模板导出 excel,Go,excelize,golang,excel

拿到xml文件后,先不要急着解析,先格式化一下进行检查,如果数据太多,我们按照关键字搜索

根据模板导出 excel,Go,excelize,golang,excel

错误的位置:

根据模板导出 excel,Go,excelize,golang,excel

改正的位置:

根据模板导出 excel,Go,excelize,golang,excel

根据模板导出 excel,Go,excelize,golang,excel

按照上面的方法检查并改正好之后,保存好,这样我们就可以开始解析这个xml模板了。

开始

// 模板导出
func ExportTemplate() {
	// 准备结构体数据
	var list = []Test{
		{"fuhua", "符华", "fuhua@123.com", "太虚剑派", false, "1", 1},
		{"baiye", "白夜", "baiye@123.com", "天命科技有限公司", false, "2", 1},
		{"chiling", "炽翎", "chiling@123.com", "太虚剑派", false, "2", 2},
		{"yunmo", "云墨", "yunmo@123.com", "太虚剑派", false, "1", 2},
		{"yuelun", "月轮", "yuelun@123.com", "天命科技有限公司", false, "1", 1},
		{"xunyu", "迅羽", "xunyu@123.com", "天命科技有限公司", true, "2", 124},
	}
	// 准备map数据
	data := map[string]any{
		"name":     "符华",
		"sex":      "女",
		"birthday": "2000-10-01",
		"jg":       "广东省",
		"sfz":      "123456789111111111",
		"gzdw":     "天命科技",
		"email":    "fuhua@123.com",
		"phone":    "13188888888",
		"workList": []map[string]any{
			{"date": "2019-01-01~2020-10-01", "unit": "逐火之蛾", "post": "普通员工", "sfzz": "否"},
			{"date": "2020-10-20~2022-09-15", "unit": "太虚剑派", "post": "CEO", "sfzz": "否"},
			{"date": "2022-10-01~至今", "unit": "天命科技", "post": "经理", "sfzz": "是"},
		},
		"list": list,
	}
	templatePath := "template\\测试模板导出.xml" // 模板路径
	outPath := "C:\\Users\\Administrator\\Desktop\\output.xlsx" // 输出路径
	err := excel.TemplateExport(templatePath, outPath, data)
	if err != nil {
		fmt.Println(err.Error())
	}
	fmt.Println("导出成功!")
	// 将excel下载到浏览器,第一个参数是模板路径、第二个参数是下载的文件名称(要带上后缀)、第三个参数是模板数据、第四个参数是http响应
	// excel.DownLoadByTemplate(templatePath,"output.xlsx",data,res)
}

excel 包下的 TemplateExport 函数:

// TemplateExport 基于excel的模板导出
func TemplateExport(templatePath, outPath string, data map[string]interface{}) error {
	// 解析模板
	tmpl, err := template.ParseFiles(templatePath)
	if err != nil {
		return errors.New("模板解析失败:" + err.Error())
	}
	// 创建输出文件
	file, err := os.Create(outPath)
	if err != nil {
		return errors.New("创建输出文件失败:" + err.Error())
	}
	defer file.Close()
	// 渲染模板并输出结果
	err = tmpl.Execute(file, data)
	if err != nil {
		return errors.New("模板数据渲染失败:" + err.Error())
	}
	return nil
}

excel 包下的 DownLoadByTemplate 函数:

// 根据模板下载文件:templatePath 模板路径,fileName 文件名称(需要加上后缀名),data 模板数据
func DownLoadByTemplate(templatePath, fileName string, data map[string]interface{}, res http.ResponseWriter) {
	// 解析模板
	tmpl, err := template.ParseFiles(templatePath)
	if err != nil {
		http.Error(res, "模板解析失败:"+err.Error(), http.StatusInternalServerError)
		return
	}
	// 设置响应头
	res.Header().Set("Content-Type", "text/html; charset=UTF-8")
	res.Header().Set("Content-Type", "application/octet-stream")
	res.Header().Set("Content-Disposition", "attachment; filename="+fileName)
	res.Header().Set("Access-Control-Expose-Headers", "Content-Disposition")
	// 渲染模板并输出结果
	err = tmpl.Execute(res, data)
	if err != nil {
		http.Error(res, "模板数据渲染失败:"+err.Error(), http.StatusInternalServerError)
	}
}

导出结果:

根据模板导出 excel,Go,excelize,golang,excel

这样子我们就实现了根据模板导出excel辣~

最后

这里是 源码

如果大家觉得本篇文章或专栏对你有所帮助或者觉得写得还可以的话,欢迎大家多多给博主 点赞关注 支持一下哦😘下载源码的时候顺便给博主点个Star😘你动动手指就是对我莫大的鼓励🥰文章来源地址https://www.toymoban.com/news/detail-824174.html

到了这里,关于【Go】excelize库实现excel导入导出封装(三),基于excel模板导出excel的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • EasyExcel导出带下拉选数据的Excel数据导入模板

    #因为项目中需要导入一些信息,但是这些信息比较不常见,且在项目字典数据中维护有这些数据,所以在导出模板的时候,把这些数据一并导出,可以减少用户的编写,避免在导入的时候因为数据错误,发生一些业务问题 直接开始 1、以岗位类型为例,展示数据的实现方式

    2024年02月03日
    浏览(38)
  • 使用Java导入、导出excel详解(附有封装好的工具类)

    😜 作           者 :是江迪呀 ✒️ 本文 : Java 、 Excel 、 导出 、 工具类 、 后端 ☀️ 每日   一言 :有些事情不是对的才去坚持,而是坚持了它才是对的! 我们在日常开发中,一定遇到过要将数据导出为 Excel 的需求,那么怎么做呢?在做之前,我们需要思考

    2024年02月06日
    浏览(39)
  • ExcelExportUtil基于模板导出excel&POI导出excel

    第一步,导入依赖没啥好说的; 第二步,查询数据库或es数据组装成list对象; 第三步,填充MapString, Object excelMap = new HashMap(); 数据key和excel模板对应,如果一次导出多个,可以用index区分; 第一步,导入依赖 第二步,上图哈哈 就是这么简单 没了

    2024年02月12日
    浏览(38)
  • 基于DotNetCoreNPOI封装特性通用导出excel

    目前根据项目中的要求,支持 列名定义 ,列 索引排序 ,行 合并单元格 ,EXCEL单元格的 格式 也是随着数据的类型做对应的调整。 效果图: 时间 内容 2023-04-18 第一版 2023-04-21 1、添加反射缓存。2、单元格时间类型样式初始化提取 可以看到时非常容易的能够导出数据,实际调

    2023年04月18日
    浏览(29)
  • <Java导出Excel> 1.0 Java实现Excel动态模板导出

    思路: 1,先创建动态模板(必须要在数据库建一张表,可随时修改模板) 例如: 建表语句: 模板中的字段脚本: 2,编写一个查询接口:返回一个List map 注意:order by id 根据表中字段:id排序的作用是控制导出的EXCEL表中字段列的顺序; mapper.xml层: mapper接口层: serviceIm

    2024年02月12日
    浏览(36)
  • SpringBoot实现Excel导入导出

    话不多说,直接上代码 依赖文档 找到pom文件,如下图所示 引入需要的依赖 导出写法: 导入写法: 已上就是导入导出

    2024年02月09日
    浏览(33)
  • POI 实现Excel导入导出

    什么是POI Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”。 生成xls和xlsx有什么区别呢? XLS XLSX 只能打开xls格式,无法直接打开x

    2024年02月03日
    浏览(33)
  • JS实现Excel导入以及table导出为Excel

    在开发项目的过程中遇到了一个需求,将excel文件导入并且解析渲染到页面上。用户可以对表格内的部分内容做修改后再上传到服务端。 导入Excel 1.使用html支持上传标签从本地获取文件,例如type为file的input,el-upload等 2.实例化FileReader,并且通过readAsBinaryString将文件读取为二

    2024年02月09日
    浏览(30)
  • 纯前端实现 导入 与 导出 Excel

    最近经常在做 不规则 Excel 的导入,或者一些普通 Excel 的导出,当前以上说的都是纯前端来实现;下面我们来聊聊经常用到的Excel导出与导入的实现方案,本文实现技术栈以 Vue2 + JS 为例 导入分类: 调用 API 完全由后端来解析数据,清洗数据,前端只负责调用 API ; 前端解析

    2024年02月09日
    浏览(34)
  • 使用luckysheet实现excel导入导出

    luckysheet-demo: luckysheet-demoexcel导入导出实例 使用组件 1. luckysheet在线excel 2. luckyexcel excel导入插件 3. exceljs 导出excel数据 导出exceljs的二次封装,可直接使用如下

    2024年02月12日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包