使用POI事件用户模型读取<no data =“”> </no>

时间:2013-09-18 08:25:00

标签: java excel apache-poi

我不确定我是否理解正确,但我认为如果我使用POI事件模型,并且excel列中没有数据(只是空白,甚至不是空格),则根本不读取数据。 我遇到的问题是我有一个包含15列的模型,我正在读取数据以从excel表填充模型。 我读取了excel并将数据存储在List中,然后添加到模型中 如果其中一列没有数据,POI什么都不读,因此我创建的List只有14列。 然后我无法匹配模型和列表中的列。

如何解决此问题?

2 个答案:

答案 0 :(得分:0)

如果您使用HSSF作为.xls文件,则可以使用MissingRecordAwareHSSFListener来向您发送特殊记录以指示间隙。一个很好的例子是XLS2CSVmra。但是,你说你在XSSF上使用.xlsx,所以它有点不同

这是一个Apache POI示例,它涵盖.xlsx文件中缺少的记录,您需要查看XLSX2CSV example。基本上,你应该有一个变量来保存你看到的最后一个列号。当startElement触发c(单元格)时,请检查参考列与最后看到的列。如果存在间隙,则在该点触发空单元格到逻辑,然后记录新列和处理。

获取当前列号的逻辑类似于:

// Get the cell reference
String r = attributes.getValue("r");
int firstDigit = -1;
for (int c = 0; c < r.length(); ++c) {
    if (Character.isDigit(r.charAt(c))) {
         firstDigit = c;
         break;
    }
}
thisColumn = nameToColumn(r.substring(0, firstDigit));

不要忘记在新行上重置列计数器(endElement row通常是一个很好的触发它的方法)

答案 1 :(得分:0)

感谢@Gagravarr,给我最初的想法来解决问题。 我没跟,完全是你建议的。相反,我做的是,我比较了列引用中的字符(ASCII值),当前的一个和最后一个。 我跟踪最后一列参考并检查两列参考之间的差异应始终为1,即B1 - A1 == 1。 任何偏离我认为是跳过一列。 解决方案完美无缺,下面是我所做的一小部分:

   char currColChar = attributes.getValue("r").charAt(0);
   // Check if we have missed a column due to no data
   if ((currColChar - lastColumnChar) > 1) {
                //logic for column skipped
   }
   lastColumnChar = currColChar;