0

ApachePOI3.8を使用しています。Excel(.xslx)ファイルを生成するJSPがあります。私はそれをローカルで開発しました、そしてファイルは問題なく開くことができました。次に、アプリをDev環境にデプロイし、そこで生成されたExcelファイルを開くと、「Excelがausencias.xlsxで読み取り不可能なコンテンツを検出しました。このワークブックのコンテンツを復元しますか?このワークブックのソースを信頼し、[はい]をクリックします。」[はい]をクリックすると、次のアラートが表示されます。「このファイルはMicrosoftExcelを使用して開くことはできません。ファイルを開くことができるコンバーターをMicrosoftOffice Online Webサイトで検索しますか?」[いいえ]をクリックすると、ファイルが正しく開かれます。しかし、なぜこれらのエラーが発生するのかわかりません。

単純な空の.xslxファイルを生成した場合でも発生します。

<%@page import="java.io.FileOutputStream"%>
<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@page import="java.io.IOException"%>
<%@page import="javax.servlet.*"%>

<%@page import="org.apache.poi.ss.usermodel.*"%>    
<%@page import="org.apache.poi.ss.util.CellRangeAddress"%>
<%@page import="org.apache.poi.xssf.usermodel.*"%>

<%
    response.setHeader ("Content-Disposition", "attachment;filename=\"ausencias.xlsx\"");
    response.setContentType("application/vnd.ms-excel");

    Workbook wb = new XSSFWorkbook();

    Sheet sheet = wb.createSheet("Ausencias");

    ServletOutputStream fout = response.getOutputStream();

    wb.write(fout);
    fout.flush();
    fout.close();
%>

ローカルマシンには、Microsoft Office Excel 2007(12.0.6661.5000)SP2 MSO(12.0.6562.5003)があります。開発環境には、Microsoft Office Excel 2007(12.0.6611.1000)SP3 MSO(12.0.6607.1000)があります。

誰かが解決策や回避策を知っていますか?

ありがとう。

編集:JSPコード全体を追加しました。一部のインポートが使用されない場合があることを認識しています。問題を探して元のコードを切り抜いたときに、そのままにしておきました。

編集2:開発環境で生成されたドキュメントをローカルマシンで開いたところ、同じ警告がスローされます。したがって、問題はファイルにあり、Excelバージョンにはありません。DevEnvのファイルが改ざんされているようです。何か案は??

4

3 に答える 3

2

このエラーが発生する理由は、MIME タイプが間違っているためです。それ以外の

"アプリケーション/vnd.ms-excel"

使用する必要があります

"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"

XLSX ドキュメント用

于 2012-10-19T01:19:00.267 に答える
2

バイナリ ファイルを http 応答として送り返すときは常に、コンテンツの長さを設定する必要があることがわかりました。長さを設定しなくても済む場合もありますが、多くの場合、ブラウザーはファイルの長さを確実に自動的に把握できません。

通常、これを行う方法は、最初に出力ファイルを ByteArrayOutputStream に書き込むことです。これにより、出力ファイルの大きさを計算できます。次に、ByteArrayOutputStream バイトを応答オブジェクトに書き込みます。

元のコードに基づく例を次に示します。

    // generate the xlsx file as a byte array
    Workbook wb = new XSSFWorkbook();
    Sheet sheet = wb.createSheet("Ausencias");
    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    wb.write(bout);
    bout.close();

    // send byte array as response
    response.setHeader ("Content-Disposition", "attachment;filename=\"ausencias.xlsx\"");
    response.setContentType("application/vnd.ms-excel");
    response.setContentLength(bout.size());
    ServletOutputStream fout = response.getOutputStream();
    fout.write(bout.toByteArray());
    fout.flush();
    fout.close();
于 2012-06-12T06:08:24.533 に答える