Java Excel SXSSFWorkbook大量数据导出
2017-04-13 16:41
573 查看
您可能需要些许了解
Java中涉及的数据导出,大多都是将数据库中的数据导出到Excel文件中,当进行大量数据进行导出时很容易出现内存溢出的问题,未解决此问题,该文章介绍多种优化方案,本文重在介绍通过SXSSFWorkbook进行大量数据导出到Excel的操作。POI之前的版本不支持大数据量处理,如果数据过多则经常报OOM错误,有时候调整JVM大小效果也不是太好。3.8版本的POI新出来了SXSSFWorkbook,可以支持大数据量的操作,只是SXSSFWorkbook只支持.xlsx格式,不支持.xls格式。
3.8版本的POI对Excel的导出操作,一般只使用 HSSFWorkbook 以及 SXSSFWorkbook,HSSFWorkbook用来处理较少的数据量,SXSSFWorkbook用来处理大数据量以及超大数据量的导出。
SXSSFWorkbook实例
//获取数据列表 List<ProjectContractInfo> list =***;//list数据由数据库查询得到 if(list!=null && list.size() > 0){ //获取分页指标 int total = list.size();//数据总数 int mus = 50000;//每个sheet中数据数量 int avg = (total/mus)+1;//sheet数量 //获取工作簿对象 //第一步:创建Workbook,对应一个excel文件 SXSSFWorkbook wb = new SXSSFWorkbook(100);//每次缓存100条到内存,其余的写到磁盘中,避免内存溢出 //样式 //创建样式1(列标识样式) CellStyle styleContent = wb.createCellStyle(); styleContent.setFillBackgroundColor((short)13);//背景色 styleContent.setFillForegroundColor((short)15);//前景色 styleContent.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); styleContent.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中 styleContent.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中 styleContent.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框 styleContent.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框 styleContent.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下边框 styleContent.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框 Font fontContent = wb.createFont(); fontContent.setFontName("宋体"); fontContent.setBold(true); fontContent.setFontHeightInPoints((short)11);//字体大小 styleContent.setFont(fontContent); styleContent.setWrapText(true);//自动换行 //创建样式2(数据项样式) CellStyle style= wb.createCellStyle(); style.setFillBackgroundColor(HSSFColor.WHITE.index);//背景色 style.setFillForegroundColor(HSSFColor.WHITE.index);//前景色 style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中 style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框 style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框 style.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下边框 style.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框 Font font = wb.createFont(); font.setFontName("宋体"); font.setFontHeightInPoints((short)11);//字体大小 style.setFont(font); style.setWrapText(true);//自动换行 //创建样式3(数据项样式-日期) CellStyle style_date = wb.createCellStyle(); DataFormat format = wb.createDataFormat(); style_date.setDataFormat(format.getFormat("yyyy-MM-dd")); style_date.setFillBackgroundColor(HSSFColor.WHITE.index);//背景色 style_date.setFillForegroundColor(HSSFColor.WHITE.index);//前景色 style_date.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); style_date.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中 style_date.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中 style_date.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框 style_date.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框 style_date.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下边框 style_date.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框 Font font_date = wb.createFont(); font_date.setFontName("宋体"); font_date.setFontHeightInPoints((short)11);//字体大小 style_date.setFont(font_date); style_date.setWrapText(true);//自动换行 //第二步:在workbook添加sheet for(int m = 0; m < avg; m++){ SXSSFSheet sheet = wb.createSheet("项目信息"+(m+1)); int sheet_row = 0; //设置列宽-(从0开始) sheet.setColumnWidth(0, 8000); sheet.setColumnWidth(1, 8000); sheet.setColumnWidth(2, 8000); sheet.setColumnW 4000 idth(3, 8000); sheet.setColumnWidth(4, 6000); sheet.setColumnWidth(5, 6000); //第三步:正文 //无表头 //正文 SXSSFRow sheet_row1 = sheet.createRow(sheet_row); sheet_row1.setHeight((short)400);//设置行高 SXSSFCell sheetcell11 = sheet_row1.createCell(0); sheetcell11.setCellValue("项目编号"); sheetcell11.setCellStyle(styleContent); SXSSFCell sheetcell12 = sheet_row1.createCell(1); sheetcell12.setCellValue("委托单位"); sheetcell12.setCellStyle(styleContent); SXSSFCell sheetcell13 = sheet_row1.createCell(2); sheetcell13.setCellValue("工程名称"); sheetcell13.setCellStyle(styleContent); SXSSFCell sheetcell14 = sheet_row1.createCell(3); sheetcell14.setCellValue("详细地点"); sheetcell14.setCellStyle(styleContent); SXSSFCell sheetcell15 = sheet_row1.createCell(4); sheetcell15.setCellValue("签订日期"); sheetcell15.setCellStyle(styleContent); SXSSFCell sheetcell16 = sheet_row1.createCell(5); sheetcell16.setCellValue("结算方式"); sheetcell16.setCellStyle(styleContent); sheet_row = sheet_row+1; //数据渲染 ProjectContractInfo pct =null; SXSSFRow sheet_rows = null; SXSSFCell sheetcell = null; for(int n = mus*m; n < mus*(m+1); n++){ if(n < total){ pct = list.get(n); sheet_rows = sheet.createRow(sheet_row); sheet_rows.setHeight((short)400);//设置行高 sheetcell = sheet_rows.createCell(0); sheetcell.setCellValue(pct.getContract_no()); sheetcell.setCellStyle(style); sheetcell = sheet_rows.createCell(1); sheetcell.setCellValue(pct.getTrustor()); sheetcell.setCellStyle(style); sheetcell = sheet_rows.createCell(2); sheetcell.setCellValue(pct.getProject_name()); sheetcell.setCellStyle(style); sheetcell = sheet_rows.createCell(3); sheetcell.setCellValue(pct.getProject_address()); sheetcell.setCellStyle(style); sheetcell = sheet_rows.createCell(4); if(pct.getContract_date()!=null){ sheetcell.setCellValue(new SimpleDateFormat("yyyy-MM-dd").format(pct.getContract_date())); } sheetcell.setCellStyle(style_date); sheetcell = sheet_rows.createCell(5); sheetcell.setCellValue(pct.getSettle_type()); sheetcell.setCellStyle(style); sheet_row = sheet_row +1; pct = null; sheet_rows = null; sheetcell = null; } } } //第四步:保存 try { submitFlag = null; String fileName = "项目信息.xlsx"; response.setContentType("applicatin/ms-excel"); response.setHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("gb2312"),"iso-8859-1")); wb.write(response.getOutputStream()); wb.close(); } catch (Exception e) { e.printStackTrace(); } return null; }else{ map.put("errorMsg", "无数据!"); return ftlURL; }
片尾留注
*以上代码片段摘自实际开发项目相关文章推荐
- JavaWEB_POI导出大量数据excel(50万左右)
- java 导出数据到excel 之 WritableWorkbook
- java 导出数据到excel 之 WritableWorkbook
- java导出excel大量数据出现错误时解决办法
- Java 让excel导出大量数据进行分表打成压缩包进行下载
- SXSSFWorkbook 导出大批量数据和图片到excel
- java中导出大量数据到Excel的一种方法
- POI导出大量数据的简单解决方案(附源码)-Java-POI导出大量数据,导出Excel文件,压缩ZIP(转载自iteye.com)
- Java 使用jxl.jar 导入导出Excel数据
- 我哭啊 .net大量数据导出到Excel
- java导出数据到excel的几种方法的比较
- 用java程序导出数据到Excel文档
- JAVA解决大批量导出数据到excel产生内存溢出的方案
- java中jxl导出数据到excel的例子
- Java数据导出到excel
- excel导出之大量数据-导出压缩包
- Java中读取Excel文件的内容和导出数据到Excel文件
- JAVA中读取和导出数据到EXCEL的方法
- Java数据导入导出Excel
- Java利用xml将大批量数据导出到excel的一个方法