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

server/2024/10/11 7:25:14/

导出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/server/16189.html

相关文章

SQL概述

1. SQL的分类 SQL语言在功能上主要分为如下3大类&#xff1a; DDL&#xff08;Data Definition Languages、数据定义语言&#xff09;&#xff0c;这些语句定义了不同的数据库、表、视图、索引等数据库对象&#xff0c;还可以用来创建、删除、修改数据库和数据表的结构。主要…

详解React Hooks:实现更简洁的前端代码

React Hooks 是 React 16.8 引入的一项特性&#xff0c;它允许你在不编写类 (class) 的情况下使用 state 以及其他的 React 特性。Hooks 提供了一种更直接、简洁的方式来编写组件逻辑&#xff0c;使得代码更容易理解和维护。下面将详细解释常用的 React Hooks&#xff0c;并展示…

transformers - 文本分类

from transformers import AutoTokenizer#加载编码器 tokenizer AutoTokenizer.from_pretrained(distilbert-base-uncased,use_fastTrue)print(tokenizer)#编码试算 tokenizer.batch_encode_plus([hide new secretions from the parental units,contains no wit , only labore…

vue快速入门(三十三)scoped解决组件样式冲突

注释很详细&#xff0c;直接上代码 上一篇 新增内容 scoped解决样式冲突的用法 源码 MyHeader.vue <!-- 用于测试全局注册组件 --> <template><div id"myHeader"><h1>又可以愉快的学习啦</h1></div> </template><scri…

go的编译以及运行时环境

开篇 很多语言都有自己的运行时环境&#xff0c;go自然也不例外&#xff0c;那么今天我们就来讲讲go语言的运行时环境&#xff01; 不同语言的运行时环境对比 我们都知道Java的运行时环境是jvm &#xff0c;javascript的运行时环境是浏览器内核 Java -->jvm javascript…

代码随想录打卡—day29—【回溯】— 回溯基础练习 4.19+4.20

1 491. 非递减子序列 一开始的思路是根据上一篇的3 90. 子集 II&#xff0c;加上set开始魔改。 即不要nums[i]和相邻元素val相等且在同一层就continue&#xff0c;但是本题不能sort所以没有相邻元素val&#xff0c;所以我加了set设置为本层之前遍历过的元素。代码如下&#x…

【Linux 进程间通信】管道

文章目录 1.System V 标准介绍2.进程间通信的方式&#xff1f;3.管道&#xff08;匿名管道&#xff09; 1.System V 标准介绍 ①&#x1f34e; System V 实际上就是一个标准&#xff08;“ 行业领头羊制定出来的专利 " &#xff09; 2.进程间通信的方式&#xff1f; …

深入理解安卓ARouter:集成与应用

摘要 在Android开发中&#xff0c;页面间的导航和参数传递是一个重要的组成部分。ARouter&#xff08;Android Router&#xff09;是一个轻量级、模块化的路由框架&#xff0c;旨在简化页面间的跳转和参数传递。本文将详细介绍安卓ARouter的概述、集成步骤、优劣分析及应用场景…