teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

文言修正

2016/06/14 01:52

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,50 +1,59 @@
1
- Excelのダウンロードを行った際、以下のようなヘッダーをセットし
1
+ PoiでExcelのダウンロードを行っているのですが、
2
+
3
+ 以下のようにサーブレット側、サーブレットから呼び出される関数を作ると、
4
+ ダウンロード処理完了後に自動でタブが閉じられません。
5
+
6
+ ```Java サーブレット側
7
+
8
+ protected void doDownload(HttpServletResponse response) {
9
+
10
+ response.setContentType("application/octet-stream");
11
+ String fileName = null;
2
- ```
12
+ try {
13
+ fileName = new String(getExcelFileName().getBytes("Windows-31J"), "ISO-8859-1");
14
+ } catch (UnsupportedEncodingException e1) {
15
+ e1.printStackTrace();
16
+ }
3
17
  response.setHeader("Content-Disposition", "attachments; filename=\"" + fileName + "\"");
4
18
  response.setHeader("Cache-Control", "public");
5
19
  response.setHeader("Pragma", "public");
20
+
21
+ try {
22
+ OutputStream out = new BufferedOutputStream(response.getOutputStream());
23
+ wb.write(out);
24
+ } catch (IOException e) {
25
+ e.printstactrace();
26
+ } finally {
27
+ try {
28
+ wb.close();
29
+ } catch (IOException e) {
30
+ e.printstactrace();
31
+ }
32
+ }
33
+ }
34
+
6
35
  ```
7
-
8
- 以下のように、wb.outを関数内でコードを組むと、ダウンロード実行後に、タブが自動で閉じられません。
9
36
 
10
- ```Java
37
+ ```Java サーブレットから呼び出される関数
38
+ protected void doUpdateExcel(HttpServletRequest request, HttpServletResponse response)
11
- public static void writeXLSXFile() throws IOException {
39
+ throws ServletException, IOException {
12
-
13
- String excelFileName = "C:/Test.xlsx";//name of excel file
14
40
 
15
- String sheetName = "Sheet1";//name of sheet
41
+ --- エクセルを生成する処理 ---
16
42
 
17
- XSSFWorkbook wb = new XSSFWorkbook();
18
- XSSFSheet sheet = wb.createSheet(sheetName) ;
43
+ doDownload(); // ここで上記のエクセルダウンロードを呼び出すと、タブが自動で閉じられない
19
44
 
20
- //iterating r number of rows
21
- for (int r=0;r < 5; r++ )
22
- {
45
+ }
23
- XSSFRow row = sheet.createRow(r);
46
+ ```
24
47
 
25
- //iterating c number of columns
48
+ 一方、関数を使わずに、関数の処理をそっくりそのまま、サーブレットで実行すれば、
26
- for (int c=0;c < 5; c++ )
49
+ タブは自動で閉じられます。
27
- {
28
- XSSFCell cell = row.createCell(c);
29
-
30
- cell.setCellValue("Cell "+r+" "+c);
31
- }
32
- }
33
50
 
34
- FileOutputStream fileOut = new FileOutputStream(excelFileName);
35
51
 
52
+ おそらく原因は、関数内で、wb.write(out)を行うと、この内部処理でreturnするような処理になっていると思うのですが、
53
+ 関数でそれを実行すると、まだ、サーブレット側の処理がのこっていることになり、
36
- //write this workbook to an Outputstream.
54
+ 一方、サーブレットでwb.write(out)とすれば、内部処理でreturn後、サーブレットがおわることになり、
37
- wb.write(fileOut);
55
+ タブが自動に閉じられるような挙動になっているのではと思っています。
38
- fileOut.flush();
39
- fileOut.close();
40
- }
41
56
 
42
- public static void main(String[] args) throws IOException {
43
-
44
- writeXLSXFile();
45
57
 
46
- }
47
- ```
48
-
49
- servlet側でwb.outすると、ダウンロード後にタが自動閉じられるのですが
58
+ 同じコードをサーレット単位書くは面倒なので、
50
- 関数内でもタブ自動閉じられる方法はありでしょうか。
59
+ 関数内で実行したいです、なかよい方法はございせんでしょうか。