2016-10-19 6 views
1

私のチームは仕事中私はGWTアプリケーションを開発しています。 プログラムは動作していますが、今ダウンロードできるExcelテーブルは* .xlsxでxlsではありません。 このプロジェクト全体が私には新しく、自分自身をGWTの初心者だと考えています。GWT Excelをダウンロードする.xlsxは私に壊れたファイルを与えます

Exceltableにファイル名が指定されたコードでは、最後に+ ".xls"があります。しかし、私が+ "。xlsx"に変更してアプリケーションをテストすると、ダウンロードはまだ動作しますが、Excelでファイルを開こうとすると、エラーメッセージが表示され、ファイルが破損していることがわかりますか? (.xls works)

GWTでserverSiteで生成されたExcelでダウンロードがどのように機能するのか説明できますか? たぶん、あなたは事前に

おかげ

編集(私は彼に尋ねることができないので、悲しいことに、このアプリケーションのプログラマが休日である...) が破損するファイルの原因をいくつかのアイデアを持っている:

public class Download extends HttpServlet { 

    private static final long serialVersionUID = 5580666921970339383L; 

    @Override 
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     doGet(request, response); 
    } 

    @Override 
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 

     String filename = (String)request.getSession().getAttribute(CrossReportConstants.ATTR_FILENAME); 
     byte[] data = (byte[])request.getSession().getAttribute(CrossReportConstants.ATTR_REPORT); 
     request.getSession().setAttribute(CrossReportConstants.ATTR_FILENAME, null); 
     request.getSession().setAttribute(CrossReportConstants.ATTR_REPORT, null); 

     response.setContentType("application/vnd.ms-excel"); 
     response.setHeader("Content-Disposition", "attachment;filename=" + filename); 
     response.setHeader("Pragma", "no-cache"); 
     response.setHeader("Expires", "0"); 
     response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); 
     response.setContentLength(data.length); 

     try { 
      InputStream in = new ByteArrayInputStream(data); 
      ServletOutputStream out = response.getOutputStream(); 

      byte[] outputByte = new byte[4096]; 
      // copy binary contect to output stream 
      while (in.read(outputByte, 0, 4096) != -1) { 
       out.write(outputByte, 0, 4096); 
      } 
      in.close(); 
      out.flush(); 
      out.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

} 
あなたがコードを提供するよう
+0

変更しようとしているコードを入力することはできますか? httpレスポンスのファイル名を変更するだけで、コンテンツタイプは変更しないように思えます。 – Akkusativobjekt

+0

@Akkusativobjekt問題は実際にここにコードを投稿することは許されていません....そして、プロジェクト全体は比較的大きく、80以上のクラスがあり、現時点で私は何かを変えなければいけないと思っています....悲しいことに彼は休日にいるので私の同僚に尋ねることはできません....私はそれを共有するコード部分を見つける場合 – KilledByCheese

+0

それは、response.setContentType( "application/vnd.ms-excel")のような何かのためのHttpServletの見た目です。 – Akkusativobjekt

答えて

0

は今、あなたは簡単に答えることができる質問:

示すコードがHttpServlet定義します。あなたのプロジェクトのどこかにweb.xmlというファイルがあります。このファイルでは、表示されたクラスはURLパターンにマップされているため、サーバーは特定のURLをこのサーブレットで処理する必要があることを認識しています。

最初に表示されたサーブレットは、セッションからファイル名とファイルの内容を抽出します。追加のhttp応答が準備され、ファイルの内容が書き出されます。これで、レスポンスのコンテンツタイプをxlsxのものに置き換えるだけで済みます。

response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 

http応答を処理するブラウザは、ダウンロードを.xlsxファイルとして認識するようになりました。あなたが気づいたように、ファイル拡張子はこのステップでは重要ではありません。

サーブレットの元のプログラマーが彼の祝日から戻ってきたときは、e.printStackTrace()の代わりにresponse.sendError()(適切なhttpステータスコード)を使用するように勧めてください。次に、サーブレットのユーザーは、何かがうまくいかず、誰が責任を負うべきかをよりよく理解することができます。

+0

が変更されました response.setContentType( "application/vnd.ms-excel"); 〜 response.setContentType( "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); そして、ファイル名が.xmsxに変更されましたが、テストすると.xslxシートがダウンロードできませんが、Excelを開くことができません。ファイルが壊れていることがわかります – KilledByCheese

関連する問題