当前位置:   article > 正文

Springboot Excel 最简单的 多sheet表 导入导出_springboot表格导入导出

springboot表格导入导出

前言

上周学习群里有人问到,多个sheet的导出导入,我第一反应就是easypoi不是自己就有方法了么?

后面一想,可能有些看客还处于是 找工具类,然后调试 的写代码 的 阶段,可能还不会去看jar包的一些函数。

既然如此,那就写一写Excel  多sheet表 导入导出

正文

之前的一些excel的相关的文章,感兴趣的看客,也可以看下。

最简单的入门篇:
Springboot 最简单的结合MYSQL数据实现EXCEL表格导出及数据导入_小目标青年的博客-CSDN博客

还写过一篇单个,多个 excel文件导出,转成ZIP包的:

SpringBoot 导出多个Excel文件,压缩成.zip格式下载_小目标青年的博客-CSDN博客

还有指定模板导出的:
Springboot 指定自定义模板导出Excel文件_小目标青年的博客-CSDN博客_自定义导出excel

 还有这种复合表格的:
Springboot 导入导出Excel ,一对多关系,复合表格、合并单元格数据_springboot导出excel合并单元格_小目标青年的博客-CSDN博客

还有这种动态导出的:

Springboot 我随手封装了一个万能的导出excel工具,传什么都能导出_小目标青年的博客-CSDN博客

好了,回归本篇,开搞。

惯例,先看下我们今天要实现 excel多sheet表的导入导出,整个实战下来,需要做多少东西:

基本等于0 ,是的,没啥好写的。

 

1.pom.xml 引入依赖 :

  1. <!--easypoi-->
  2. <dependency>
  3. <groupId>cn.afterturn</groupId>
  4. <artifactId>easypoi-spring-boot-starter</artifactId>
  5. <version>4.0.0</version>
  6. </dependency>

2.yml 配置:

  1. server:
  2. port: 8697
  3. spring:
  4. main:
  5. allow-bean-definition-overriding: true

3.工具类 ExcelUtil.java  (只保留了该篇用到的函数,精简)

  1. import cn.afterturn.easypoi.excel.ExcelExportUtil;
  2. import cn.afterturn.easypoi.excel.ExcelImportUtil;
  3. import cn.afterturn.easypoi.excel.entity.ImportParams;
  4. import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
  5. import org.apache.commons.lang3.StringUtils;
  6. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  7. import org.apache.poi.ss.usermodel.Workbook;
  8. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. import org.springframework.web.multipart.MultipartFile;
  12. import javax.servlet.http.HttpServletResponse;
  13. import java.io.IOException;
  14. import java.net.URLEncoder;
  15. import java.util.List;
  16. import java.util.Map;
  17. import java.util.NoSuchElementException;
  18. public class ExcelUtil {
  19. protected static final Logger logger = LoggerFactory.getLogger(ExcelUtil.class);
  20. private static final String XLS = "xls";
  21. private static final String XLSX = "xlsx";
  22. private static final String SPLIT = ".";
  23. public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response){
  24. defaultExport(list, fileName, response);
  25. }
  26. private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
  27. try {
  28. response.setCharacterEncoding("UTF-8");
  29. response.setHeader("content-Type", "application/vnd.ms-excel");
  30. response.setHeader("Content-Disposition",
  31. "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
  32. workbook.write(response.getOutputStream());
  33. } catch (IOException e) {
  34. throw new RuntimeException(e.getMessage());
  35. }
  36. }
  37. private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {
  38. Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
  39. if (workbook != null);
  40. downLoadExcel(fileName, response, workbook);
  41. }
  42. public static <T> List<T> importExcelMore(MultipartFile file, Class<T> pojoClass,ImportParams params){
  43. if (file == null){
  44. return null;
  45. }
  46. List<T> list = null;
  47. try {
  48. list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
  49. }catch (NoSuchElementException e){
  50. throw new RuntimeException("excel文件不能为空");
  51. } catch (Exception e) {
  52. throw new RuntimeException(e.getMessage());
  53. }
  54. return list;
  55. }
  56. public static Workbook getWorkbook(MultipartFile file) {
  57. Workbook workbook=null;
  58. try {
  59. // 获取Excel后缀名
  60. String fileName = file.getOriginalFilename();
  61. if (StringUtils.isEmpty(fileName) || fileName.lastIndexOf(SPLIT) < 0) {
  62. logger.warn("解析Excel失败,因为获取到的Excel文件名非法!");
  63. return null;
  64. }
  65. String fileType = fileName.substring(fileName.lastIndexOf(SPLIT) + 1, fileName.length());
  66. // 获取Excel工作簿
  67. if (fileType.equalsIgnoreCase(XLS)) {
  68. workbook = new HSSFWorkbook(file.getInputStream());
  69. } else if (fileType.equalsIgnoreCase(XLSX)) {
  70. workbook = new XSSFWorkbook(file.getInputStream());
  71. }
  72. } catch (IOException e) {
  73. e.printStackTrace();
  74. }
  75. return workbook;
  76. }
  77. }

