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

Java Excel POI在某些行已存在时意外缺少行,java,excel,apache-poi,Java,Excel,Apache Poi,有人已经看到这个错误了吗 我刚创建HSSF工作簿时就得到了它 try { LOGGER.info("Open Excel file: " + filename); InputStream inputStream = new FileInputStream(filename); Workbook wb = new HSSFWorkbook(inputStream); Sheet sheet = wb.getSheetAt(

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

我刚创建HSSF工作簿时就得到了它

    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)上出现错误。

线程“main”java.lang.RuntimeException中的异常:当某些行已经存在时意外缺少行 位于org.apache.poi.hssf.usermodel.HSSFSheet.setPropertiesFromSheet(HSSFSheet.java:212) 在org.apache.poi.hssf.usermodel.HSSFSheet上(HSSFSheet.java:137) 在org.apache.poi.hssf.usermodel.HSSFWorkbook上(HSSFWorkbook.java:338) 在org.apache.poi.hssf.usermodel.HSSFWorkbook.(HSSFWorkbook.java:289) 位于org.apache.poi.hssf.usermodel.HSSFWorkbook.(HSSFWorkbook.java:224) 在org.apache.poi.hssf.usermodel.HSSFWorkbook.(HSSFWorkbook.java:382) 在org.apache.poi.hssf.usermodel.HSSFWorkbook上(HSSFWorkbook.java:364) 有什么想法吗

我在网上看到过这个问题,但他们没有给出很好的答案

我使用POI 3.12

更新:我的excel包含53行和数百列,所以他不是空的。excel是使用业务对象生成的,没有解决方案


HSSFSheet的源代码是

好的,我找到了解决方案

升级到3.14解决问题

3.13和之前版本中的异常由

但是在3.14

正如他们所说,有些工具跳过了RowRec,在我的例子中,就是在我使用Buisness对象生成.xls时,例如:

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不重要,两者都应该很好地工作。

提供更多内容来支持您的答案,仅仅添加一个代码片段似乎不是一个好答案。想想你,我的英语很差!
  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                     }
    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);
    }
Workbook workbook = null;
try {
    workbook = WorkbookFactory.create(is);

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

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