1

アプリの「ファイルのエクスポート」オプションをクリックすると、ユーザーに「名前を付けて保存」Windowsを表示したいのですが、ファイルはApache POIで作成したものよりもExcel 2007です。ファイルはフォルダ「D:\jboss-6.1.0.Final\bin」に正しく保存されますが、「名前を付けて保存」ウィンドウを表示する代わりに、奇妙な記号や文字を含むページにリダイレクトされます。

最も奇妙なのは、アプリの他のページにExcelファイルをダウンロードするための他のボタンがあり、同じコードとPOIを使用すると、「名前を付けて保存」が正常に表示されることです。

なぜそれが起こるのですか?

ありがとうございました。

画像を添付します。ここに画像の説明を入力

関数 Export のコードは次のとおりです。

public void exportarTabla(){

    XSSFWorkbook workbook = new XSSFWorkbook(); 
    XSSFSheet sheet = workbook.createSheet("Hoja 1");           
    XSSFRow row;
    XSSFCell cell;

    for (int i = 0; i < getLstEtiquetasCol().size(); i++) {
        row = sheet.createRow(i+3);
        for (int j = 0; j < getLstEtiquetasCol().get(i).size(); j++) {
            cell = row.createCell(j+3+getLstEtiquetasFil().get(0).size());
            cell.setCellValue(getLstEtiquetasCol().get(i).get(j).getValor().getEtiqueta());                 
        }
    }


    for (int i = 0; i < getLstEtiquetasFil().size(); i++) {
        row = sheet.createRow( i+3+getLstEtiquetasCol().size());
        for (int j = 0; j < getLstEtiquetasFil().get(i).size(); j++) {
            cell = row.createCell(j+3);
            cell.setCellValue(getLstEtiquetasFil().get(i).get(j).getValor().getEtiqueta()); 
        }
    }


    for (int i = 0; i < getTableContact().size(); i++) {
        row = sheet.getRow(  i+3+getLstEtiquetasCol().size());
        for (int j = 0; j < getTableContact().get(i).size(); j++) {
            cell = row.createCell(j+3+getLstEtiquetasFil().get(0).size());
            cell.setCellValue(Double.parseDouble(getTableContact().get(i).get(j).getEtiqueta()));                   
        }
    }


    try {

        this.archivo_salida = "D:/jboss-6.1.0.Final/bin/output2.xlsx";
        FileOutputStream fileOut = new FileOutputStream(new File(archivo_salida));
        workbook.write(fileOut);

        if(fileOut != null){
            try{ 
                File ficheroXLS = new File(archivo_salida);
                FacesContext ctx = FacesContext.getCurrentInstance();
                FileInputStream fis = new FileInputStream(ficheroXLS);
                byte[] bytes = new byte[1000];
                int read = 0;

                if (!ctx.getResponseComplete()) {
                   String fileName = ficheroXLS.getName();
                   String contentType = "application/vnd.ms-excel";
                   //String contentType = "application/pdf";
                   HttpServletResponse response =(HttpServletResponse) ctx.getExternalContext().getResponse();
                   response.setContentType(contentType);
                   response.setHeader("Content-Disposition","attachment;filename=\"" + fileName + "\"");
                   ServletOutputStream out = response.getOutputStream();

                   while ((read = fis.read(bytes)) != -1) {
                        out.write(bytes, 0, read);
                   }

                   out.flush();
                   out.close();
                   System.out.println("\nDescargado\n");
                   ctx.responseComplete();                     
                }       
            }catch(IOException e){ 
                e.printStackTrace(); 
            }  finally {
                 try {
                     if (fileOut != null) {
                         fileOut.close();
                     }            
                 } catch (IOException ex) {
                      ex.printStackTrace();
                 }
            }
        }

    } catch (IOException e) {
        e.printStackTrace();
    } 
}

WEB.xml

<?xml version="1.0" ?>

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">

<!-- RichFaces -->

<context-param>
    <param-name>org.richfaces.SKIN</param-name>
    <param-value>blueSky</param-value>
</context-param>

<!-- Suppress spurious stylesheets -->

<context-param>
    <param-name>org.richfaces.CONTROL_SKINNING</param-name>
    <param-value>disable</param-value>
</context-param>

<context-param>
    <param-name>org.richfaces.CONTROL_SKINNING_CLASSES</param-name>
    <param-value>disable</param-value>
</context-param>

<!-- Change load strategy to DEFAULT to disable sending scripts/styles as 
    packs -->

<context-param>
    <param-name>org.richfaces.LoadStyleStrategy</param-name>
    <param-value>ALL</param-value>
</context-param>

<context-param>
    <param-name>org.richfaces.LoadScriptStrategy</param-name>
    <param-value>ALL</param-value>
</context-param>

<!-- Seam -->

<listener>
    <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
</listener>

<filter>
    <filter-name>Seam Filter</filter-name>
    <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>

    <init-param>
        <param-name>maxRequestSize</param-name>
        <param-value>1000000</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>Seam Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<servlet>
    <servlet-name>Seam Resource Servlet</servlet-name>
    <servlet-class>org.jboss.seam.servlet.SeamResourceServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Seam Resource Servlet</servlet-name>
    <url-pattern>/seam/resource/*</url-pattern>
</servlet-mapping>

<!-- Facelets development mode (disable in production) -->

<context-param>
    <param-name>facelets.DEVELOPMENT</param-name>
    <param-value>@debug@</param-value>
</context-param>

<!-- JSF -->

<context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xhtml</param-value>
</context-param>

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.seam</url-pattern>
</servlet-mapping>

<security-constraint>
    <display-name>Restrict raw XHTML Documents</display-name>
    <web-resource-collection>
        <web-resource-name>XHTML</web-resource-name>
        <url-pattern>*.xhtml</url-pattern>
    </web-resource-collection>
    <auth-constraint />
</security-constraint>

<persistence-unit-ref>
    <persistence-unit-ref-name>demoencuesta06/pu</persistence-unit-ref-name>
    <persistence-unit-name>demoencuesta06</persistence-unit-name>
</persistence-unit-ref>

4

3 に答える 3

1

彼らの応答に感謝します。私は問題を見つけました.ajaxのボタンの.xhtmlファイルにありました。そうだった :

<a4j:commandButton id="btnexportar" onclick="this.disabled=true" oncomplete="this.disabled=false; alert('La Exportacion de Datos ha finalizado')" 
                            action="#{dndBean.exportarTabla}"
                            value="Exportar Datos">
</a4j:commandButton>

そして、私は次のように変更しました:

<h:commandButton id="generarinforme" action="#{dndBean.exportarTabla}"                              
                                value="Exportar Datos">
</h:commandButton>

そして変なキャラはもう出てこない。ここで、onclick と oncomplete を使用する方法を検索する必要があります。ありがとう!

于 2013-05-16T17:06:29.437 に答える
0

5つのことをするだけ

1.フォームでajaxSingle="true"ajaxSubmit=" true" を検索します。

2.それら2つを削除します。

3.h :commondLinkを使用して、サーバーまたはローカル ディレクトリからファイルをダウンロードします。

4.コンテンツ タイプがファイル形式と一致していることを確認します。

5.フォームのターゲットは「_blank」にするか、使用しないでください。

于 2016-08-10T12:35:42.220 に答える