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