SXSSFWorkbook相对于XSSFWorkbook的特点就是低内存占用,SXSSFWorkbook内存里保留最新一部分的excel row,之前的以临时文件方式先写到硬盘,用硬盘空间换内存。下面是我自己在工作中封装的一个工具类
package com.cqmc.cqiop.portal.autobusinessMg.util;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @program: cqiop-core
* @description: 导出报表
* @author:
* @create: 2019-12-23 16:55
**/
public class ExportData {
//ExportData
public static void exportToXlsx(HttpServletRequest request, HttpServletResponse response, String fileName,String sheetName, List<LinkedHashMap<String,String>> dataMap, String describe, String cachePath){
//处理一下文件名称
fileName=hanldeFileName(fileName,"","");
//是否需要缓存到服务器
if(StringUtils.isEmpty(cachePath)){
SXSSFWorkbook workbook = createWorkbook(sheetName, describe, dataMap);
noCacheDownload(request,response,fileName,workbook);
}else{
String cacheFileName =ifExistTargetCacheFile(cachePath, "", "20191225", ".xlsx");
//先缓存一份到服务器
if(cacheFileName==null) {
SXSSFWorkbook workbook = createWorkbook(sheetName, describe, dataMap);
cacheXlsxFileToServer(fileName, cachePath, workbook);
cacheFileName=fileName;
}
//从服务器下载
directDownloadToServer(request,response,cacheFileName,cachePath);
}
}
//生成工作簿并填充数据
public static SXSSFWorkbook createWorkbook(String sheetName,String describe, List<LinkedHashMap<String,String>> dataMap){
// 创建工作簿(.xlsx格式)
SXSSFWorkbook book = new SXSSFWorkbook();
CellStyle cellStyle = book.createCellStyle();
cellStyle.setFillForegroundColor(IndexedColors.WHITE.index);// 设置背景色
cellStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
cellStyle.setBorderBottom(CellStyle.BORDER_THIN); // 下边框
cellStyle.setBorderLeft(CellStyle.BORDER_THIN);