Spring整合EasyExcel

朱雀 2020-10-18 12:12 981阅读 0赞

EasyExcel

EasyExcel 由五部分组成,分别是配置读取类(EasyExcelHalper)、导出Excel类(EasyExcelExportUtil)、导入Excel类(EasyExcelImportUtil)、导入Excel返回结果类(EasyExcelImportResult)和xml配置文件。

应用环境:

  1. 单线程、不牵扯到并发操作。同一时间只有一人做导入操作,或只有管理员有导入权限。(受限于程序中的唯一性校验)
  2. 导入数据,列不超过26(受限于英文26个字母,不合法数据的定位),数量不大(受限于程序中数据校验,不合法数据的定位,所谓越详细就越复杂),支持常用的数据类型。

优点:

  1. 可以控制任意字段的类型、是否可以为空及某个字段的唯一性,避免重复导入。
  2. 精确返回某一条不合法数据的某个字段的位置,方便用户根据提示修改Excel数据。例如:B3
  3. 有严格的数据校验,避免导入的数据不能转成目标类型(数据库字段类型)。
  4. 可以冻结标题行。

缺点:

  1. 既要不合法数据精确定位,又要数据校验,导致控制程序逻辑较多,以性能换取数据质量。
  2. 避免重复导入功能要求不能并发操作。
  3. 数据量不能超过一个sheet页,且数据尽量少。
  4. 需要准确在xml里配置标签、字段、字段数据类型、是否可以为空、是否唯一。

快速入门:

  1. 添加Maven依赖


    commons-configuration
    commons-configuration
    1.10

    commons-collections
    commons-collections
    3.2.2

    org.apache.poi
    poi-ooxml
    3.9
  2. xml配置

默认文件名【easyExcel-config.xml】,当然如果你觉得不爽,可以在EasyExcelHalper类中修改。
默认文件放到src/main/resources根目录下。
无需spring加载该配置文件,EasyExcelHalper类自动去默认位置加载easyExcel-config.xml。
可以配置多个sheet页,在程序中传参选择使用哪个数据模板。

xml的基本结构

  1. <excel>
  2. <sheets>
  3. <sheet>
  4. <title>图书</title>
  5. <freeze>true</freeze>
  6. <columns>
  7. <column>
  8. <name>书名</name>
  9. <type>java.lang.String</type>
  10. <notNull>true</notNull>
  11. <unique>true</unique>
  12. </column>
  13. <!-- column... -->
  14. </columns>
  15. </sheet>
  16. <!-- sheet... -->
  17. </sheets>
  18. </excel>

其中,excel、sheets、sheet、title、columns、column、name、type节点是必有的。
3.jsp

  1. <body>
  2. <a href="book/exportExcel">导出Excel</a>
  3. <form action="book/importExcel" method="post" enctype="multipart/form-data">
  4. <input type="file" value="导入Excel" name="bookExcel">
  5. <input type="submit" value="导入Excel" >
  6. </form>
  7. </body>

4.Controller

  1. import javax.servlet.http.HttpServletResponse;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.ui.Model;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.ResponseBody;
  7. import org.springframework.web.multipart.MultipartFile;
  8. import com.sep6th.service.BookSrvImpl;
  9. import com.sep6th.util.EasyExcelImportResult;
  10. /** * The Apache License 2.0 * Copyright (c) 2018 sep6th */
  11. @Controller
  12. @RequestMapping("/book")
  13. public class BookController {
  14. @Autowired
  15. private BookSrvImpl bookSrv;
  16. /** * 导出 */
  17. @RequestMapping("/exportExcel")
  18. public void exportExcel(HttpServletResponse response) throws Exception {
  19. String fileName = "书籍清单";
  20. bookSrv.exportExcel(response,fileName);
  21. }
  22. /** * 导入 * 返回的json格式: * {"dataCount":3,"errDataCount":0,"importDataCount":3,"xyOfNullList":[],"xyOfTypeNoMatchList":[],"xyOfRepList":[]} */
  23. @RequestMapping("/importExcel")
  24. @ResponseBody
  25. public EasyExcelImportResult importExcel(Model model, MultipartFile bookExcel){
  26. return bookSrv.importExcel(bookExcel);
  27. }
  28. }
  1. Service

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;

    import javax.servlet.http.HttpServletResponse;

    import org.springframework.stereotype.Service;
    import org.springframework.web.multipart.MultipartFile;

    import com.sep6th.util.EasyExcelExportUtil;
    import com.sep6th.util.EasyExcelImportResult;
    import com.sep6th.util.EasyExcelImportUtil;

    /* The Apache License 2.0 Copyright (c) 2018 sep6th /

    @Service
    public class BookSrvImpl {

    1. /** * 导出模板或数据 */
    2. public void exportExcel(HttpServletResponse response, String fileName) {
    3. Map<Integer,List<Object[]>> map = new HashMap<Integer,List<Object[]>>();
    4. map.put(0, null);
    5. try {
    6. EasyExcelExportUtil.export(fileName, map, response);
    7. } catch (Exception e) {
    8. e.printStackTrace();
    9. }
    10. }
    11. /** * 导入数据 * @param bookExcel */
    12. public EasyExcelImportResult importExcel(MultipartFile bookExcel) {
    13. List<List<Object>> dataList = new ArrayList<List<Object>>();
    14. // 模拟数据库查出的唯一标识列
    15. Set<String> uniqueIdSet = new HashSet<String>();
    16. uniqueIdSet.add("11");
    17. uniqueIdSet.add("22");
    18. uniqueIdSet.add("33");
    19. EasyExcelImportResult result= EasyExcelImportUtil.readExcel(bookExcel, 0, dataList, uniqueIdSet);
    20. if(result.getErrDataCount()==0){
    21. System.out.println("模拟取数据,向数据库添加数据中...");
    22. for (List<Object> list: dataList){
    23. for (int i = 0; i < list.size(); i++) {
    24. System.out.print(list.get(i)+" ");
    25. }
    26. System.out.println();
    27. }
    28. result.setImportDataCount((long) dataList.size());
    29. }
    30. return result;
    31. }

    }

发表评论

表情:
评论列表 (有 0 条评论,981人围观)

还没有评论,来说两句吧...

相关阅读