【测试开发】知识点-使用EasyExcel,实现excel导出和导入

简介: 【测试开发】知识点-使用EasyExcel,实现excel导出和导入

上篇介绍了下EasyExcel的读写excel文件的使用,现在利用它来实现项目中的excel文件导出和导入的功能。


现在有一个字典列表,要把里面的数据实现导出和导入。


1268169-20211215224122517-1172828425.gif


一、实现导出


既然是整合到项目里,跟之前的练习还是有些区别的。说是导出功能,实际上也算是个下载的操作。


1. 实现后端接口


controller 类中增加导出数据字典的控制器方法。


@Api(value = "数据字典的接口")
@RestController
@RequestMapping("/admin/cmn/dict")
@CrossOrigin
public class DictController {
    @Autowired
    private DictService dictService;
    // 导出数据字典接口
    @GetMapping("exportData")
    public void exportDict(HttpServletResponse response) {
        dictService.exportDictData(response);
    }
    // 根据id查询子数据列表
    @ApiOperation(value = "根据id查询子数据列表")
    @GetMapping("findChildData/{id}")
    public Result findChildData(@PathVariable Long id) {
        List<Dict> list = dictService.findChildData(id);
        return Result.ok(list);
    }
}


这里方法exportDict中传参是HttpServletResponse response,为了方便做下载操作。


然后DictService接口中增加对应的方法exportDictData


public interface DictService extends IService<Dict> {
    List<Dict> findChildData(Long id);
    void exportDictData(HttpServletResponse response);
}


接着就是到DictServiceImpl类中实现exportDictData方法了:


