使用XSSFWorkbook将数据追加到现有的Excel文件中

4

我正在尝试编写一段代码,将数据追加到已经存在的Excel电子表格中。但是当我运行此代码时,文件会变得损坏。

在这个代码中,我尝试添加一个电子表格,但我已经尝试过在现有表格中添加单元格,但都没有成功,而且出现了同样的错误。我是否漏掉了什么?看起来我创建了一个Excel,添加了一些数据,然后写入、关闭它。然后只是向现有工作簿添加一个新表格,并再次将其写入流。

public class PlayWithExcel {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub

    Workbook wb = new XSSFWorkbook();
    XSSFSheet ws = (XSSFSheet) wb.createSheet("Initial Data");
    XSSFSheet ws1 = (XSSFSheet) wb.createSheet("Cross Referenced");
    XSSFSheet ws2 = (XSSFSheet) wb.createSheet("HPD");

    Row row = ws.createRow(0);
    row.createCell(0).setCellValue("Value");
    row = ws1.createRow(2);
    row.createCell(3).setCellValue("Address");

    try {
        String path = "C:/Users/Jenny/Desktop/Test.xlsx";
        FileOutputStream out = new FileOutputStream(path);
        wb.write(out);
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }


    XSSFSheet ws3 = (XSSFSheet) wb.createSheet("another sheet");


    try {
        String path = "C:/Users/Jenny/Desktop/Test.xlsx";
        FileOutputStream out = new FileOutputStream(path);
        wb.write(out);
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

1个回答

4
许多人在尝试多次写入时遇到了问题。 POI中已知此问题
然而,我建议您在第一次写入时使用FileInputStream重新加载文件,并且当您需要重新加载访问文件时,请再次尝试。
try {
    String path = "C:/Users/Jenny/Desktop/Test.xlsx";
    FileOutputStream out = new FileOutputStream(path);
    wb.write(out);
    out.close();
    wb = new XSSFWorkbook(new FileInputStream(path));
} catch (Exception e) {
    e.printStackTrace();
}

1
如果你有一个文件,最好直接从文件中打开,而不是通过InputStream,详情请参阅POI文档 - Gagravarr
Sankumarsingh,非常感谢!!!它真的起作用了!但我似乎不明白我刚做的事情的逻辑。InputStream如何帮助我,它是用于读取文件的。如果您能解释一下会很有帮助。 - Jenny
@Leah-DinaCharnetskaya:最初您创建了一个新的工作簿,因此不需要加载任何输入流,但是当您编写任何Excel工作簿并且如果再次想要在该工作簿上工作时,则需要重新加载它。顺便说一句,使用输入/输出文件流会有点慢且占用内存。如果您使用文件,则会更好。 - Sankumarsingh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接