如何修复破坏xls文件下载的ExternalContext调用?

时间:2017-09-08 13:27:57

标签: excel jsf jsf-2 download xls

我有一个使用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

2 个答案:

答案 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
}