我有一个使用jett生成报告的方法,它显示了用户的文件下载对话框:
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
externalContext.responseReset();
externalContext.setResponseContentType("application/vnd.ms-excel");
externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"" + "precificacao.xls" + "\"");
//map beans omitted
FileOutputStream saida = null;
try {
saida = new FileOutputStream(getClass().getResource("/.").getPath() + "/precificacao.xls");
} catch (IOException e) {
System.err.println(getClass().getResource("/.").getPath() + "/precificacao.xls" + ": " + e.getMessage());
}
InputStream entrada = null;
try {
entrada = new BufferedInputStream(new FileInputStream(getClass().getResource("/template.xls").getFile()));
ExcelTransformer transformer = new ExcelTransformer();
Workbook workbook = transformer.transform(entrada, beans);
workbook.write(saida);
saida.flush();
saida.close();
facesContext.responseComplete();
} //catch ommitted
下载的文件已经损坏,作为文本文档而没有任何字节: print
在这个下载对话框例程之前,xls是正常生成的,所以我认为是setResponseContentType,虽然我在xls的正确命名法中看到了链接,但我正在通过错误的方式:http://www.iana.org/assignments/media-types
答案 0 :(得分:1)
您 是 意识到您无法将excel的内容写入响应?因此,响应实际上是空的,因此会导致各种奇怪的行为。
你甚至自己写这个:
没有任何字节
你在图像中得到它......
你会遇到与PDF,图像甚至纯文本文件相同的问题(虽然这不会给出错误但只是为空)
对于普通的servlet,你甚至会遇到同样的问题。因此,所有标签(excel,jsf,jsf-2,xls)都与问题无关。把事情缩小了。
从上下文获取输出流并将工作簿写入该流应修复它。
OutputStream saida = externalContext.getResponseOutputStream();
答案 1 :(得分:0)
我这样解决了
public void createRelatorioFichaTecnica(Produto produto) throws IOException {
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
externalContext.responseReset();
externalContext.setResponseContentType("application/vnd.ms-excel");
externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"" + "precificacao.xls" + "\"");
//map beans omitted
OutputStream saida = externalContext.getResponseOutputStream();
try{
InputStream entrada = new BufferedInputStream(new FileInputStream(getClass().getResource("/template.xls").getFile()));
ExcelTransformer transformer = new ExcelTransformer();
Workbook workbook = transformer.transform(entrada, beans);
workbook.write(saida);
saida.flush();
saida.close();
facesContext.responseComplete();
}
//catch omitted
}