环境:jfinal3.5 + jfinal-undertow 1.3 + jfinal club 1.8
扩展了RenderExcel方法实现不落地的Excel生成。
首先,写了一个ExcelRender的类继承自jfinal的Render,重写了其中的render方法;在render方法中,调用response的outStream写Excel然后close,重写的render方法主要代码如下:
try { // 设定输出文件头 fileName = new String((fileName + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())).getBytes(), "UTF-8"); response.setContentType("application/msexcel"); // 取得输出流 OutputStream out = response.getOutputStream(); // writer ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true); // 写Excel writer.write(dataObject, sheet); writer.finish(); out.flush(); out.close(); } catch (Exception ex) { ex.printStackTrace(); }
在BaseController中增加方法,实现renderExcel如下:
@NotAction protected void renderExcel(Sheet sheet, List<List<Object>> dataObject) { this.render(new ExcelRender(sheet, dataObject)); }
在后代的控制器中的Action中(如download)调用renderExcel,主要代码如下:
@Clear(PjaxInterceptor.class) public void download() { // 转换成Excel的Model List<List<Object>> data = DataEmployee.getModelEmpList(listEmp); // 生成Sheet Sheet sheet = new Sheet(1,2); sheet.setSheetName(sheetName); sheet.setAutoWidth(Boolean.TRUE); renderExcel(sheet, data); }
前台访问download,Excel文件成功下载,但控制台会出现如下2种情况:
1、控制台显示download被执行2次;2、第二次download执行后会发生ioException,控制台显示错误来自out.close();这一行代码。
请大神指点。
另外如果利用jfinal的优势是不是用renderfile好一些,如何做?谢谢!
项目:JFinal