SXSSFWorkbook高效导出海量数据报表

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);
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值