导出excel报表
2018-01-25 11:00
23 查看
话不多说,上代码。maven依赖
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-excelant</artifactId> <version>3.9</version> </dependency>ExcelUtil类
public class ExcelExport { public static SXSSFWorkbook buildExcel( ExcelBean ev,List<Integer> widthList)throws Exception{ int rowaccess = 100;//内存中缓存记录行数 SXSSFWorkbook wb = new SXSSFWorkbook(rowaccess); //创建名称为ev.getSheetName()的sheet Sheet sh = wb.createSheet(ev.getSheetName()); Row row0 = sh.createRow(0); Cell cell0 = row0.createCell(0); //社会第一个row的第一个cell excel名称 cell0.setCellValue(ev.getTitle()); for (int i=0;i<widthList.size();i++){//设置excel每列宽度 sh.setColumnWidth(i, widthList.get(i) * 256); } CellStyle style1 = wb.createCellStyle();//第一行样式 CellStyle style = wb.createCellStyle();//第二行样式 Font f = wb.createFont(); Font f1 = wb.createFont(); f.setFontHeightInPoints((short) 14);//字号 f1.setFontHeightInPoints((short) 15);//字号 f.setBoldweight(Font.BOLDWEIGHT_NORMAL);//加粗 f.setFontName("楷体"); style.setFont(f); style.setWrapText(true); style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//垂直 style.setAlignment(CellStyle.ALIGN_CENTER);//字体垂直居中 style1.setFont(f1); style1.setAlignment(CellStyle.ALIGN_CENTER);//字体左右居中 CellRangeAddress region = new CellRangeAddress(0, 0, (short) 0, (short) (ev.getColumn().size()-1)); sh.addMergedRegion(region);// 合并到rowTo行columnTo的区域 //第一行字体样式---------------- cell0.setCellStyle(style1); cell0.setCellValue(ev.getTitle()); // 设置border style.setBorderLeft(CellStyle.BORDER_THIN); style.setBorderRight(CellStyle.BORDER_THIN); style.setBorderTop(CellStyle.BORDER_THIN); style.setBorderBottom(CellStyle.BORDER_THIN); style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); // 填充颜色 style.setFillPattern(CellStyle.SOLID_FOREGROUND); // 填充方式 //设置第二行数据名称 Row row1 = sh.createRow(1); for (int i=0;i<ev.getColumn().size();i++){ Cell cells = row1.createCell(i); cells.setCellValue(ev.getColumn().get(i)); cells.setCellStyle(style); } //每个SHEET有 content.size()数据 List<Map<String, Object>> content = ev.getContent(); for(int rownum = 0; rownum < content.size(); rownum++) { Row row = sh.createRow(rownum + 2); //每行有ev.getDbcolumn().size()个CELL Map<String, Object> m11 = content.get(rownum); for(int cellnum = 0; cellnum < ev.getDbcolumn().size(); cellnum++) { Cell cell = row.createCell(cellnum);{ if(m11.get(ev.getDbcolumn().get(cellnum))!=null ){ cell.setCellValue(m11.get(ev.getDbcolumn().get(cellnum)).toString()); }else{ cell.setCellValue(""); } } } //每当行数达到设置的值就刷新数据到硬盘,以清理内存 if(rownum%rowaccess == 0){ ((SXSSFSheet)sh).flushRows(); } } return wb; } }
excel格式类
public class ExcelBean { /** * sheet名 */ private String sheetName;//sheet名 /** * 标题 */ private String title;//标题 /** * 列名集合 */ private List<String> column;//列名集合 /** * 数据库列名 */ private List<String> dbcolumn;//数据库列名 private List<Map<String,Object>> content;//内容 public String getSheetName() { return sheetName; } public void setSheetName(String sheetName) { this.sheetName = sheetName; } public List<String> getColumn() { return column; } public void setColumn(List<String> column) { this.column = column; } public List<String> getDbcolumn() { return dbcolumn; } public void setDbcolumn(List< b6d6 ;String> dbcolumn) { this.dbcolumn = dbcolumn; } public List<Map<String, Object>> getContent() { return content; } public void setContent(List<Map<String, Object>> content) { this.content = content; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public ExcelBean(String sheetName, String title, List<String> column, List<String> dbcolumn, List<Map<String, Object>> content) { this.sheetName = sheetName; this.title = title; this.column = column; this.dbcolumn = dbcolumn; this.content = content; } public ExcelBean() { } }方法调用
//获取导出数据 List<CoffeeOrderDomain> coffeeOrders = null; try { coffeeOrders = statisticDao.exportOrder(startTime,endTime,status,devNo); } catch (Exception e) { e.printStackTrace(); } //数据库字段和列名一一对应 List<String> col = new ArrayList(); col.add("订单编号"); col.add("设备编号"); col.add("支付金额"); col.add("订单时间"); col.add("支付状态"); List<String> dbCol = new ArrayList(); dbCol.add("order_no"); dbCol.add("dev_no"); dbCol.add("price"); dbCol.add("gmt_create"); dbCol.add("status"); //生成报表sheet1 ExcelBean excel = new ExcelBean(); excel.setColumn(col); excel.setDbcolumn(dbCol); excel.setTitle("设置标题"); excel.setSheetName("设置工作表名称"); //生成数据 List<Map<String, Object>> content = new ArrayList<Map<String, Object>>(); for (int i = 0; i < coffeeOrders.size(); i++) { Map map = new HashMap(); map.put("order_no", coffeeOrders.get(i).getOrderNo()); map.put("dev_no", coffeeOrders.get(i).getDevNo()); map.put("price", coffeeOrders.get(i).getPrice()); map.put("gmt_create", DateUtils.getDateTimeFormat(coffeeOrders.get(i).getGmtCreate())); if(coffeeOrders.get(i).getStatus() == 1){ map.put("status", "已支付"); } if(coffeeOrders.get(i).getStatus() == 0){ map.put("status", "未支付"); } content.add(map); } excel.setContent(content); //设置每列的列宽 List<Integer> widthList = new ArrayList<Integer>(); widthList.add(30); widthList.add(15); widthList.add(15); widthList.add(25); widthList.add(20); SXSSFWorkbook workBook = null; try { workBook = ExcelExport.buildExcel(excel,widthList); } catch (Exception e) { logger.error("生成SXSSFWorkbook错误",e); } //写入流 OutputStream out = null; try { out = response.getOutputStream(); String fileName ="XXX.xlsx"; response.setContentType("application/x-msdownload"); //避免中文名称乱码 response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8")); workBook.write(out); } catch (Exception e) { logger.error("向浏览器输出XSSFWorkbook错误",e); } finally { try { out.close(); } catch (IOException e) { e.printStackTrace(); } }大家可以看到ExcelExport工具类中用的是SXSSFWorkbook并且设置的内存中缓存的记录为100有助于减少内存的消耗,但是报表导出确实非常耗内存。以前用的是HSSFWorkbook每次导出的时候就会内存溢出,用SXSSFWorkbook可以有效的减少内存的消耗,其实解决这个问题也很简单就是加大内存呗,但是架不住我们服务器就这么大啊,因为我们不止一个地方用到了导出报表并且项目共用一个数据库,我个人的解决方案是把导出报表自己起一个服务,占大一点的内存,导出的时候统一走这个服务,因为导出报表使用的次数相对于别的业务还是比较少的。如果有些小伙伴的服务器配置好可以挥霍内存的话,那就更好啦。
---------------一个搬砖的小菜鸡
相关文章推荐
- nodejs实现 excel报表的导出。
- 导出Word、Excel报表
- 报表导出到excel
- JSP应用导出Excel报表的简单实现以及中文乱码彻底解决(HTML)
- salesforce 零基础学习(二十三)数据记录导出至excel(自定义报表导出)
- 在.NET环境下将报表导出Excel和Word
- 简单的excel报表导出(jsp中)
- C# 获取文件信息并导出Excel,Xml报表
- Java使用POI实现数据导出excel报表
- vb.net 水晶报表 导出Excel
- 水晶报表导出为word,excel和pdf格式
- poi报表导出excel
- PB 数据窗口导出EXCEL报表-个人例子
- 在.NET环境下将报表导出Excel和Word
- Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表
- JAVA将Excel中的报表导出为图片格式(二)实现思路
- **报表**EXCEL OUT 不能导出GRIDVIEWA自动生成的列 提示索引过界的解决办法
- 水晶报表如何导出为Excel文档
- EasyUI datagrildview导出excel报表
- EchartData 统计报表以及导出Excel