当前位置: 首页 > 知识库问答 >
问题:

Excel POI在某些行已存在时意外缺少行

齐俊贤
2023-03-14

有人已经看到这个错误了吗?

我得到它只是当我创建我的HSSFWorkbook

    try {

        LOGGER.info("Open Excel file: " + filename);
        InputStream inputStream = new FileInputStream(filename);
        Workbook wb = new HSSFWorkbook(inputStream);

        Sheet sheet = wb.getSheetAt(0);

        /* save excel */
        FileOutputStream fileOut = new FileOutputStream(filenameOutput);
        wb.write(fileOut);
        fileOut.close();

        wb.close();
        inputStream.close();

    } catch (IOException e1) {
        LOGGER.log(Level.SEVERE, e1.getMessage(), e1);
    }

错误出现在新的HSSF工作簿(inputstream)

Exception in thread "main" java.lang.RuntimeException: Unexpected missing row when some rows already present
    at org.apache.poi.hssf.usermodel.HSSFSheet.setPropertiesFromSheet(HSSFSheet.java:212)
    at org.apache.poi.hssf.usermodel.HSSFSheet.<init>(HSSFSheet.java:137)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:338)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:289)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:224)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:382)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:364)

知道吗?

我在网上看到过这个问题http://apache-poi.1045710.n5.nabble.com/Unexpected-missing-row-when-some-rows-already-present-td5527417.html但他们没有给出好的答案

我用POI 3.12

更新:我的excel包含53行和数百列,所以他不是空的。excel是用Buisness对象生成的,有些人也有同样的问题,没有解决方案。

HSSFSheet的源代码在这里

共有2个答案

夏侯渊
2023-03-14

例子:

Workbook workbook = null;
try {
    workbook = WorkbookFactory.create(is);

} catch (IOException e) {
    e.printStackTrace();

} catch (InvalidFormatException e) {
    e.printStackTrace();
}
Sheet sheet = workbook.getSheetAt(0);

XSSF或HSSF不重要,两者都应该工作良好。

赵涵亮
2023-03-14

好的,我找到解决办法了。

升级到3.14解决问题。

3.13和之前版本中的异常由以下代码生成

  RowRecord row = sheet.getNextRow();
  boolean rowRecordsAlreadyPresent = row != null;


207                 if (hrow == null) {
208                     // Some tools (like Perl module Spreadsheet::WriteExcel - bug 41187) skip the RowRecords
209                     // Excel, OpenOffice.org and GoogleDocs are all OK with this, so POI should be too.
210                     if (rowRecordsAlreadyPresent) {
211                         // if at least one row record is present, all should be present.
212                         throw new RuntimeException("Unexpected missing row when some rows already present");
213                     }

但在3.14,他们只是发表评论

    if (hrow == null) {
        /* we removed this check, see bug 47245 for the discussion around this
        // Some tools (like Perl module Spreadsheet::WriteExcel - bug 41187) skip the RowRecords
        // Excel, OpenOffice.org and GoogleDocs are all OK with this, so POI should be too.
        if (rowRecordsAlreadyPresent) {
            // if at least one row record is present, all should be present.
            throw new RuntimeException("Unexpected missing row when some rows already present");
        }*/

        // create the row record on the fly now.
        RowRecord rowRec = new RowRecord(cval.getRow());
        sheet.addRow(rowRec);
        hrow = createRowFromRecord(rowRec);
    }

正如他们所说,有些工具跳过了RowRec,在我的例子中,这是当我用Buisness Object生成我的. xls时

 类似资料:
  • 问题内容: 我有一个很大的html表单(包含带行的表,其中包含多个输入),我需要通过POST请求提交给PHP脚本。问题是PHP的$ _POST超全局变量中没有提供某些值并且不存在这些值。 我检查(使用Firebug扩展名)这些值实际上是由浏览器发送到服务器的。 $ _POST被填充,但是一些值丢失了。 我使用以下命令检查了原始请求: 并且返回的字符串具有值。它们只是不解析为$ _POST数组。我注

  • 我用编写了以下测试(使用框架时): 然而,当我运行它时,字段似乎丢失了。我得到以下错误: 我想知道为什么,因为我在一节中声明了它。你能帮我吗?

  • 我是Groovy新手,但我正在尝试编写一个简单的递归方法来将层次路径解析为对象图。以下是我尝试过的: 但我得到以下错误: 我错过了什么?

  • 这是Django中一个非常基本且快速的问题。 所以在我看来,在我处理注册的地方,如果用户试图用已经存在的用户名注册,我只想给一个信息,比如表单旁边的一个跨度,说“错误的用户名”。 如何打印该消息? 谢谢你。 这是我的部分代码:

  • 我试图从属性中获取价值,但其中一些属性包含<代码> 例如: 我有3个tomcat属性

  • 我的Kafka消费者的代码是这样的 我已经意识到,这种消费者设置无法读取所有信息。我无法再现这一点,因为这是一个间歇性的问题。 当我使用 将最后 100 条消息与此消费者进行比较时,我发现我的消费者间歇性地随机错过了几条消息。我的消费者有什么问题? 在python中使用消息的方法太多了。应该有一种最好只有一种明显的方法来做到这一点。