【问题标题】:How can I open an existing *.xlsx file, make modifications, then save as new file (leaving original file untouched?)如何打开现有的 *.xlsx 文件,进行修改,然后另存为新文件(保持原始文件不变?)
【发布时间】:2017-02-24 01:21:19
【问题描述】:

我需要打开一个现有的 *.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();

【问题讨论】:

  • 先复制文件?
  • 首先复制文件对我来说似乎比不保存流式传输更好。

标签: java apache-poi


【解决方案1】:
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

【讨论】:

  • 这仅适用于 Swing。
【解决方案2】:

下面是使用 OPCPackage 读取时如何做到这一点(try/catch/finally ommitted for readibility):

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

【讨论】:

    【解决方案3】:

    这是我最终使用的最终解决方案。这样做的好处是没有文件保存在任何地方。我还添加了以下行:

    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 将文件发送到您的浏览器。

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      相关资源
      最近更新 更多