4.导出导入用到的 数据类 User.java

  1. import cn.afterturn.easypoi.excel.annotation.Excel;
  2. public class User {
  3. @Excel(name = "学号", orderNum = "0")
  4. private Integer id;
  5. @Excel(name = "姓名", orderNum = "1")
  6. private String userName;
  7. @Excel(name = "年龄", orderNum = "2")
  8. private String userAge;
  9. @Override
  10. public String toString() {
  11. return "User{" +
  12. "id=" + id +
  13. ", userName='" + userName + '\'' +
  14. ", userAge='" + userAge + '\'' +
  15. '}';
  16. }
  17. public User() {
  18. }
  19. public User(Integer id, String userName, String userAge) {
  20. this.id = id;
  21. this.userName = userName;
  22. this.userAge = userAge;
  23. }
  24. public Integer getId() {
  25. return id;
  26. }
  27. public void setId(Integer id) {
  28. this.id = id;
  29. }
  30. public String getUserName() {
  31. return userName;
  32. }
  33. public void setUserName(String userName) {
  34. this.userName = userName;
  35. }
  36. public String getUserAge() {
  37. return userAge;
  38. }
  39. public void setUserAge(String userAge) {
  40. this.userAge = userAge;
  41. }
  42. }

5.写个测试的controller 试一下 :
 

就2个接口,1个导入,1个导出, 都是 多sheet的(其实看懂代码就知道,多sheet是包含单sheet的)

 

先是导出接口 :

 

  1. @GetMapping("exportExcel")
  2. public void exportExcel(HttpServletResponse response) {
  3. List<User> userListOne = new ArrayList<>();
  4. User user1 = new User();
  5. user1.setId(1001);
  6. user1.setUserName("JCccc");
  7. user1.setUserAge("18");
  8. userListOne.add(user1);
  9. List<User> userListTwo = new ArrayList<>();
  10. User user2 = new User();
  11. user2.setId(2001);
  12. user2.setUserName("Mike");
  13. user2.setUserAge("18");
  14. userListTwo.add(user2);
  15. // 多个sheet配置参数
  16. final List<Map<String, Object>> sheetsList = Lists.newArrayList();
  17. final String sheetNameOne = "sheet1-1班";
  18. Map<String, Object> exportMapOne = Maps.newHashMap();
  19. final ExportParams exportParamsOne = new ExportParams(null, sheetNameOne, ExcelType.HSSF);
  20. // 以下3个参数为API中写死的参数名 分别是sheet配置/导出类(注解定义)/数据集
  21. exportMapOne.put("title", exportParamsOne);
  22. exportMapOne.put("entity", User.class);
  23. exportMapOne.put("data", userListOne);
  24. final String sheetNameTwo = "sheet2-2班";
  25. Map<String, Object> exportMapTwo = Maps.newHashMap();
  26. final ExportParams exportParamsTwo = new ExportParams(null, sheetNameTwo, ExcelType.HSSF);
  27. // 以下3个参数为API中写死的参数名 分别是sheet配置/导出类(注解定义)/数据集
  28. exportMapTwo.put("title", exportParamsTwo);
  29. exportMapTwo.put("entity", User.class);
  30. exportMapTwo.put("data", userListTwo);
  31. // 加入多sheet配置列表
  32. sheetsList.add(exportMapOne);
  33. sheetsList.add(exportMapTwo);
  34. //导出操作
  35. ExcelUtil.exportExcel(sheetsList, "userList.xls", response);
  36. }

代码简析:

 

调用一下接口看看效果:

打开下载的excel文件,可以看到多个sheet表数据如愿出现:
 

 

 

 

再看下导入接口 :

 

  1. @PostMapping("importExcel")
  2. public void importExcel(@RequestParam("file") MultipartFile multipartFile) {
  3. try {
  4. //标题占几行
  5. Integer titleRows = 0;
  6. //表头占几行
  7. Integer headerRows = 1;
  8. Workbook workBook = ExcelUtil.getWorkbook(multipartFile);
  9. //获取sheet数量
  10. int sheetNum = workBook.getNumberOfSheets();
  11. ImportParams params = new ImportParams();
  12. //表头在第几行
  13. params.setTitleRows(titleRows);
  14. params.setHeadRows(headerRows);
  15. for (int numSheet = 0; numSheet < sheetNum; numSheet++) {
  16. String sheetName = workBook.getSheetAt(numSheet).getSheetName();
  17. //第几个sheet页
  18. params.setStartSheetIndex(numSheet);
  19. List<User> result = ExcelUtil.importExcelMore(multipartFile, User.class, params);
  20. System.out.println("sheetNum=" + numSheet + " sheetName=" + sheetName);
  21. System.out.println("导入的数据=" + result.toString());
  22. }
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. }
  26. }

代码简析:

 导入的数据样例:

 

调用下接口玩下:

 

可以看到数据都解析拿到了:

 

好了,就到这吧。复制粘贴就能用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/321482
推荐阅读
相关标签
  

闽ICP备14008679号