質問編集履歴

1 文言修正

退会済みユーザー

退会済みユーザー

2016/06/14 10:52  投稿

poiにおいて、Excelダウンロード処理を関数内で実行すると、ダウンロード後のタブが自動で閉じられない
Excelのダウンロードを行った際、以下のようなヘッダーをセットして
```
PoiでExcelのダウンロードを行っているのですが、
以下のようにサーブレット側、サーブレットから呼び出される関数を作ると、
ダウンロード処理完了後に自動でタブが閉じられません。
```Java サーブレット側
   protected void doDownload(HttpServletResponse response) {
       response.setContentType("application/octet-stream");
       String fileName = null;
       try {
           fileName = new String(getExcelFileName().getBytes("Windows-31J"), "ISO-8859-1");
       } catch (UnsupportedEncodingException e1) {
           e1.printStackTrace();
       }
       response.setHeader("Content-Disposition", "attachments; filename=\"" + fileName + "\"");
       response.setHeader("Cache-Control", "public");
       response.setHeader("Pragma", "public");
 
       try {  
           OutputStream out = new BufferedOutputStream(response.getOutputStream());  
           wb.write(out);  
       } catch (IOException e) {  
                             e.printstactrace();  
       } finally {  
           try {  
               wb.close();  
           } catch (IOException e) {  
                             e.printstactrace();  
           }  
       }  
   }  
 
```  
     
```Java サーブレットから呼び出される関数  
   protected void doUpdateExcel(HttpServletRequest request, HttpServletResponse response)  
           throws ServletException, IOException {  
 
             --- エクセルを生成する処理 ---  
 
             doDownload(); // ここで上記のエクセルダウンロードを呼び出すと、タブが自動で閉じられない  
 
}  
```
以下のように、wb.outを関数内でコードを組むと、ダウンロード実行後に、タブが自動で閉じられません。
   
```Java
        public static void writeXLSXFile() throws IOException {
       
       String excelFileName = "C:/Test.xlsx";//name of excel file
一方、関数を使わずに、関数の処理をそっくりそのまま、サーブレットで実行すれば、
タブは自動で閉じられます。
       String sheetName = "Sheet1";//name of sheet  
       XSSFWorkbook wb = new XSSFWorkbook();
       XSSFSheet sheet = wb.createSheet(sheetName) ;
おそらく原因は、関数内で、wb.write(out)を行うと、この内部処理でreturnするような処理になっていると思うのですが、
関数でそれを実行すると、まだ、サーブレット側の処理がのこっていることになり、
一方、サーブレットでwb.write(out)とすれば、内部処理でreturn後、サーブレットがおわることになり、
タブが自動に閉じられるような挙動になっているのではと思っています。
       //iterating r number of rows  
       for (int r=0;r < 5; r++ )  
       {  
           XSSFRow row = sheet.createRow(r);  
           //iterating c number of columns
           for (int c=0;c < 5; c++ )
           {
               XSSFCell cell = row.createCell(c);
   
               cell.setCellValue("Cell "+r+" "+c);
           }
       }
同じコードをサーブレット単位で書くのは面倒なので、
関数内で実行したいですが、なにかよい方法はございませんでしょうか。
       FileOutputStream fileOut = new FileOutputStream(excelFileName);  
       //write this workbook to an Outputstream.  
       wb.write(fileOut);  
       fileOut.flush();  
       fileOut.close();  
   }  
   public static void main(String[] args) throws IOException {  
         
       writeXLSXFile();  
   }  
```  
servlet側でwb.outすると、ダウンロード後にタブが自動で閉じられるのですが、
関数内でもタブが自動に閉じられる方法はありますでしょうか。
  • Java

    20075 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る