扩展的renderExcel方法总是出现IOException异常

环境: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好一些,如何做?谢谢!

评论区

himans

2019-05-30 02:30

经过前端反复调试似乎已找到问题所在。后台代码没问题,应该主要和浏览器的“预缓存”功能有关。前台代码取消了target="_blank" 之后chrome,ff,Edge顺滑无误。QQ浏览器虽然是chrome内核但是垃圾插件太多所以只有它继续报IO异常,无视。

热门反馈

扫码入社