2017-09-08 9 views
0

私はJettのを使用してレポートを生成する方法を持っているし、それがユーザーのために、ファイルのダウンロードダイアログを示していますダウンロードするxlsファイルを壊すExternalContext呼び出しを修正する方法はありますか?

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は

を正常に生成されたので、私はそれが私がXLSのための右の命名法でリンクを見ても、私は間違った方法を通じてつもりだsetResponseContentTypeだと思いました。http://www.iana.org/assignments/media-types

+0

を解決しましたか? – Kukeltje

+0

同じように破損しています...私はExternalContextへのいくつかの異なる呼び出しを試みました、そして、それは常に壊れています...何か@Kukeltjeを示唆していますか? – philabreu

+0

応答をデバッグ**することを提案しています...サイズは何ですか、それは空ですか?固定のExcelをダウンロードするとどうなりますか?固定PDFをダウンロードするとどうなりますか?固定画像をダウンロードするとどうなりますか?物事を取り除く...原因を絞り...ブレークポイントを設定する... – Kukeltje

答えて

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 
} 
+1

私の答えと捜査を受け入れてくれてありがとう。私が次回に質問コードを分析する努力をしてくれるかどうかわからない... – Kukeltje

+0

ありがとうございました! – philabreu

1

ヨu であり、Excelの内容をレスポンスに書き込むことはできません。したがって、応答は実質的に空であり、したがってあらゆる種類の奇妙な動作を引き起こします。あなたはPDFと同じ問題を抱えていただろう

...任意のバイト

なし

そして、あなたがイメージにそれを持っている:

あなたも、この自分を書きます、またはイメージやプレーンテキストファイル(エラーは発生せず、ただ空であっても)

あなたは同じ問題を抱えているhプレーンサーブレット。したがって、効果的なすべてのタグ(excel、jsf、jsf-2、xls)は実際には問題に関連していません。狭いものを取り除く。

コンテキストからの出力ストリームを取得し、ワークブックをそのストリームに書き込むと修正されるはずです。

OutputStream saida = externalContext.getResponseOutputStream(); 
関連する問題