*/\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
\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
private JaxcelContext context = null;\r
\r
/**\r
+ * テンプレート一時ファイル\r
+ */\r
+ private File templateFile = null;\r
+ \r
+ /**\r
* コンストラクタ\r
*/\r
public ReportMaker() {}\r
/**\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
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
/**\r
* Excelテンプレートファイルにデータを挿入することでExcel帳票を生成、Workbookオブジェクトを返却する。<br>\r
* 返却されたWorkbookオブジェクトはPOIを使用し、加工・出力が可能。<br>\r
- * Excelテンプレートファイルは別途クローズが必要。\r
+ * Workbookオブジェクトの使用終了後はclose()メソッドでExcelテンプレートファイルのクローズが必要。\r
* \r
* @param template Excelテンプレートファイル\r
* @param parameter テンプレートに挿入するデータ\r
\r
/**\r
* ExcelテンプレートのWorkbookオブジェクトにデータを挿入することでExcel帳票を生成する。<br>\r
- * Excelテンプレートファイルは別途クローズが必要。\r
+ * Workbookオブジェクトの使用終了後はclose()メソッドでExcelテンプレートファイルのクローズが必要。\r
* \r
* @param book Workbookオブジェクト\r
* @param parameter テンプレートに挿入するデータ\r
/**\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
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
}\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