当前位置: 首页 > article >正文

EasyExcel文件导入与导出

1.文件导入

  • 导入校验
public class BoyListener extends AnalysisEventListener {

    List<String> names = new ArrayList<>();
    /**
     * 每解析一行,回调该方法
     *
     */
    @Override
    public void invoke(Object data, AnalysisContext analysisContext) {

        //校验名称
        String name = ((Boy) data).getName();
        if (StringUtils.isBlank(name)){
            throw new ServiceException(1,"名称不能为空");
        }
        if (names.contains(name)){
            throw new ServiceException(1,"名称已存在");
        }else {
            names.add(name);
        }
    }

    /**
     * 解析异常回调该方法
     * @param exception
     * @param context
     * @throws Exception
     */
    @Override
    public void onException(Exception exception, AnalysisContext context) throws Exception {
        if (exception instanceof ExcelDataConvertException){
            //从0开始
            ExcelDataConvertException ex= (ExcelDataConvertException) exception;
            //获取行号
            int rowIndex = ex.getRowIndex() + 1;
            //获取列号
            int colIndex = ex.getColumnIndex() + 1;
            throw new ServiceException(1,"第"+rowIndex+"行,第"+colIndex+"列数据格式错误");
        } else if (exception instanceof RuntimeException) {
            throw exception;
        }else {
            super.onException(exception, context);
        }
    }

    /**
     * 解析完回调该方法
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        names.clear();
    }
}
  • 导入代码
    @PostMapping("/in")
    public void importIn(MultipartFile file) {
        try {
            InputStream fileInputStream = file.getInputStream();
            List<Boy> sheet1 = EasyExcel.read(fileInputStream)
                    .registerReadListener(new BoyListener())
                    //导入的实体类型
                    .head(Boy.class)
                    .sheet("Sheet1")
                    //跳过第一行,头行
                    .headRowNumber(1)
                    .doReadSync();
            if (!CollectionUtils.isEmpty(sheet1)){
                for (Boy boy : sheet1) {
                    System.out.println(JSON.toJSONString(boy));
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

2.导出

  • 包括导出到本地、响应、文件服务器以及多个sheet导出。
    @PostMapping("/out")
    public void exportOut(HttpServletResponse response) {

        try {
            ServletOutputStream outputStream = response.getOutputStream();
            this.setExcelResponse(response,"测试导出");
            //创建一个list用于存放30个Boy对象-适用于单个sheet
//            List<Boy> boyList = new java.util.ArrayList<>();
//            for (int i = 0; i < 30; i++) {
//                Boy boy = new Boy();
//                boy.setId(i);
//                boy.setName("张三" + i);
//                boy.setSalary((double) (i + 1));
//                boy.setBirthday(LocalDateTime.now());
//                boyList.add(boy);
//            }


            //写出到服务器
//            HashMap<String, Object> paramMap = new HashMap<>();
            //文件上传只需将参数中的键指定(默认file),值设为文件对象即可,对于使用者来说,文件上传与普通表单提交并无区别
//            paramMap.put("Filedata", FileUtil.file(filePath));
//            String result = HttpUtil.post("http://" + url, paramMap);


            //写出至本地
//            EasyExcel.write("src/main/resources/export.xlsx", Boy.class)
//                            .sheet("Sheet1")
//                                    .doWrite(boyList);

            //写出至浏览器
//            EasyExcel.write(outputStream, Boy.class)
//                    .excelType(ExcelTypeEnum.XLSX)
//                    .sheet("Sheet1")
//                    .doWrite(boyList);

            //多个sheet导出
            ExcelWriter writer = EasyExcel.write(outputStream, Boy.class).excelType(ExcelTypeEnum.XLSX).build();
            try {
                this.setExcelResponse(response, "多个sheet导出");
                //分页查询数据
                for(int j=1;j<=5;j++){
                    List<Boy> boyList = new ArrayList<>();
                    for (int i = 0; i < 30; i++) {
                        Boy boy = new Boy();
                        boy.setId(i);
                        boy.setName("张三" + i);
                        boy.setSalary((double) (i + 1));
                        boy.setBirthday(LocalDateTime.now());
                        boyList.add(boy);
                    }
                    //创建新的sheet页
                    WriteSheet sheet = EasyExcel.writerSheet("Sheet" + j).build();
                    writer.write(boyList,sheet );
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
                //释放资源
            }finally {
                writer.finish();
                outputStream.flush();
                outputStream.close();
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private void setExcelResponse(HttpServletResponse response, String rawFileName) throws UnsupportedEncodingException {

        //设置内容类型
        response.setContentType("application/vnd.ms-excel");
        //设置编码格式
        response.setCharacterEncoding("utf-8");
        //设置导出文件名称
        String fileName = URLEncoder.encode(rawFileName.concat(".xlsx"), "UTF-8");
        //设置响应头
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName);
    }

参考文献:https://blog.csdn.net/m0_51963973/article/details/131054664?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-131054664-blog-142551367.235v43pc_blog_bottom_relevance_base2&spm=1001.2101.3001.4242.1&utm_relevant_index=3


http://www.kler.cn/a/369571.html

相关文章:

  • 步入响应式编程篇(三)之spring webFlux与R2DBC
  • OpenCV 版本不兼容导致的问题
  • zabbix7 配置字体 解决中文乱码问题(随手记)
  • Pandas进行MongoDB数据库CRUD
  • 论文速读|Matrix-SSL:Matrix Information Theory for Self-Supervised Learning.ICML24
  • .Net / C# 繁体中文 与 简体中文 互相转换, 支持地方特色词汇
  • stp生成树协议(思科)
  • 如何对pdf文件进行加密?pdf文件加密全攻略与深度解析(5个方法)
  • 前端测试工具详解
  • 【CUDA代码实践03】m维网格n维线程块对二维矩阵的索引
  • 本地Docker部署开源WAF雷池并实现异地远程登录管理界面
  • FPM383C指纹模块超详解 附驱动
  • MPP音视频总结
  • Matlab 疲劳驾驶检测
  • 麒麟V10、UOS系统实现在线合并多个Word文件
  • MySQL 之 索引
  • Claude Financial Data Analyst:基于Claude的金融数据分析工具!免费开源!
  • 关于git上传文件冲突
  • 从docker中导出已经存在的容器
  • 【设计模式系列】适配器模式(九)
  • MySQL 8 下载与安装攻略
  • 第十届文荣奖华丽开幕,郁葱以青春与努力绽放青年演员光芒
  • 新手铲屎官提问,有哪几款噪音低的宠物空气净化器推荐
  • TypeScript-类型注解知识点详解
  • 驾校管理系统|基于java和小程序的驾校管理系统设计与实现(源码+数据库+文档)
  • ubuntu服务器离线安装pytorch(cpu版本)