按照模板导出复杂样式的excel

embedded/2024/12/22 15:26:29/

导出excel通常使用的是apache poi,但是poi的api相当复杂,所以当导出的excel样式比较复杂时,写起来就比较头疼了,这里推荐使用easypoi, 可以很方便的根据模板来导出复杂excel

文档地址: 1.1 介绍 - Powered by MinDoc

我们要实现如图所示效果,该怎么实现呢

 第一步,导入依赖

<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.5.0</version>
</dependency>

第二步,新建excel模板,然后写入内容

如果是变量,就用双大括号包裹变量,如果是列表,则使用$fe指令,maplist是变量名,t.id是要输出的字段,最后以t.hdje}}结果表示结束

模板指令文档:EasyPoi教程_V1.0

示例模板下载地址:  src/test/resources/WEB-INF/doc/专项支出用款申请书_map.xls · 悟耘开源/easypoi-test - Gitee.com

 

第三步,获取数据,写入输出流

public class ExportController extends BaseController {@Operation(summary = "导出支出用款申请书")@GetMapping("exportPayForm")public void exportPayForm(HttpServletRequest request, HttpServletResponse response) throws IOException {TemplateExportParams params = new TemplateExportParams("template/专项支出用款申请书_map.xls");Map<String, Object> map = new HashMap<String, Object>();map.put("date", "2014-12-25");map.put("money", 2000000.00);map.put("upperMoney", "贰佰万");map.put("company", "执笔潜行科技有限公司");map.put("bureau", "财政局");map.put("person", "JueYue");map.put("phone", "1879740****");List<Map<String, String>> listMap = new ArrayList<Map<String, String>>();for (int i = 0; i < 4; i++) {Map<String, String> lm = new HashMap<String, String>();lm.put("id", i + 1 + "");lm.put("zijin", i * 10000 + "");lm.put("bianma", "A001");lm.put("mingcheng", "设计");lm.put("xiangmumingcheng", "EasyPoi " + i + "期");lm.put("quancheng", "开源项目");lm.put("sqje", i * 10000 + "");lm.put("hdje", i * 10000 + "");listMap.add(lm);}map.put("maplist", listMap);Workbook workbook = ExcelExportUtil.exportExcel(params, map);addFileHeader(request, response, "专项支出用款申请书.xls", "application/octet-stream");workbook.write(response.getOutputStream());}
}public void addFileHeader(HttpServletRequest request, HttpServletResponse response,     String fileName, String contentType) {try {String agent = request.getHeader("USER-AGENT").toLowerCase();response.setContentType(contentType);String codedFileName = java.net.URLEncoder.encode(fileName, "UTF-8");if (agent.contains("firefox")) {response.setCharacterEncoding("utf-8");response.setHeader("content-disposition", "attachment;filename=" + new String(fileName.getBytes(), "ISO8859-1"));} else {response.setHeader("content-disposition", "attachment;filename=" + codedFileName);}} catch (Exception e) {e.printStackTrace();}}

 

 


http://www.ppmy.cn/embedded/16277.html

相关文章

模块化 手写实现webpack

模块化 common.js 的导入导出方法&#xff1a; require \ export 和 module.exports export 和 module.export nodejs 内存1.4G -> 2.8G cjs ESModule 主要区别&#xff1a; require属于动态类型&#xff1a;加载执行 同步 esmodul是静态类型&#xff1a;引入时并不会真的去…

详解Qt中的鼠标事件

在Qt中&#xff0c;处理鼠标事件是构建交互式界面的关键。Qt提供了一系列与鼠标相关的事件处理函数&#xff0c;允许开发者捕获鼠标的各种动作&#xff0c;如按下、释放、移动、双击等。以下是鼠标事件的使用方法、技巧以及注意事项&#xff0c;并附带C代码示例。 基础使用方法…

揭秘神器:智能私信破局获客难!

在数字营销的海洋中&#xff0c;每个企业都如同一艘努力航行的船&#xff0c;希望能在广阔的客户蓝海中获得丰收。然而&#xff0c;现实却往往充满挑战&#xff0c;尤其是当面对如何吸引并维系客户这一核心难题时。传统的获客手段逐渐显得力不从心&#xff0c;而智能科技的介入…

微信浏览器input[file]拍照点确认后强刷新解决

描述 公众号h5做的点击拍照选择照片&#xff0c;调用相机拍完照点确认时强制回退到登录页面。而且刷新是不固定的&#xff0c;调试了N久&#xff0c;直到现在&#xff0c;还会有这个情况发生。上网查找也没有具体答案。最靠谱的说法就是手机内存不足。 iOS手机经常出现 安卓…

MySQL主从的应用

说明&#xff1a;本文介绍MySQL主从在实际中的应用。主从搭建和问题参考下面两篇文章&#xff1a; MySQL主从结构搭建 搭建MySQL主从结构时的问题 数据迁移 当我们搭建完MySQL主从&#xff0c;第一步当然是把历史数据导入到主从结构中。有以下两种方式&#xff1a; 开启主从…

【注解和反射】通过反射动态创建对象、调用普通方法、操作属性

继上一篇博客【注解和反射】获取类运行时结构-CSDN博客 目录 八、通过反射动态创建对象 测试&#xff1a;通过反射动态创建对象 思考&#xff1a;难道没有无参的构造器就不能创建对象了吗?只要在操作的时候明确的调用类中的构造器并将参数传递进去之后&#xff0c;才可以实…

【Qt常用控件】—— QWidget 核心属性

目录 &#xff08;一&#xff09;控件概述 1.1 关于控件体系的发展 &#xff08;二&#xff09;QWidget 核心属性 2.1 核心属性概览 2.2 enabled 2.3 geometry 2.4 windowTitle 2.5 windowIcon 2.6 windowOpacity 2.7 cursor 2.8 font 2.9 toolTip 2.10 focus…

读书笔记|怎样把书读活 ,毛教员的读书方法

哈喽,你好,我是雷工。 我们都希望自己能够把书读活,而不是读死书。 那么如何才能够不读死书,把读到的知识转化为自己的认识呢? 我想毛教员别具一格的读书方法,值得我们反复学习,并加以实践。 01 把读书看做调查研究 我们的知识和认知,大都来自三个方面:亲身经历带来…