如何查公司网站开发时间,网站设置专栏有什么好处,显示电脑没有安装wordpress,安卓版傻瓜式编程app软件简介
Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题#xff0c;但POI还是有一些缺陷#xff0c;比如07版Excel解压缩以及解压后存储都是在内存中…简介
Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题但POI还是有一些缺陷比如07版Excel解压缩以及解压后存储都是在内存中完成的内存消耗依然很大。 easyexcel重写了poi对07版Excel的解析一个3M的excel用POI sax解析依然需要100M左右内存改用easyexcel可以降低到几M并且再大的excel也不会出现内存溢出03版依赖POI的sax模式在上层做了模型转换的封装让使用者更加简单方便
网站
官方网站EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excelgithub地址GitHub - alibaba/easyexcel: 快速、简洁、解决大文件内存溢出的java处理Excel工具gitee地址easyexcel: 快速、简洁、解决大文件内存溢出的java处理Excel工具。
16M内存23秒读取75M(46W行25列)的Excel3.2.1版本
当然还有极速模式能更快但是内存占用会在100M多一点 快速开始
读Excel
DEMO代码地址https://github.com/alibaba/easyexcel/blob/master/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/read/ReadTest.java /*** 最简单的读* p1. 创建excel对应的实体对象 参照{link DemoData}* p2. 由于默认一行行的读取excel所以需要创建excel一行一行的回调监听器参照{link DemoDataListener}* p3. 直接读即可*/Testpublic void simpleRead() {String fileName TestFileUtil.getPath() demo File.separator demo.xlsx;// 这里 需要指定读用哪个class去读然后读取第一个sheet 文件流会自动关闭EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();}写Excel
DEMO代码地址https://github.com/alibaba/easyexcel/blob/master/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java /*** 最简单的写* p1. 创建excel对应的实体对象 参照{link com.alibaba.easyexcel.test.demo.write.DemoData}* p2. 直接写即可*/Testpublic void simpleWrite() {String fileName TestFileUtil.getPath() write System.currentTimeMillis() .xlsx;// 这里 需要指定写用哪个class去读然后写到第一个sheet名字为模板 然后文件流会自动关闭// 如果这里想使用03 则 传入excelType参数即可EasyExcel.write(fileName, DemoData.class).sheet(模板).doWrite(data());}web上传、下载
DEMO代码地址https://github.com/alibaba/easyexcel/blob/master/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/web/WebTest.java /*** 文件下载失败了会返回一个有部分数据的Excel* p* 1. 创建excel对应的实体对象 参照{link DownloadData}* p* 2. 设置返回的 参数* p* 3. 直接写这里注意finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大*/GetMapping(download)public void download(HttpServletResponse response) throws IOException {// 这里注意 有同学反应使用swagger 会导致各种问题请直接用浏览器或者用postmanresponse.setContentType(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet);response.setCharacterEncoding(utf-8);// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName URLEncoder.encode(测试, UTF-8).replaceAll(\\, %20);response.setHeader(Content-disposition, attachment;filename*utf-8 fileName .xlsx);EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet(模板).doWrite(data());}/*** 文件上传* p1. 创建excel对应的实体对象 参照{link UploadData}* p2. 由于默认一行行的读取excel所以需要创建excel一行一行的回调监听器参照{link UploadDataListener}* p3. 直接读即可*/PostMapping(upload)ResponseBodypublic String upload(MultipartFile file) throws IOException {EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();return success;
实体中的使用
1.集成easyExcel
dependencygroupIdcom.alibaba/groupIdartifactIdeasyexcel/artifactIdversion3.0.5/version
/dependency
2定义导入导出实体
实体与excel列的映射 创建实体类使用 ExcelProperty、ExcelIgnore 等注解标识导出列 ExcelIgnore 表示忽略此字段 ExcelProperty 用于标识列 value属性设置列的名称index属性设置设置列的序号 从 0 开始
Data
NoArgsConstructor
AllArgsConstructor
public class GamesExcelVO {/*** description: 使用ExcelIgnore注解忽略此字段**/ExcelIgnoreprivate String id;/*** description: 使用ExcelProperty标识列* value属性设置列的名称index属性设置设置列的序号 从 0 开始**/ExcelProperty(value 名称,index 0)private String name;ExcelProperty(value 类型,index 1)private String type;ExcelProperty(value 价格,index 2)private BigDecimal price;}导出excel的代码
GetMapping(/excelExport)public void excelExport(HttpServletResponse response) throws IOException {try{//导出数据(这里使用假数据用来测试)ListGamesExcelVO list Arrays.asList(new GamesExcelVO(UUID.randomUUID().toString().replace(-, ),荒野大镖客:救赎2,开放世界、剧情,new BigDecimal(299.5)),new GamesExcelVO(UUID.randomUUID().toString().replace(-, ),上古卷轴5:天际,开放世界、冒险,new BigDecimal(199.5)),new GamesExcelVO(UUID.randomUUID().toString().replace(-, ),塞尔达传说王国之泪,开放世界、冒险,new BigDecimal(399.5)));//使用easyExcel导出表格EasyExcel.write(response.getOutputStream(),GamesExcelVO.class).sheet(游戏价格) //sheet页名称.doWrite(list); //将要导出的数据}catch (Exception e){log.error(导出失败,e);}finally {//关闭流response.flushBuffer();}}导出的文件 3.Excel复杂表头导出
可将ExcelProperty注解的value属性指定为一个数组来实现复杂表头的导出
与实体的映射
Data
NoArgsConstructor
AllArgsConstructor
public class ClassesExcelVO {/*** description: 可将ExcelProperty注解的value属性指定为一个数组来实现复杂表头的导出**/ExcelProperty(value {1级表头,2},index 0)private Integer title1;ExcelProperty(value {1级表头,3},index 1)private Integer title2;ExcelProperty(value {1级表头,4},index 2)private Integer title3;ExcelProperty(value {1级表头,5},index 3)private Integer title4;ExcelProperty(value {1级表头,2级表头,6},index 4)private Integer title5;ExcelProperty(value {1级表头,2级表头,7},index 5)private Integer title6;ExcelProperty(value {1级表头,8},index 6)private Integer title7;ExcelProperty(value {1级表头,9},index 7)private Integer title8;}导出代码
/*** description: easyExcel复杂表头导出* author: Vinci* date: 2023/8/18 13:04**/GetMapping(/complexExcelExport)public void complexExcelExport(HttpServletResponse response) throws IOException {try{//与简单easyExcel导出的方式一样仅导出对象方式发生变化//创建用于测试的假数据ArrayListClassesExcelVO list new ArrayList();for (int i 0; i 1000; i) {list.add(new ClassesExcelVO(i,i,i,i,i,i,i,i));}//使用easyExcel导出表格EasyExcel.write(response.getOutputStream(),ClassesExcelVO.class).sheet(复杂表头导出测试) //sheet页名称.doWrite(list); //将要导出的数据}catch (Exception e){log.error(导出失败,e);}finally {//关闭流response.flushBuffer();}}导出的文件 4.Excel导入
我们使用 标题3 excel复杂表头导出的excel文件来进行测试代码如下
GetMapping(/excelImport)public void excelImport(RequestParam(file) MultipartFile file){//使用刚刚的复杂导入模板来测试easyExcel导入try {ListClassesExcelVO datas EasyExcel.read(file.getInputStream(), ClassesExcelVO.class, null).excelType(ExcelTypeEnum.XLSX) //可指定文件的导入类型.sheet(0)//读取sheet页码读取多个sheet页可利用循环来进行读取页码从0开始.headRowNumber(4) //设置表头可理解为 读取行 - 1.autoTrim(false) //读取数据时忽略空格默认忽略.doReadSync();//读取到的数据datas.forEach(System.out::println);} catch (Exception e) {log.error(导入失败,e);}}