OSDN Git Service

InputStreamを引数とするmakeReportでのExcel2007以降のテンプレートファイルOpenError対応
[jaxcel/jaxcel.git] / Jaxcel / src / org / hanei / jaxcel / report / ReportMaker.java
index b355d19..e6bac69 100644 (file)
@@ -18,6 +18,7 @@
  */\r
 package org.hanei.jaxcel.report;\r
 \r
+import java.io.BufferedInputStream;\r
 import java.io.File;\r
 import java.io.FileOutputStream;\r
 import java.io.IOException;\r
@@ -28,6 +29,7 @@ import java.util.Map;
 \r
 import org.apache.poi.hssf.usermodel.HSSFSheet;\r
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;\r
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;\r
 import org.apache.poi.openxml4j.opc.OPCPackage;\r
 import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;\r
 import org.apache.poi.poifs.filesystem.OfficeXmlFileException;\r
@@ -187,6 +189,11 @@ public class ReportMaker {
        private JaxcelContext context  = null;\r
 \r
        /**\r
+        *  テンプレート一時ファイル\r
+        */\r
+       private File templateFile = null;\r
+       \r
+       /**\r
         * コンストラクタ\r
         */\r
        public ReportMaker() {}\r
@@ -194,7 +201,8 @@ public class ReportMaker {
        /**\r
         * 入力ストリームのExcelテンプレートファイルにデータを挿入することでExcel帳票を生成、Workbookオブジェクトを返却する。<br>\r
         * 返却されたWorkbookオブジェクトはPOIを使用し、加工・出力が可能。<br>\r
-        * 入力ストリームは別途クローズが必要。\r
+        * 入力ストリームは別途クローズが必要。<br>\r
+        * Workbookオブジェクトの使用終了後はclose()メソッドでExcelテンプレートファイルのクローズが必要。\r
         * \r
         * @param template Excelテンプレートファイル入力ストリーム\r
         * @param parameter テンプレートに挿入するデータ\r
@@ -211,15 +219,17 @@ public class ReportMaker {
                        log.error("template is null");\r
                        throw new JaxcelInputException("template is null");\r
                }\r
-               if(parameter == null) {\r
-                       log.debug("parameter is null");\r
+               \r
+               // 一時ファイル作成\r
+               if (templateFile != null && templateFile.exists()) {\r
+                       templateFile.delete();\r
+                       log.debug("template file delete: {}", templateFile.getPath());\r
+                       templateFile = null;\r
                }\r
-\r
-               // Excelテンプレートファイルオープン\r
-               Workbook book = openWorkbook(template);\r
+               templateFile = createTempFile(template);\r
                \r
                // Excel帳票生成\r
-               makeReport(book, parameter);\r
+               Workbook book = makeReport(templateFile, parameter);\r
                \r
                log.trace("makeReport end");\r
                return book;\r
@@ -296,7 +306,7 @@ public class ReportMaker {
        /**\r
         * Excelテンプレートファイルにデータを挿入することでExcel帳票を生成、Workbookオブジェクトを返却する。<br>\r
         * 返却されたWorkbookオブジェクトはPOIを使用し、加工・出力が可能。<br>\r
-        * Excelテンプレートファイルは別途クローズが必要。\r
+        * Workbookオブジェクトの使用終了後はclose()メソッドでExcelテンプレートファイルのクローズが必要。\r
         * \r
         * @param template Excelテンプレートファイル\r
         * @param parameter テンプレートに挿入するデータ\r
@@ -404,7 +414,7 @@ public class ReportMaker {
        \r
        /**\r
         * ExcelテンプレートのWorkbookオブジェクトにデータを挿入することでExcel帳票を生成する。<br>\r
-        * Excelテンプレートファイルは別途クローズが必要。\r
+        * Workbookオブジェクトの使用終了後はclose()メソッドでExcelテンプレートファイルのクローズが必要。\r
         * \r
         * @param book Workbookオブジェクト\r
         * @param parameter テンプレートに挿入するデータ\r
@@ -446,40 +456,27 @@ public class ReportMaker {
        /**\r
         * ワークブックのオープン\r
         * \r
-        * @param template Excelテンプレートファイル 入力ストリーム or ファイル\r
+        * @param template Excelテンプレートファイル\r
         * \r
         * @throws JaxcelInputException Excelテンプレートファイルオープン失敗時\r
         */\r
-       private Workbook openWorkbook(Object template) {\r
+       private Workbook openWorkbook(File template) {\r
                log.trace("openWorkbook start");\r
 \r
                // Workbookオブジェクト \r
                Workbook book = null;\r
-       \r
-               // Excelテンプレートファイルオープン\r
-               \r
+\r
+               // Excel2003以前\r
                try {\r
-                       // Excel2003以前\r
-                       if(template instanceof File) {\r
-                               npoifs = new NPOIFSFileSystem((File) template);\r
-                       }\r
-                       else {\r
-                               npoifs = new NPOIFSFileSystem((InputStream) template);\r
-                       }\r
+                       npoifs = new NPOIFSFileSystem(template);\r
                        book = WorkbookFactory.create(npoifs);\r
-               } catch(OfficeXmlFileException | IOException e1) {\r
-       \r
+               } catch (OfficeXmlFileException | IOException e1) {\r
                        // Excel2007以降\r
                        try {\r
-                               if(template instanceof File) {\r
-                                       pkg = OPCPackage.open((File) template);\r
-                               }\r
-                               else {\r
-                                       pkg = OPCPackage.open((InputStream) template);\r
-                               }\r
+                               pkg = OPCPackage.open(template);\r
                                book = WorkbookFactory.create(pkg);\r
-                       } catch (Exception e2) {\r
-                               log.error("template file open error: {}. {}", e1.getMessage(), e2.getMessage());\r
+                       } catch (InvalidFormatException | IOException e2) {\r
+                               log.error("template file open error: [{}]. [{}]", e1.getMessage(), e2.getMessage());\r
                        }\r
                }\r
 \r
@@ -535,6 +532,11 @@ public class ReportMaker {
                                log.debug("template file close.");\r
                                pkg = null;\r
                        }\r
+                       if (templateFile != null && templateFile.exists()) {\r
+                               templateFile.delete();\r
+                               log.debug("template file delete: {}", templateFile.getPath());\r
+                               templateFile = null;\r
+                       }\r
                } catch (IOException e) {\r
                        log.error("template file close error: {}", e.getMessage(), e);\r
                        throw new JaxcelOutputException("template file close error");\r
@@ -544,6 +546,50 @@ public class ReportMaker {
        }\r
 \r
        /**\r
+        * InputStreamから一時ファイルを作成\r
+        * @param template\r
+        * @return Fileオブジェクト\r
+        * \r
+        * @throws JaxcelInputException 一時ファイル作成エラー発生時\r
+        */\r
+       private File createTempFile(InputStream template) {\r
+               log.trace("createTempFile start");\r
+               \r
+               final String PREFIX = "org.hanei.jaxcel_";\r
+               final String SUFFIX = ".tmp";\r
+               final int BUF_SIZE = 1024;\r
+               \r
+               BufferedInputStream inStream = null;\r
+               File tmpFile = null;\r
+               \r
+               if(template instanceof BufferedInputStream) {\r
+                       inStream = (BufferedInputStream) template;\r
+               }\r
+               else {\r
+                       inStream = new BufferedInputStream((InputStream) template);\r
+               }\r
+               try {\r
+                       tmpFile = File.createTempFile(PREFIX, SUFFIX);\r
+                       FileOutputStream outStream = new FileOutputStream(tmpFile);\r
+                       \r
+                       byte buf[]=new byte[BUF_SIZE];\r
+                       int len;\r
+                       while((len = inStream.read(buf)) != -1){\r
+                                outStream.write(buf, 0, len);\r
+                       }\r
+                       outStream.flush();\r
+                       outStream.close();\r
+                       log.debug("createTempFile: {}", tmpFile.getPath());\r
+               } catch (SecurityException | IOException e) {\r
+                       log.error("template file create error: {}", e.getMessage());\r
+                       throw new JaxcelInputException("template file create error");\r
+               }\r
+               \r
+               log.trace("createTempFile end");\r
+               return tmpFile;\r
+       }\r
+\r
+       /**\r
         * Workbook生成\r
         * @param book Workbookオブジェクト\r
         */\r