简介
Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到KB级别,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便
代码地址
读取excel
读07版小于1000行数据返回List
List<Object> data = EasyExcelFactory.read(inputStream, new Sheet(1, 0));
读07版小于1000行数据返回List<? extend BaseRowModel>
List<Object> data = EasyExcelFactory.read(inputStream, new Sheet(2, 1,JavaModel.class));
读07版大于1000行数据返回List
ExcelListener excelListener = new ExcelListener();
EasyExcelFactory.readBySax(inputStream, new Sheet(1, 1), excelListener);
读07版大于1000行数据返回List<? extend BaseRowModel>
ExcelListener excelListener = new ExcelListener();
EasyExcelFactory.readBySax(inputStream, new Sheet(2, 1,JavaModel.class), excelListener);
读03版方法同上
写入excel
没有模板
/**
* 表头动态生成
* @throws Exception
*/
public void writeExcelDynamic() throws Exception {
// 文件输出位置
OutputStream out = new FileOutputStream(path + ClassUtils.getMethodName() + ".xlsx");
ExcelWriter writer = EasyExcelFactory.getWriter(out);
// 动态添加表头,适用一些表头动态变化的场景
Sheet sheet1 = new Sheet(1, 0);
sheet1.setSheetName("第一个sheet");
// 创建一个表格,用于 Sheet 中使用
Table table1 = new Table(1);
// 自定义表格样式
table1.setTableStyle(DataUtil.createTableStyle());
// 无注解的模式,动态添加表头
table1.setHead(DataUtil.createTestListStringHead());
// 写数据
writer.write1(DataUtil.createDynamicModelList(), sheet1, table1);
// 合并单元格
writer.merge(5, 6, 0, 4);
// 将上下文中的最终 outputStream 写入到指定文件中
writer.finish();
// 关闭流
out.close();
}
有模板
/**
* 简单的excel写出
* 表头根据注解生成
* @throws Exception
*/
public void writeExcelSimple() throws Exception {
// 文件输出位置
OutputStream out = new FileOutputStream(path + ClassUtils.getMethodName() + ".xlsx");
ExcelWriter writer = EasyExcelFactory.getWriter(out);
// 写仅有一个 Sheet 的 Excel 文件, 此场景较为通用
Sheet sheet1 = new Sheet(1, 0, WriteModelUser.class);
// 第一个 sheet 名称
sheet1.setSheetName("第一个sheet");
// 写数据到 Writer 上下文中
// 入参1: 创建要写入的模型数据
// 入参2: 要写入的目标 sheet
writer.write(DataUtil.createModelList(), sheet1);
// 将上下文中的最终 outputStream 写入到指定文件中
writer.finish();
// 关闭流
out.close();
}
web下载实例写法
public class Down {
@GetMapping("/a.htm")
public void cooperation(HttpServletRequest request, HttpServletResponse response) {
ServletOutputStream out = response.getOutputStream();
response.setContentType("multipart/form-data");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename="+fileName+".xlsx");
ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true);
String fileName = new String(("UserInfo " + new SimpleDateFormat("yyyy-MM-dd").format(new Date()))
.getBytes(), "UTF-8");
Sheet sheet1 = new Sheet(1, 0);
sheet1.setSheetName("第一个sheet");
writer.write0(getListString(), sheet1);
writer.finish();
out.flush();
}
}
}
参考链接
(本篇博文完结;中文字数一共:3001字,英文字数一共:618 字)
扫扫加关注公众号 让我们一起学习一起成长