2017-02-21 16 views
0

既存の* .xlsx Excelファイルを開いて変更してから、新しいファイル(または保存せずにフロントエンドにストリームする)。元のファイルは変更しないでください。既存の* .xlsxファイルを開いて変更し、新しいファイルとして保存することができます(元のファイルはそのままです)。

メモリ上の理由から

(ここで説明したよう:http://poi.apache.org/spreadsheet/quick-guide.html#FileInputStream)、私はFileInputStreamの使用を避けるここ

// XSSFWorkbook, File 
OPCPackage pkg = OPCPackage.open(new File("file.xlsx")); 
XSSFWorkbook wb = new XSSFWorkbook(pkg); 
.... 
pkg.close(); 
+2

ファイルを最初にコピーしますか? – SLaks

+0

ファイルをコピーすると、実際には保存せずにストリーミングするよりもうまくいくようです。 – Robert

答えて

0

は、私が使用して終了し、私の最終的な解決策です。これは、ファイルがどこにも保存されないという利点があります。私はまた、次の行を追加しました:

XSSFFormulaEvaluator.evaluateAllFormulaCells(workbook); 

これは、すべての公式が確実に更新されるようにします。 もう一度try/catch/finallyをすべて削除しました。

OPCPackage pkg = OPCPackage.open("existingFile.xlsx"); 
XSSFWorkbook wb = (XSSFWorkbook) WorkbookFactory.create(pkg); 

// make your modifications... 
XSSFSheet sheet = wb.getSheetAt(0); 
// 
XSSFFormulaEvaluator.evaluateAllFormulaCells(workbook); 
ByteArrayOutputStream os = new ByteArrayOutputStream(); 
wb.write(os); 
pkg.close(); 
os.close(); 
Faces.sendFile(os.toByteArray(), "file.xlsx", true); 

これが機能するためには、入力と出力に異なるファイルパスを使用することが重要です。

最後の行は、Omnifacesを使用してファイルをブラウザに送信します。

0
JFileChooser fileOpen = new JFileChooser(); 
fileOpen.showOpenDialog(theFrame); // gives you an open file dialog 
readFile(fileOpen.getSelectedFile()); // write you reading content in reaFile method 

JFileChooser fileSave = new JFileChooser(); 
fileSave.showSaveDialog(Frame); //gives you a dialog box for saving 
saveFile(fileSave.getSelectedFile()); // write your saving content in saveFile method 
+0

これはSwing専用です。 – Robert

0

は(最終的にはreadibilityのために省略さ/キャッチ/試す読むためにOPCPackageを使用している場合、これはどのように行うことができるかであります):

OPCPackage pkg = OPCPackage.open("existingFile.xlsx"); 
XSSFWorkbook wb = (XSSFWorkbook) WorkbookFactory.create(pkg); 


make your modifications... XSSFSheet sheet = wb.getSheetAt(0); ... 
fos = new FileOutputStream("outputFileName.xlsx"); 
wb.write(fos); 
pkg.close(); 
fos.close(); 
Faces.sendFile(new File(outputFileName) 

これが機能するためには、入力と出力に異なるファイルパスを使用することが重要です。

最後の行は、Omnifacesを使用してファイルをブラウザに送信します。

詳細については、この質問を参照してください:ここで enter link description here

関連する問題