com.alibaba easyexcel 3.1.1
@Data
@ContentRowHeight(21) //行高
@HeadRowHeight(30) //excel内头高度
@ColumnWidth(15) //每列宽度public class ExcelModel {@ExcelIgnore //忽略此表头内容private Integer id;// 主键ID@ExcelProperty(value = "姓名") //表头内容private String name;// 姓名@ExcelProperty(value = "年龄")private Integer age;// age@ExcelProperty(value = "地址")private String address;// 地址@ExcelProperty(value = "性别")private String sex;// 性别@ExcelIgnore private Integer pageStartIndex;//起始索引 查询索引位置@ExcelIgnore private Integer pageSize;//每页数量 相当于数据库内数据步长
}
@Param 选择 引入 import org.apache.ibatis.annotations.Param;
Integer selecttxxxCount(@Param("model")ExcelModel model);List selectData(@Param("model")ExcelModel model);
客户端是下载的作用,数据的处理是在服务器端进行的
xxxClass 类 作用接收前端传递来的对应数据参数 比如 页码、每页大小 其他筛选条件等
xxxentity 类对应的实例
xxxMapper 对应的mapper文件名
//响应输出流在下方使用了 这个就不用了
ServletOutputStream outputStream = response.getOutputStream();
select * from table_name limit startIndex,step
举例 select * from table_name limit 15,1000xxxentity.setPageStartIndex(i * page_size); ---对应起始索引
xxxentity.setPageSize(page_size); --对应查询的记录行数
//核心代码public void exportExcelData(HttpSession session, HttpServletResponse response, xxxClass xxxentity) throws Exception {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");response.setHeader("Content-disposition", "attachment;filename="+new Date()+"defineExcelName.xlsx");//查询总条数List total = xxxMapper.selecttxxxCount(xxxentity); //计算页数// 定义每个sheet数据数量int page_size = 3000;//计算将分多少页int export_pagenumber = total % page_size > 0 ? total / page_size + 1 : total / page_size;//创建输出流 ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), ExcelModel.class).build();for (int i = 0; i < export_pagenumber; i++) {WriteSheet writeSheet = new WriteSheet(); //创建工作簿writeSheet.setSheetName("第"+(i+1)+"页");xxxentity.setPageStartIndex(i * page_size); //某处起始索引 (固定步长行数*第几个i)xxxentity.setPageSize(page_size);//从起始索引开始对应的截取数据 step 步长行数List dataList = xxxMapper.selectData(xxxentity);//每循环一次 查出的数据进行写入一个sheet 工作簿excelWriter.write(dataList,writeSheet);}//循环结束 excelWriter.finish();//整个Excel文件写数据结束response.flushBuffer();//强制刷新}
//核心代码public void exportExcelData(HttpSession session, HttpServletResponse response, xxxClass xxxentity) throws Exception {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");response.setHeader("Content-disposition", "attachment;filename="+new Date()+"defineExcelName.xlsx");//一次性查询数据List dataList= xxxMapper.selectData(xxxentity);//循环结束 EasyExcel.write(response.getOutputStream(), ExcelModel.class).sheet("单个sheet工作簿名称").doWrite(dataList);}
导致内存溢出(OOM)
List datalist = new ArrayList<>();for (int i = 0; i < export_pagenumber; i++) {xxxentity.setPageStartIndex(i * page_size);xxxentity.setPageSize(page_size);List list= xxxMapper.selectData(xxxentity);datalist.addAll(list.subList(0,list.size()));//将查询出的集合集中收集在datalist}
EasyExcel.write(response.getOutputStream(), ExcelModel.class).sheet("单个sheet工作簿名称").doWrite(dataList);
SAX解析器读取输入文档并在处理文档时将每个事件推给文档处理器(MyContentHandler)。与DOM相比,SAX解析器能提供更好的性能优势,它提供对XML文档内容的有效低级访问。SAX模型最大的优点是内存消耗小,因为整个文档无需一次加载到内存中,这使SAX解析器可以解析大于系统内存的文档。另外,你无需像在DOM中那样为所有节点创建对象。最后,SAX“推”模型可用于广播环境,能够同时注册多个ContentHandler,并行接收事件,而不是在一个管道中一个接一个地进行处理。