首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用apache poi 3.7多次写入xlsx文档时出现异常

使用apache poi 3.7多次写入xlsx文档时出现异常
EN

Stack Overflow用户
提问于 2011-11-24 15:47:26
回答 6查看 26.9K关注 0票数 20

在尝试使用Apache POI编写.xlsx文件时,我得到了以下异常:org.apache.xmlbeans.impl.values.XmlValueDisconnectedException

似乎问题出在第二次使用write ()方法上。当使用HSSFWorkbook时,不会出现这个问题。

代码如下:

public class SomeClass{

XSSFWorkbook workbook;

public SomeClass() throws IOException{
    File excelFile = new File("workbook.xlsx");

    InputStream inp = new FileInputStream(excelFile);
    workbook = new XSSFWorkbook(inp);
    inp.close();
}

void method(int i) throws InvalidFormatException, IOException {

    XSSFSheet sheet = workbook.getSheetAt(0);
    XSSFRow row = sheet.getRow(i);
    if (row == null) {
        row = sheet.createRow(i);
    }
    XSSFCell cell = row.getCell(i);
    if (cell == null)
        cell = row.createCell(i);
    cell.setCellType(Cell.CELL_TYPE_STRING);
    cell.setCellValue("a test");

    // Write the output to a file
    FileOutputStream fileOut = new FileOutputStream("workbook.xlsx");
    workbook.write(fileOut);
    fileOut.close();

}

public static void main(String[] args) throws Exception {
    SomeClass sc = new SomeClass();

    sc.method(1);
    sc.method(2);
}
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-11-24 15:58:34

这很可能是一个bug。

https://issues.apache.org/bugzilla/show_bug.cgi?id=49940

我建议您订阅该票证,以获得有关当前改进/替代方案的通知。

如果我找到了解决办法,我会让你知道的。

票数 10
EN

Stack Overflow用户

发布于 2012-03-21 02:01:27

我今天也遇到了同样的问题。我注意到许多人在许多不同的论坛上问同样的问题,但我在任何地方都没有看到答案。所以,这就是我想出来的。它远不是理想的(我能想到至少两种情况下这可能是个坏主意),而且可能无法满足所有需求,但它是有效的!

在工作簿对象是其属性的类中的每一次保存操作之后,我都会从刚刚保存它的文件中重新加载工作簿。

使用上面的代码示例,我会像这样修改方法:

void method(int i) throws InvalidFormatException, IOException {
    ...

    // Write the output to a file
    FileOutputStream fileOut = new FileOutputStream("workbook.xlsx");
    workbook.write(fileOut);
    fileOut.close();

    // Reload the workbook, workaround for bug 49940
    // https://issues.apache.org/bugzilla/show_bug.cgi?id=49940
    workbook = new XSSFWorkbook(new FileInputStream("workbook.xlsx"));
}

我在代码中测试了这一点,它很好地解决了这个问题。只需确保您从保存它的同一文件中读回它,而不是从更早的或不同的版本。

票数 12
EN

Stack Overflow用户

发布于 2013-06-27 03:52:27

我为此找到的解决方案,我已经寻找了一段时间,是确保你不会用你用来打开FileOutputStream以保存WorkbookFile打开你的Workbook。相反,请使用FileInputStream打开Workbook

像这样的东西将会完美地工作

        File inputFile = new File("Your-Path");
        this.inputStream = new FileInputStream(inputFile);
        this.opc = OPCPackage.open(this.inputStream);
        this.workbook = WorkbookFactory.create(opc);

...

        this.outputStream = new FileOutputStream(inputFile);
        this.workbook.write(this,outputStream);

不要忘记关闭每个打开的流和OPCPackage

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8253653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档