Excel处理需要的依赖:

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency> <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.22</version>
</dependency>

  

数据映射的PO类:

package cn.cloud9.demo.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString; import java.time.LocalDateTime; /**
* @projectName: demo
* @author: cloud9
* @date: 2022年03月30日 16:32
* @version: 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class DictDTO {
Integer id;
String code;
Boolean status;
LocalDateTime createAt;
}

  

Excel表格数据

Controller类:

处理流程直接写Controller里面了

package cn.cloud9.demo.easyexcel.controller;

import cn.cloud9.demo.dto.DictDTO;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; /**
* @projectName: demo
* @author: cloud9
* @date: 2022年03月30日 14:50
* @version: 1.0
*/
@RestController
@RequestMapping("/excel")
public class DemoController { static Map<String, String> map = new ConcurrentHashMap<>(); static {
/**
* 注意别名Map设置
* 生成Excel的时候 - 属性做Key 翻译的名称标题做Value
* 读取Excel的时候 - 翻译的名称标题做Key 属性做Value
*/
map.put("ID", "id");
map.put("代码", "code");
map.put("状态", "status");
map.put("创建日期", "createAt");
}
}

  

Excel文件上传进行读取

Hutool提供的ExcelReader可以简化数据装填处理

直接按照PO类和头别名映射进行数据封装:

    /**
* localhost:8085/excel/upload
* @param multipartFile
* @return void
* @author cloud9
* @createTime 2022/3/31 16:04
*
*/
@PostMapping("/upload")
public void upload(@RequestParam(name = "excel") MultipartFile multipartFile) throws Exception{ // 获取文件名称
String filename = multipartFile.getOriginalFilename(); // 文件输入流
InputStream inputStream = multipartFile.getInputStream(); // 得到Hutool的Reader
ExcelReader reader = ExcelUtil.getReader(inputStream); /**
* 默认读取第一个Sheet
* 读取为Map列表,默认第一行为标题行,Map中的key为标题,value为标题对应的单元格值。
* @param multipartFile
* @return void
* @author cloud9
* @createTime 2022/3/31 16:18
*
*/
List<Map<String, Object>> list = reader.readAll(); // PO需要设置Map来对应设置
reader.setHeaderAlias(map); // 能解析公式
List<DictDTO> list2 = reader.readAll(DictDTO.class);
System.out.println(filename); System.out.println(list);
System.out.println(list2);
}

  

取出数据,装填到Excel文件中返回出去

这样遍历map装填不能指定标题字段的顺序

如果需要指定顺序,就需要自己一个个调用add方法手动设置

    /**
* localhost:8085/excel/download
* @param response
* @return void
* @author 戴知舟
* @createTime 2022/4/1 09:21
*
*/
@GetMapping("/download")
public void download(HttpServletResponse response) throws Exception{ // 创建模拟数据
List<DictDTO> dicts = new ArrayList<>();

dicts.add(new DictDTO(1001, "Code-1001", true, LocalDateTime.now()));
dicts.add(new DictDTO(2002, "Code-2002", true, LocalDateTime.now()));
dicts.add(new DictDTO(3003, "Code-3003", true, LocalDateTime.now()));
dicts.add(new DictDTO(4004, "Code-4004", false, LocalDateTime.now()));
dicts.add(new DictDTO(5005, "Code-5005", true, LocalDateTime.now()));
dicts.add(new DictDTO(6006, "Code-6006", false, LocalDateTime.now())); // 获取写入器对象
ExcelWriter excelWriter = ExcelUtil.getWriter();
// 设置别名标题映射
// excelWriter.setHeaderAlias(map); ×
// 如果要指定字段顺序,还是一个个添加操作
map.forEach((k, v) -> excelWriter.addHeaderAlias(v, k));
// 装填数据, 并设置了标题头的信息
excelWriter.write(dicts, true); // true 设置标题(灰色背景), false 不设置
// 获取服务的响应流,设置文件信息
String filename = "测试Excel文件-" + System.currentTimeMillis() + ".xlsx";
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + filename + ";filename*=utf-8''"
+ URLEncoder.encode(filename, "UTF-8"));
final OutputStream OUTPUT_STREAM = response.getOutputStream(); // 开始写入
excelWriter.flush(OUTPUT_STREAM, true);
// 关闭资源
excelWriter.close();
OUTPUT_STREAM.close();
}

  

Postman文件上传测试

localhost:8085/excel/upload

调整输出代码:

        list.forEach(System.out::println);
list2.forEach(System.out::println);

控制台打印:

XLS表.xls
{ID=1001, 代码=CODE-1001, 状态=true, 创建日期=2022-03-22 00:00:00}
{ID=1002, 代码=CODE-1002, 状态=true, 创建日期=2022-03-23 00:00:00}
{ID=1003, 代码=CODE-1003, 状态=true, 创建日期=2022-03-24 00:00:00}
{ID=1004, 代码=CODE-1004, 状态=true, 创建日期=2022-03-25 00:00:00}
{ID=1005, 代码=CODE-1005, 状态=true, 创建日期=2022-03-26 00:00:00}
{ID=1006, 代码=CODE-1006, 状态=true, 创建日期=2022-03-27 00:00:00}
{ID=1007, 代码=CODE-1007, 状态=true, 创建日期=2022-03-28 00:00:00}
{ID=1008, 代码=CODE-1008, 状态=true, 创建日期=2022-03-29 00:00:00}
{ID=1009, 代码=CODE-1009, 状态=true, 创建日期=2022-03-30 00:00:00}
DictDTO(id=1001, code=CODE-1001, status=true, createAt=2022-03-22T00:00)
DictDTO(id=1002, code=CODE-1002, status=true, createAt=2022-03-23T00:00)
DictDTO(id=1003, code=CODE-1003, status=true, createAt=2022-03-24T00:00)
DictDTO(id=1004, code=CODE-1004, status=true, createAt=2022-03-25T00:00)
DictDTO(id=1005, code=CODE-1005, status=true, createAt=2022-03-26T00:00)
DictDTO(id=1006, code=CODE-1006, status=true, createAt=2022-03-27T00:00)
DictDTO(id=1007, code=CODE-1007, status=true, createAt=2022-03-28T00:00)
DictDTO(id=1008, code=CODE-1008, status=true, createAt=2022-03-29T00:00)
DictDTO(id=1009, code=CODE-1009, status=true, createAt=2022-03-30T00:00)

