我正在使用apache poi来解析一组excel文件。他们都看起来像这样。
我的代码应该找到ID行,然后找到它前面的两行,以便提取该行的第一个单元格的内容。
代码如下:
Iterator<Row> rowIterator = sheet.iterator();
int rowIndex = 0;
while (rowIterator.hasNext())
{
row = rowIterator.next();
rowIndex ++;
cell = row.getCell(0);
if (cell != null) {
if (rowIndex > 2) {
Row protocolRow = sheet.getRow(rowIndex - 3);
String cellStr = protocolRow.getCell(0).getStringValue();
}
}
}
虽然两行的相对位置是固定的,但方法getRow(index)中的索引是电子表格的绝对行索引。电子表格中有很多空行。其中一些可能是空的,其他可能不是。由于行迭代器会跳过null,因此rowIndex不是绝对索引的计数器。 Iterator也无法回去获取前一行。获取ID行之前两行的行的绝对行索引的最佳行是什么?
答案 0 :(得分:1)
对于行和列,Excel电子表格可以是稀疏的。
在基础数据中,按顺序列出行,每行的行号隐式递增1,但是行可以指定其行号,从而跳过多个(空白)行。
示例:
row
row
row num=5
row
此数据定义了行1,2,5和6。
同样的概念适用于一行的单元格。
因此,如果对某行进行了任何操作,即使您清除了所有值和格式,该行仍然存在。如果没有为行执行任何操作,则可以在基础数据中跳过 。
那么,实际存在空白行还是跳过了?要看。您应该编写逻辑来处理这两种方式。这样你就不在乎了。
答案 1 :(得分:1)
正如cunningly titled "Iterating over Rows and Cells" section of the Apache POI documentation(谁可能已经猜到了?)中所解释的那样,您应该使用以下代码显式迭代行:
// Decide which rows to process
int rowStart = Math.min(15, sheet.getFirstRowNum());
int rowEnd = Math.max(1400, sheet.getLastRowNum());
for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
Row r = sheet.getRow(rowNum);
if (r == null) {
// This whole row is empty
// Handle it as needed
continue;
}
int lastColumn = Math.max(r.getLastCellNum(), MY_MINIMUM_COLUMN_COUNT);
for (int cn = 0; cn < lastColumn; cn++) {
Cell c = r.getCell(cn, Row.RETURN_BLANK_AS_NULL);
if (c == null) {
// The spreadsheet is empty in this cell
} else {
// Do something useful with the cell's contents
}
}
}
否则,请问Row what row number it is!迭代如:
for (Sheet sheet : wb ) {
for (Row row : sheet) {
int rowIndex = row.getRowNum();
// Handle cells here
}
}