工作中用到excel的多sheet页数据的读取和下载多sheet页的数据,之前都是手动一个一个表格自己拼装数据.最近研究了EasyExcel,话不多说直接上代码

1.导入sheet页面的实体类

@Data
public class ReqCustomerDailyImport {/*** 客户名称*/@ExcelProperty(index = 0)private String customerName;/*** MIS编码*/@ExcelProperty(index = 1)private String misCode;/*** 月度滚动额*/@ExcelProperty(index = 3)private BigDecimal monthlyQuota;/*** 最新应收账款余额*/@ExcelProperty(index = 4)private BigDecimal accountReceivableQuota;/*** 本月利率(年化)*/@ExcelProperty(index = 5)private BigDecimal dailyInterestRate;
}

2.导出sheet页面的实体类

@Data
//@Builder
public class RespCustomerDailyImport {@ExcelProperty("客户编码")private String customerName;@ExcelProperty("MIS编码")private String misCode;@ExcelProperty("月度滚动额")private BigDecimal monthlyQuota;@ExcelProperty("最新应收账款余额")private BigDecimal accountReceivableQuota;@NumberFormat("#.##%")@ExcelProperty("本月利率(年化)")private BigDecimal dailyInterestRate;
}

3.导入和导出的controller

@Controller
@Api(tags = "ExcelController", description = "excel读写")
@RequestMapping("/excel")
public class ExcelController {@PostMapping("/singleImport")public void importCustomerDaily(@RequestParam MultipartFile file) throws IOException {InputStream inputStream = file.getInputStream();List<ReqCustomerDailyImport> reqCustomerDailyImports = EasyExcel.read(inputStream).head(ReqCustomerDailyImport.class)// 设置sheet,默认读取第一个.sheet()// 设置标题所在行数.headRowNumber(2).doReadSync();System.out.println(reqCustomerDailyImports);}@PostMapping("/MultiImport")public void MultiImportCustomerDaily(@RequestParam MultipartFile file) throws IOException {InputStream inputStream = file.getInputStream();//新建监听器ExcelListener listener = new ExcelListener();ExcelReader excelReader = EasyExcel.read(inputStream, listener).build();// 第一个sheet读取类型ReadSheet readSheet1 = EasyExcel.readSheet(0).head(ReqCustomerDailyImport.class).build();// 第二个sheet读取类型ReadSheet readSheet2 = EasyExcel.readSheet(1).head(ReqCustomerDailyImport.class).build();// 开始读取第一个sheetexcelReader.read(readSheet1);List<Object> list = listener.getDatas();list.forEach((user) -> {ReqCustomerDailyImport import1 = (ReqCustomerDailyImport) user;System.out.println(import1.getCustomerName() + ", " + import1.getMisCode());});// 清空之前的数据listener.getDatas().clear();System.out.println("---------------------------------");// 开始读取第二个sheetexcelReader.read(readSheet2);List<Object> list2 = listener.getDatas();list2.forEach((user) -> {ReqCustomerDailyImport import2 = (ReqCustomerDailyImport) user;System.out.println(import2.getCustomerName() + ", " + import2.getMisCode());});}@GetMapping("/singleExport")public void export(HttpServletResponse response) throws IOException {// 生成数据List<RespCustomerDailyImport> respCustomerDailyImports = Lists.newArrayList();for (int i = 0; i < 50; i++) {RespCustomerDailyImport model = new RespCustomerDailyImport();model.setCustomerName("customerName" + i);model.setMisCode(String.valueOf(i));model.setMonthlyQuota(new BigDecimal(String.valueOf(i)));model.setAccountReceivableQuota(new BigDecimal(String.valueOf(i)));model.setDailyInterestRate(new BigDecimal(String.valueOf(i)));respCustomerDailyImports.add(model);}response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("test", "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");EasyExcel.write(response.getOutputStream(), RespCustomerDailyImport.class).sheet("sheet0")// 设置字段宽度为自动调整,不太精确.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).doWrite(respCustomerDailyImports);}@GetMapping("/MultiExport")public void MultiExport(HttpServletResponse response) throws IOException {// 生成数据List<RespCustomerDailyImport> respCustomerDailyImports = Lists.newArrayList();for (int i = 0; i < 50; i++) {RespCustomerDailyImport model = new RespCustomerDailyImport();model.setMisCode(String.valueOf(i));model.setCustomerName("customerName" + i);model.setMonthlyQuota(new BigDecimal(String.valueOf(i)));model.setDailyInterestRate(new BigDecimal(String.valueOf(i)));model.setAccountReceivableQuota(new BigDecimal(String.valueOf(i)));respCustomerDailyImports.add(model);}response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("test", "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");// 测试多sheel导出ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();WriteSheet test1 = EasyExcel.writerSheet(0, "sheet0").head(RespCustomerDailyImport.class).build();WriteSheet test2 = EasyExcel.writerSheet(1, "sheet1").head(RespCustomerDailyImport.class).build();excelWriter.write(respCustomerDailyImports, test1).write(respCustomerDailyImports, test2);excelWriter.finish();}
}

4.由于导入excel 读取多sheet页的数据时需要自己写个Listener 代码如下

//此Listener 不能被Spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
public class ExcelListener extends AnalysisEventListener<Object> {    private static final Logger LOGGER = LoggerFactory.getLogger(ExcelListener.class);/*** 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收*/private static final int BATCH_COUNT = 30000;List<Object> list = new ArrayList<>();public ExcelListener() {}/*** 这个每一条数据解析都会来调用** @param data*            one row value. Is is same as {@link AnalysisContext#readRowHolder()}* @param context*/@Overridepublic void invoke(Object data, AnalysisContext context) {LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));list.add(data);// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (list.size() >= BATCH_COUNT) {saveData();// 存储完成清理 listlist.clear();}}/*** 所有数据解析完成了 都会来调用** @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 这里也要保存数据,确保最后遗留的数据也存储到数据库saveData();LOGGER.info("所有数据解析完成!");}/*** 获取数据* @return*/public List<Object> getDatas() {return list;}/*** 加上存储数据库*/private void saveData() {LOGGER.info("{}条数据,开始存储数据库!", list.size());
//        demoDAO.save(list);LOGGER.info("存储数据库成功!");}//    /**
//     * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
//     */
//    private DemoDAO demoDAO;
//    public ExcelListener() {
//        // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
//        demoDAO = new DemoDAO();
//    }
//    /**
//     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
//     *
//     * @param demoDAO
//     */
//    public ExcelListener(DemoDAO demoDAO) {
//        this.demoDAO = demoDAO;
//    }}

EasyExcel怎么读取下载多个sheet页数据相关推荐