测试Excel文件下载:

http://localhost:8085/excel/download

【Excel】Poi + Hutool Springboot 读写Excel案例的更多相关文章

  1. C++读写EXCEL文件OLE,java读写excel文件POI 对比

    C++读写EXCEL文件方式比较 有些朋友问代码的问题,将OLE读写的代码分享在这个地方,大家请自己看.http://www.cnblogs.com/destim/p/5476915.html C++ ...

  2. poi入门之读写excel

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能.该篇是介绍poi基本的 ...

  3. springboot 读写excel

    添加两个坐标: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</a ...

  4. jxl读写excel, poi读写excel,word, 读取Excel数据到MySQL

    这篇blog是介绍: 1. java中的poi技术读取Excel数据,然后保存到MySQL数据中. 2. jxl读写excel 你也可以在 : java的poi技术读取和导入Excel了解到写入Exc ...

  5. Java读写Excel之POI超入门

    转自:http://rensanning.iteye.com/blog/1538591 Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给J ...

  6. Java读写Excel之POI超入门(转)

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能.Apache POI ...

  7. SpringBoot加Poi仿照EasyPoi实现Excel导出

    POI提供API给Java程序对Microsoft Office格式档案读和写的功能,详细功能可以直接查阅API,因为使用EasyPoi过程中总是缺少依赖,没有搞明白到底是什么坑,索性自己写一个简单工 ...

  8. Apache POI 读写 Excel 文件

    目录 写入 Excel 文件 读取 Excel 文件 遍历 Excel 文件 需要的 maven 依赖 完整代码 写入 Excel 文件 // 写入 Excel 文件 // ============= ...

  9. [转]POI读写Excel 修改

    [转]POI读写Excel 修改 一.Excel基础 二.HSSF概况 三.通过usermodel读取文件 四.通过usermodel写入文件 五.通过eventusermodel读取文件 六.HSS ...

  10. poi读写Excel

    poi读写Excel 对于一个程序员来说,文件操作是经常遇到的,尤其是对Excel文件的操作. 在这里介绍一下我在项目中用到的一个操作Excel的工具——POI.关于POI的一些概念,网络上很多,详细 ...

随机推荐

  1. 解决 idea web项目没有小蓝点的问题

    在idea导入web项目,项目没有显示小蓝点,无法添加 java文件和运行.如下图的springboot-schedule 和 springboot-test 都没有蓝点: 解决方案一: 点击 Fil ...

  2. 工作中常用Less知识点实践总结

    我所理解的Less的一些好处 函数式编程css 自定义变量用于整体主题调整 嵌套语法简化开发复杂度 mixin的写法 .defaultBorder(@width: 10px, @style: soli ...

  3. vscode git bash终端配置:“”message": "此项已弃用,配置默认 shell 的新推荐方法是在 `#terminal.integrated.profiles.windows#

    当VSCode升级至1.57.1(2021.6.17)时,会出现警告提示:""message": "此项已弃用,配置默认 shell 的新推荐方法是在 `#te ...

  4. 剑指Offer-62.二叉搜索树的第k个结点(C++/Java)

    题目: 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8)    中,按结点数值大小顺序第三小结点的值为4. 分析: 二叉搜索树的中序遍历结果正好是按数值升序排列的结 ...

  5. INFINI Labs 产品更新 | Easysearch 1.7.1发布

    INFINI Labs 产品又更新啦~,包括 Console,Gateway,Agent 1.23.0 和 Easysearch 1.7.1.此次版本重点修复历史遗留 Bug .网友们提的一些需求等. ...

  6. C#.NET 国密 BASE64编码的私钥提取16进制私钥 (锦州银行、建行轻应用)

    C#.NET 国密 BASE64编码的私钥提取16进制私钥 (锦州银行.建行轻应用), 从BASE64编码的公钥中提取16进制字符串公钥, 从BASE64编码的私钥中提取16进制字符串私钥, 锦州银行 ...

  7. 雪花算法(SnowFlake)

    引言 唯一ID可以标识数据的唯一性,在分布式系统中生成唯一ID的方案有很多,常见的方式大概有以下三种: 依赖数据库,使用如MySQL自增列或Oracle序列等. UUID随机数 snowflake雪花 ...

  8. Linux日志搜索 grep

    1.关键字"或"的搜索, -E 不能少.grep -E "word1|word2|word3" file.txt满足任意条件(word1.word2和word3 ...

  9. IDEA生成类和方法注释模板详细说明 绝对好用

    吐槽 今天心血来潮,将使用了很久的IDEA旗舰版卸载了,想换社区版用一段时间,毕竟社区版开源免费.精简不卡顿,如果够用的话以后就省去了破解的烦恼,而且可以紧跟官网使用最新版 旧的IDEA配置忘记保存了 ...

  10. re.search()用法详解

    re.search() 是 Python 的正则表达式库 re 中的一个方法,用于在字符串中搜索与正则表达式模式匹配的第一个位置,并返回一个匹配对象.如果没有找到匹配项,则返回 None. 以下是 r ...