// 导出数据字典接口
    @Override
    public void exportDictData(HttpServletResponse response) {
        try {
            // 设置下载信息
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            String fileName = "dict";
            response.setHeader("Content-disposition", "attachment;filename="+ fileName + ".xlsx");
            // 查询库里的数据
            List<Dict> dictList = baseMapper.selectList(null);
            // Dict 转成 DictEeVo
            List<DictEeVo> dictEeVoList = new ArrayList<>(dictList.size());
            for (Dict dict: dictList) {
                DictEeVo dictEeVo = new DictEeVo();
                BeanUtils.copyProperties(dict, dictEeVo);
                dictEeVoList.add(dictEeVo);
            }
            // 调用方法,进行写操作,这里使用输出流
            EasyExcel.write(response.getOutputStream(), DictEeVo.class).sheet("dict").doWrite(dictEeVoList);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


做的事情主要是3件:


  • 先设置下载信息


  • 查询库里的数据


  • 使用EasyExcel.write方法把查出来的数据写到excel文件中


另外,Dict对应的是表里的实体类,DictEeVo则是excel内容的实体类。

调用EasyExcel.write的时候要传入的是DictEeVo类型,而数据库查出来的是Dict,所以有了异步转换的操作。


2. 实现前端


前端可以很简单的实现,通过一个<a>标签就可以:


<a href="http://localhost:8202/admin/cmn/dict/exportData" target="_blank">
        <el-button type="text"> 导出</el-button>
    </a>


target="_blank"是为了打开新的标签页。


测试下:


1268169-20211215224954994-84205219.gif


二、实现导入


1. 实现后端接口


继续增加导入的控制器方法:


// 导入数据字典
    @PostMapping("importData")
    public Result importDict(MultipartFile file) {
        dictService.importDictData(file);
        return Result.ok();
    }


这里参入是MultipartFile file用于获取上传的文件。


跟上面一样的套路,一直到实现importDictData方法。


@Override
    public void importDictData(MultipartFile file) {
    }


不过目前里面还写不了,因为需要先去写一个监听器。


public class DictListener extends AnalysisEventListener<DictEeVo> {
    private DictMapper dictMapper;
    public DictListener(DictMapper dictMapper) {
        this.dictMapper = dictMapper;
    }
    // 一行一行读取
    @Override
    public void invoke(DictEeVo dictEeVo, AnalysisContext analysisContext) {
        // 调用方法,添加到数据库表里
        Dict dict = new Dict();
        // dictEeVo 转换成 dict
        BeanUtils.copyProperties(dictEeVo, dict);
        dictMapper.insert(dict);
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    }
}


注意这里面的一个细节,因为在invoke方法中,一行行读取后,我需要把这每行的数据添加到数据库中,那么自然需要用到dictMapper


那么我这个监听器里如何才可以支持传入dictMapper呢?其中一个方法就是通过有参构造方法来注入:


private DictMapper dictMapper;
    public DictListener(DictMapper dictMapper) {
        this.dictMapper = dictMapper;
    }


现在监听器完成,继续完成importDictData方法:


@Override
    public void importDictData(MultipartFile file) {
        try {
            EasyExcel.read(file.getInputStream(), DictEeVo.class, new DictListener(baseMapper)).sheet().doRead();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


new DictListener(baseMapper))这里在传入监听器的时候里面就要带上dictMapper,这里放的是baseMapper也可以。


2. 实现前端整合


添加导入按钮,绑定@click调用上传方法。


<el-button type="text" @click="importData"> 导入</el-button>


点击导入后跳出对话框,增加友好度。


1268169-20211215233553494-1180960534.png


  • :multiple: 表示是否上传多个文件,这里用单个
    *:on-success: 文件上传成功会调用的方法


  • :action:请求的接口路径


对应里面的方法:


//导入数据字典
        importData() {
            this.dialogImportVisible = true
        },
        //上传成功调用
        onUploadSuccess() {
            //关闭弹框
            this.dialogImportVisible = false
            //刷新页面
            this.getDictList(1)
        },


准备一份数据测试一下:


1268169-20211218153657487-933832912.png


上传成功。


1268169-20211218154137778-2055868699.png


查看数据库里数据正确。


1268169-20211218154213937-1970710375.png


相关文章
|
16天前
|
文字识别 BI
【图片型PDF】批量识别扫描件PDF指定区域局部位置内容,将识别内容导出Excel表格或批量改名文件,基于阿里云OCR对图片型PDF识别改名案例实现
在医疗和政务等领域,图片型PDF文件(如病历、报告、公文扫描件)的处理需求广泛。通过OCR技术识别这些文件中的文字信息,提取关键内容并保存为表格,极大提高了信息管理和利用效率。本文介绍一款工具——咕嘎批量OCR系统,帮助用户快速处理图片型PDF文件,支持区域识别、内容提取、导出表格及批量改名等功能。下载工具后,按步骤选择处理模式、进行区域采样、批量处理文件,几分钟内即可高效完成数百个文件的处理。
86 8
|
2月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
291 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
2月前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
3月前
|
前端开发
实现Excel文件和其他文件导出为压缩包,并导入
实现Excel文件和其他文件导出为压缩包,并导入
52 1
|
3月前
|
数据格式 UED
记录一次NPOI库导出Excel遇到的小问题解决方案
【11月更文挑战第16天】本文记录了使用 NPOI 库导出 Excel 过程中遇到的三个主要问题及其解决方案:单元格数据格式错误、日期格式不正确以及合并单元格边框缺失。通过自定义单元格样式、设置数据格式和手动添加边框,有效解决了这些问题,提升了导出文件的质量和用户体验。
342 3
|
3月前
|
Java API Apache
|
3月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
197 4
|
4月前
|
JavaScript 前端开发 数据处理
Vue导出el-table表格为Excel文件的两种方式
Vue导出el-table表格为Excel文件的两种方式
247 6
|
1月前
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
16天前
|
JSON 前端开发 测试技术
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
85 10
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡

热门文章

最新文章

  • 1
    小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。
  • 2
    3天功能开发→3小时:通义灵码2.0+DEEPSEEK实测报告,单元测试生成准确率92%的秘密
  • 3
    Potpie.ai:比Copilot更狠!这个AI直接接管项目代码,自动Debug+测试+开发全搞定
  • 4
    基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
  • 5
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 6
    大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
  • 7
    「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
  • 8
    用户说 | 通义灵码2.0,跨语言编码+自动生成单元测试+集成DeepSeek模型且免费使用
  • 9
    以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
  • 10
    AxBench:斯坦福大学推出评估语言模型控制方法的基准测试框架