java po大数据量Excel

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29923439/article/details/75257701

     POI之前的版本不支持大数据量处理,如果数据过多则经常报OOM错误,有时候调整JVM大小效果也不是太好。3.8版本的POI新出来了SXSSFWorkbook,可以支持大数据量的操作

/**
 * POI导出工具类
 */
public class ExportExcelByPoi {
// 标题字体
private static XSSFFont titleFont = null; // 2007格式

private static final Logger logger = LoggerFactory
.getLogger(ExportExcelByPoi.class);
/**
* Excel导出下载

* @param fileName
*            文件名
* @param sheetName
*            sheet名
* @param title
*            EXCEL文件标题数据集合
* @param contentMap
*            (sheet,数据) EXCEL文件正文数据集合
* @return
*/
public static final boolean exportExcel(String exportROOT,
String sheetName[], String fileName, String[] title,
String[] column, Map<String, List<String[]>> contentMap) {
try {
File file = new File(exportROOT);
if (!file.exists()) {
file.mkdirs();
}
File excel = new File(exportROOT+ fileName);
if (excel.exists()) {
excel.delete();
}
FileOutputStream fileOutputStream = new FileOutputStream(exportROOT
+ fileName);
return createExcel(fileOutputStream, title, column, contentMap,
sheetName);
} catch (IOException e) {
return false;
}


}


/**
* 创建Excel并写到输出流中
*/
public static final boolean createExcel(FileOutputStream os,
String[] title, String[] column,
Map<String, List<String[]>> contentMap, String sheetName[]) {
try {
//XSSFWorkbook wb = new XSSFWorkbook();// 2007格式
SXSSFWorkbook wb=new SXSSFWorkbook();//SXSSFWorkbook用来处理大数据量以及超大数据量的导出。 
//以下XSSF***8全部改为SXSSF****
for (int s = 0; s < sheetName.length; s++) {// 循环每个sheet
SXSSFSheet sheet =(SXSSFSheet) wb.createSheet(sheetName[s]);// 2007格式
/** ***************以下是EXCEL列标题********************* */
SXSSFRow titleRow = (SXSSFRow) sheet.createRow((short) 0);// 2007格式
titleRow.setHeight((short) 100);// 设置行高,设置太小可能被隐藏看不到
titleRow.setHeightInPoints(15);// 像素
int titleCount = title.length;// 列数
// 写标题
for (int k = 0; k < titleCount; k++) {
/**
* 设定合并单元格区域范围
* firstRow(0-based),lastRow(0-based),firstCol(0-based
* ),lastCol(0-based)
*/
CellRangeAddress cra;
SXSSFCell cell;
if (k == 0) {
cra = new CellRangeAddress(0, 0, 0, 0);
cell = (SXSSFCell) titleRow.createCell((short) k);
} else {
cra = new CellRangeAddress(0, 0, (k - 1) * 5 + 1, k * 5);// 合并单元格
cell = (SXSSFCell) titleRow.createCell((short) (k - 1) * 5 + 1);
}
// 在sheet里增加合并单元格
sheet.addMergedRegion(cra);
// 为单元格赋值
cell.setCellType(XSSFCell.CELL_TYPE_STRING);
cell.setCellValue(title[k]);
}
/** ***************以下是EXCEL第二行标题数据(可以不存在)********************* */
if (column != null && column.length > 0) {
SXSSFRow row1 = (SXSSFRow) sheet.createRow((short) 1);
for (int n = 0; n < column.length; n++) {// 第二行
SXSSFCell cell1 = (SXSSFCell) row1.createCell((short) n);
cell1.setCellType(XSSFCell.CELL_TYPE_STRING);
if (n == 0)
cell1.setCellValue(sheetName[s]);
else
cell1.setCellValue(column[n]);
}
}
/** ***************以下是EXCEL正文数据********************* */
List<String[]> contentList = contentMap.get(sheetName[s]);
if(contentList!=null){
int contentCount = contentList.size();// 总的记录数
// 写内容
for (int i = 0; i < contentCount; i++) {// 按月循环的数据
String[] contents = contentList.get(i);
SXSSFRow row = (SXSSFRow) sheet.createRow(i
+ (ArrayUtils.isEmpty(column) ? 1 : 2)); // //2007格式
// 新建一行
for (int j = 0; j < contents.length; j++) {// 该月数据
SXSSFCell cell = (SXSSFCell) row.createCell((short) j); // //2007格式
// 新建一个单元格
if (contents[j] == null || contents[j].equals("null")) {
contents[j] = "";
} else {
cell.setCellValue(new XSSFRichTextString(
contents[j]));
//加样式
/*XSSFCellStyle style=(XSSFCellStyle) wb.createCellStyle();
cell.setCellStyle(setColor(style,wb,j));*/
//加样式结束
}
}
}
}
/** 样式初始化 */
//initColor(sheet, wb);
/** **********将以上缓存中的内容写到EXCEL文件中******** */
}
wb.write(os);
os.flush();
/** *********关闭文件************* */
os.close();
return true;
} catch (Exception e) {
logger.error("生成excel出错了"+e.getMessage());
return false;
}
}

未用SXSSFWorkbook测试(1,2,3部为其他数据处理)

07-17 15:45:01.584 startQuertz_Worker-3 INFO  c.a.a.manager.ExportManage - 1: ticketMachineCountList select 时间:936
07-17 15:45:01.991 startQuertz_Worker-3 INFO  c.a.a.manager.ExportManage - 2: fill  时间:407
07-17 15:45:01.998 startQuertz_Worker-3 INFO  c.a.a.manager.ExportManage - 3: fill 0 stop 时间:7
07-17 15:50:06.778 startQuertz_Worker-3 INFO  c.a.a.manager.ExportManage - 4: create excel  时间:304780

SXSSFWorkbook测试(1,2,3部为其他数据处理)

07-17 16:08:00.528 startQuertz_Worker-2 INFO  c.a.a.manager.ExportManage - 1: ticketMachineCountList select 时间:23
07-17 16:08:05.609 startQuertz_Worker-2 INFO  c.a.a.manager.ExportManage - 2: fill  时间:508
07-17 16:08:05.613 startQuertz_Worker-2 INFO  c.a.a.manager.ExportManage - 3: fill 0 stop 时间:4
07-17 16:10:08.377 startQuertz_Worker-2 INFO  c.a.a.manager.ExportManage - 4: create excel  时间:122764

去除样式后:
07-17 16:27:00.643 startQuertz_Worker-3 INFO  c.a.a.manager.ExportManage - 1: ticketMachineCountList select 时间:20
07-17 16:27:01.576 startQuertz_Worker-3 INFO  c.a.a.manager.ExportManage - 2: fill  时间:493
07-17 16:27:01.582 startQuertz_Worker-3 INFO  c.a.a.manager.ExportManage - 3: fill 0 stop 时间:6
07-17 16:27:08.327 startQuertz_Worker-3 INFO  c.a.a.manager.ExportManage - 4: create excel  时间:6745

猜你喜欢

转载自blog.csdn.net/qq_29923439/article/details/75257701