  1. EasyExcel web下载excel,多sheet页demo

    EasyExcel web下载excel,多sheet页demo pom.xml <dependency><groupId>com.alibaba</groupId> ...

  2. java读取sheet2_java读取Excel指定sheet页或全部sheet页数据(含2003和2007版本)

    java读取Excel指定sheet页或全部sheet页数据(含2003和2007版本) 在http://download.csdn.net/detail/u010792467/8072015下载所需 ...

  3. python读取excel多个sheet页并合并成一页

    python读取excel多个sheet页并合并成一页 import xlrd import xlwtdata = xlrd.open_workbook("database.xlsx&quo ...

  4. fastexcel读取excel追加写入sheet页_python笔记52:python操作excel

    主要内容: 小目标:掌握excel模块 主要内容:excel相关模块,openpyxl安装使用 如果看完这篇文章,你还是弄不明excel相关操作: 你来找我,我保证不打你,我给你发100的大红包. 1 ...

  5. fastexcel读取excel追加写入sheet页_Python写入和读取excel

    xlrd:用于读取 Excel 文件: xlwt:用于写入 Excel 文件: xlutils:用于操作 Excel 文件的实用工具,比如复制.分割.筛选等: xlwt这个模块只能输出.xls文件,不 ...

  6. EasyExcel多sheet页导出详细代码记录

    一.引入pom依赖 <!--excel--><dependency><groupId>com.alibaba</groupId><artifact ...

  7. EasyExcel 实现多个Sheet页导出

    1 Maven依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel< ...

  8. Python+xlrd:实现Excel文件内容读取(全文件or指定sheet页)

    一.xlrd常用方法简述: 代码示例 方法释义 book = xlrd.open_workbook(xlsx_path) 实例化工作簿对象 book sheet_num = book.nsheets ...

  9. Java Excel 复制单元格 poi Excel 复制单元格 Java Excel 复制行 Java Excel 复制 sheet 页 poi excel copy

    Java Excel 复制单元格 poi Excel 复制单元格 Java Excel 复制行 Java Excel 复制 sheet 页 一.前言 1.本文记录 poi excel 实现 单元格ce ...

最新文章

  1. Google Objective-C Style Guide
  2. js中字符串转json
  3. 2021年10大人工智能趋势
  4. 详解 lsusb命令
  5. 误删50节点K8s集群为何3小时才能复原?Spotify揭自家事故幕后经验
  6. ffplay分析 (视频从Frame(解码后)队列取数据到SDL输出)
  7. Office编程(二)C#读取Excel并存入数据库,通过XML自定义表名,是否重建并插入数据...
  8. pytorch框架快速测试你的模型结构是否存在问题并得到输出形状
  9. form表单target的用法 替代window.open
  10. 我国会计界计算机软件界大规模研究,初级会计电算化第一章练习.doc
  11. [经典]PK:星际争霸 vs 魔兽争霸3 vs 红警
  12. dmp格式怎么转换_DMP文件怎么打开
  13. 五一游天坛,体验超震撼的大像素全景
  14. 一种简单的色彩平衡算法的OPENCV实现
  15. ip route 命令的作用详解
  16. HR吐槽某博士程序员:简历写了12页,是不是读书读傻了
  17. 数据库一致性、完整性
  18. Linux终端一直输出login,Linux tty pty console区别
  19. JavaScript----marquee滚动标签 图片无缝滚动 插入百度地图
  20. 共模电感|共模信号|差分信号

热门文章

  1. 为什么要下断bpSend,原理分析。
  2. 深富策略:节前最后一个交易日策略该如何
  3. Xilinx官网下载不同版本的Vivado
  4. iFrame 滚动条等属性的设置
  5. hadoop的搭建教程
  6. 计算机组成原理(第2版)唐朔飞 - 详细目录分享(无pdf)
  7. linux括号转义字符串,C#格式化字符串中转义大括号“{}”
  8. 房总鼎立分享收入多少合适理财?低收入家庭理财办法有什么?
  9. MFC 使用D3D库进行播放视频,编译存在很多重定义及相关结构体找不到定义的问题
  10. Java中import语句的作用