我需要打开现有的* .xlsx Excel文件,进行一些修改,然后将其保存为新文件(或将其流式传输到前端而不保存)。原始文件必须保持不变。
出于内存原因,我避免使用FileInputStream(如下所述:http://poi.apache.org/spreadsheet/quick-guide.html#FileInputStream)
// XSSFWorkbook, File
OPCPackage pkg = OPCPackage.open(new File("file.xlsx"));
XSSFWorkbook wb = new XSSFWorkbook(pkg);
....
pkg.close();
答案 0 :(得分: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
答案 1 :(得分:0)
以下是使用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
答案 2 :(得分: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将文件发送到您的浏览器。