我正在使用 Apache POI 来阅读Excel。我被要求将单元存储到MySQL 5.1中。当我正在阅读Excel单元格时,我已被抛出NullPointerException
。
这是我的代码段:
int rows = sheet.getPhysicalNumberOfRows();
for(int r = 1; r<rows; r++) {
HSSFRow row = sheet.getRow(r);
int cols = row.getLastCellNum();
for(int c=0; c < cols; c++) {
HSSFCell cell = row.getCell(c, Row.CREATE_NULL_AS_BLANK);
switch(cell.getColumnIndex()) {
case 0:
....
....
case 1:
....
....
case ...:
....
....
}
}
}
// Here comes the code to insert into DB
如果有人能够确定它出现的位置,请尽快发布。如果我留下一些逻辑,你只需要问我......
答案 0 :(得分:3)
你的数组偏移是否可能被一个(对于行循环)?
for(int r = 1; r<rows; r++) {
HSSFRow row = sheet.getRow(r);
而不是从偏移量1开始,从0开始。这更有意义(并匹配您的列循环)。
在这种情况下,HSSFRow row = sheet.getRow(r)的结果;可以为null(顺便提一句,你应该检查)。
修改#1:强> 例如:
if (sheet == null) {
return;
}
int rows = sheet.getPhysicalNumberOfRows();
for(int r = 1; r<rows; r++) {
HSSFRow row = sheet.getRow(r);
if (row != null) {
int cols = row.getLastCellNum();
for(int c=0; c < cols; c++) {
HSSFCell cell = row.getCell(c, Row.CREATE_NULL_AS_BLANK);
if (cell != null) {
switch(cell.getColumnIndex()) {
case 0:
case 1:
case ...:
}
}
}
}
}
如果你看the JavaDoc这很重要
public int getPhysicalNumberOfRows() {
return _rows.size();
}
返回物理定义的行数( NOT 表单中的行数)
修改#2:强> 为了进一步调试,请将以下try / catch放在for循环中。
try {
// Your for loop code here
} catch (Exception x) {
x.printStackTrace();
}
请将评论粘贴到此答案或使用此输出的结果更新原始答案。
答案 1 :(得分:1)
我不解释你的NPE,但建议你用另一种方法来迭代工作簿,你试过这个吗?
for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
final Sheet sheet = workbook.getSheetAt(i);
final Iterator<Row> rows = sheet.rowIterator();
if (rows.hasNext()) {
final Row header = rows.next();
....
}
}
答案 2 :(得分:0)
我猜单元格可能为null,但您应该使用调试器找出异常位置。
答案 3 :(得分:0)
根据给出的代码,sheet
,row
或cell
将为空。异常堆栈跟踪本身应该告诉您导致问题的确切行。
首先想到的是,您获得了工作表中的实际行数,但getRow()
会获得逻辑行。您可能希望使用似乎返回逻辑行的getFirstRowNum()
和getLastRowNum()
。
但那只是我的想法。在我可以肯定地说之前需要更多信息。
要获得异常npe
的堆栈跟踪,请使用:
npe.printStackTrace();
或:
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw, true);
npe.printStackTrace(pw);
pw.flush();
sw.flush();
// sw.toString(); to get a string for putting into a text box or something else.