1. 程式人生 > >java po大資料量Excel

java po大資料量Excel

     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