• 使用EasyExcel导入导出数据字典


    目录

    1、导出excel

    1.1、导入依赖

    1.2、编写需要导出对象的实体类

    1.3、编写service

    1.4、编写controller

    1.5、编写前端页面

    1.6、测试

    2、导入excel

    2.1、创建回调监听器

    2.2、创建接口

    2.5、测试


    1、导出excel

    1.1、导入依赖

    1. com.alibaba
    2. easyexcel
    3. 2.1.1

    1.2、编写需要导出对象的实体类

    原实体类Dict:

    1. @Data
    2. @ApiModel(description = "数据字典")
    3. @TableName("dict")
    4. public class Dict extends BaseEntity {
    5. private static final long serialVersionUID = 1L;
    6. @ApiModelProperty(value = "上级id")
    7. @TableField("parent_id")
    8. private Long parentId;
    9. @ApiModelProperty(value = "名称")
    10. @TableField("name")
    11. private String name;
    12. @ApiModelProperty(value = "值")
    13. @TableField("value")
    14. private String value;
    15. @ApiModelProperty(value = "编码")
    16. @TableField("dict_code")
    17. private String dictCode;
    18. @ApiModelProperty(value = "是否包含子节点")
    19. @TableField(exist = false)
    20. private boolean hasChildren;
    21. }

    导出实体类DictEeVo:

    1. @Data
    2. public class DictEeVo {
    3. @ExcelProperty(value = "id" ,index = 0)
    4. private Long id;
    5. @ExcelProperty(value = "上级id" ,index = 1)
    6. private Long parentId;
    7. @ExcelProperty(value = "名称" ,index = 2)
    8. private String name;
    9. @ExcelProperty(value = "值" ,index = 3)
    10. private String value;
    11. @ExcelProperty(value = "编码" ,index = 4)
    12. private String dictCode;
    13. }

    1.3、编写service

    导出接口:

    1. /**
    2. * 导出
    3. * @param response
    4. */
    5. void exportData(HttpServletResponse response);

    实现类:

    1. /**
    2. * excel导出
    3. * @param response
    4. */
    5. @Override
    6. public void exportData(HttpServletResponse response) {
    7. try {
    8. response.setContentType("application/vnd.ms-excel");
    9. response.setCharacterEncoding("utf-8");
    10. // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
    11. String fileName = URLEncoder.encode("数据字典", "UTF-8");
    12. response.setHeader("Content-disposition", "attachment;filename="+ fileName + ".xlsx");
    13. //查询需要导出的数据
    14. List dictList = dictMapper.selectList(null);
    15. //vo
    16. List dictVoList = new ArrayList<>(dictList.size());
    17. //将dict复制到dictVo
    18. for(Dict dict : dictList) {
    19. DictEeVo dictVo = new DictEeVo();
    20. BeanUtils.copyProperties(dict, dictVo, DictEeVo.class);
    21. dictVoList.add(dictVo);
    22. }
    23. EasyExcel.write(response.getOutputStream(), DictEeVo.class).sheet("数据字典").doWrite(dictVoList);
    24. } catch (IOException e) {
    25. e.printStackTrace();
    26. }
    27. }

    1.4、编写controller

    1. @ApiOperation(value="导出")
    2. @GetMapping(value = "/exportData")
    3. public void exportData(HttpServletResponse response) {
    4. dictService.exportData(response);
    5. }

    1.5、编写前端页面

    按钮:

        <el-button type="primary" @click="exportData">导出el-button>

    导出方法:

    1. //导出excel
    2. exportData() {
    3. window.location.href = "http://localhost:8202/dict/exportData";
    4. },

    1.6、测试

    2、导入excel

    2.1、创建回调监听器

    1. package com.rk.cmn.listener;
    2. import com.alibaba.excel.context.AnalysisContext;
    3. import com.alibaba.excel.event.AnalysisEventListener;
    4. import com.rk.cmn.service.DictService;
    5. import com.rk.hosp.model.cmn.Dict;
    6. import com.rk.hosp.vo.cmn.DictEeVo;
    7. import lombok.extern.slf4j.Slf4j;
    8. import org.springframework.beans.BeanUtils;
    9. import java.util.ArrayList;
    10. import java.util.List;
    11. /**
    12. * @author :Rk.
    13. * @date : 2022/11/4
    14. */
    15. // 有个很重要的点 DictEeVoListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去 构造方法注入
    16. @Slf4j
    17. public class DickListener extends AnalysisEventListener {
    18. /**
    19. * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
    20. */
    21. private static final int BATCH_COUNT = 100;
    22. /**
    23. * 缓存的数据
    24. */
    25. private List cachedDataList =new ArrayList<>(BATCH_COUNT);
    26. /**
    27. * 真正存储的集合
    28. */
    29. List list= new ArrayList<>();
    30. private DictService dictService;
    31. public DickListener(DictService dictService) {
    32. this.dictService = dictService;
    33. }
    34. /**
    35. * 这个每一条数据解析都会来调用
    36. */
    37. @Override
    38. public void invoke(DictEeVo dictEeVo, AnalysisContext context) {
    39. cachedDataList.add(dictEeVo);
    40. //需要将dictEeVo对象转换为dict 才能存储
    41. Dict dict=new Dict();
    42. BeanUtils.copyProperties(dictEeVo,dict);
    43. list.add(dict);
    44. // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
    45. if (cachedDataList.size() >= BATCH_COUNT) {
    46. saveData();
    47. // 存储完成清理 list
    48. cachedDataList.clear();
    49. list.clear();
    50. }
    51. }
    52. /**
    53. * 所有数据解析完成了 都会来调用
    54. * @param context
    55. */
    56. @Override
    57. public void doAfterAllAnalysed(AnalysisContext context) {
    58. // 这里也要保存数据,确保最后遗留的数据也存储到数据库
    59. saveData();
    60. log.info("所有数据解析完成!");
    61. }
    62. /**
    63. * 加上存储数据库
    64. */
    65. private void saveData() {
    66. log.info("{}条数据,开始存储数据库!", list.size());
    67. dictService.saveBatch(list);
    68. log.info("存储数据库成功!");
    69. }
    70. }

    2.2、创建接口

    1. @ApiOperation(value = "导入")
    2. @PostMapping("importData")
    3. public Result importData(MultipartFile file) throws IOException {
    4. //0代表读取excel的sheet1
    5. EasyExcel.read(file.getInputStream(), DictEeVo.class,new DickListener(dictService)).sheet(0).doRead();
    6. return Result.ok();
    7. }

    2.3、前端上传按钮和上传弹窗

    按钮:

    "success" @click="importData"><i class="fa fa-plus" /> 导入

    弹窗:

    1. <el-dialog title="导入" :visible.sync="dialogImportVisible" width="480px">
    2. <el-form>
    3. <el-form-item label="文件">
    4. <el-upload
    5. class="upload-demo"
    6. :on-success="onUploadSuccess"
    7. :on-error="onUploadError"
    8. :show-file-list="false"
    9. action="http://localhost:8202/admin/cmn/dict/importData"
    10. :multiple="false"
    11. >
    12. <el-button size="small" type="primary">点击上传el-button>
    13. <div slot="tip" class="el-upload__tip">只能上传xls文件,且不超过500kbdiv>
    14. el-upload>
    15. el-form-item>
    16. el-form>
    17. <div slot="footer" class="dialog-footer">
    18. <el-button @click="dialogImportVisible = false"> 取消 el-button>
    19. div>
    20. el-dialog>

    2.4、前端上传方法

    1. //导入ecxel
    2. importData(){
    3. //弹出上传窗口
    4. this.dialogImportVisible=true;
    5. },
    6. //文件上传成功调用
    7. onUploadSuccess(){
    8. this.$message({
    9. type: "success",
    10. message: "导入成功!",
    11. });
    12. this.dialogImportVisible = false
    13. this.getChlidData(1);
    14. },
    15. //文件上传失败调用
    16. onUploadError(){
    17. this.$message({
    18. type: "error",
    19. message: "导入失败!",
    20. });
    21. this.dialogImportVisible = false
    22. this.fetchData()
    23. },

    2.5、测试

    将下面的excel表格上传

  • 相关阅读:
    鸿蒙HarmonyOS开发:如何灵活运用服务卡片提升用户体验
    sox音频处理和ffmpeg评测
    2022第四季度的机遇,Genesis Universe限量卡牌争夺战开启
    搜索与图论 ---- 染色法判定二分图
    克鲁斯卡尔算法
    [开源项目推荐]privateGPT使用体验和修改
    转码服务serverless探索
    机器学习中常用的评价指标
    深入聊聊java中判等问题:你真的会用==和equals吗
    外汇天眼:活久见!假冒平台见多了,假冒监管机构你见过吗?
  • 原文地址:https://blog.csdn.net/m0_46979453/article/details/127685572