环境: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