こんにちは私たちはJavaプログラムをポインするApacheを使用してxlsとxlsxファイルを読んでいます、問題は2つの理由でnullポインタ例外を取得していることです..最初の1つは空白のセルですすでに解決されており、もう1つは、レコードのない特定の列を選択する場合です。
私たちのプログラムは、Excelファイルのパスを要求し、次にファイルの特定のシート番号と読み取りたいシートの特定の列番号を要求します。これがxlsファイルを読み取るためのコードです。
public void readXLSFile()throws IOException{
InputStream ExcelFileToRead = new FileInputStream(path);
HSSFWorkbook wb = new HSSFWorkbook(ExcelFileToRead);
HSSFSheet sheet=wb.getSheetAt(sheetname);
HSSFRow row;
HSSFCell cell;
Iterator rows = sheet.rowIterator();
list1.clear();
while (rows.hasNext())
{
headers.clear();
row=(HSSFRow) rows.next();
// Iterator cells = row.cellIterator();
headers.add("contents");
cnt = cnt+1;
cell = row.getCell(cols);
if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING)
{
//System.out.println(cell.getStringCellValue()+"(string)");
list.add(cell.getStringCellValue());
d.add(cell.getStringCellValue());
list1.add(new KeyValuePair(cell.getStringCellValue(),""));
}
else if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC)
{
//System.out.println(cell.getNumericCellValue()+"(numeric)");
double num = cell.getNumericCellValue();
String num2 = String.valueOf(num);
list.add(num2);
d.add(num2);
list1.add(new KeyValuePair(num2,""));
}
else if(cell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN)
{
//System.out.println(cell.getBooleanCellValue()+"(boolean)");
String bool = String.valueOf(cell.getBooleanCellValue());
list.add(bool);
d.add(bool);
list1.add(new KeyValuePair(bool,""));
}
else
{
//U Can Handel Boolean, Formula, Errors
}
//System.out.println();
}
arrey = list.toArray(new String[list.size()]);
data.add(d);
// System.out.println(data);
model = new DefaultTableModel();
table_1.setModel(model);
table_1.setModel(model);
model.setColumnIdentifiers(new String[] {"row","contents"});
for (KeyValuePair p : list1){
int nor=table_1.getRowCount();
int n2 = nor +1;
n1 = Integer.toString(n2);
// model.addColumn(new String [] {n1});
model.addRow(new String[] {n1,p.key, p.value});
}
// model.addColumn(new String[] {n1});
}
変数sheetnameはExcelファイルのシート番号用です
HSSFSheet sheet=wb.getSheetAt(sheetname);
変数colsは、読み取りたい特定の列用です。
cell = row.getCell(cols);
すべてのシートの最初の列と2番目のシートの2番目の列を読み取ることができますが、テストファイルを編集すると、プログラムはすべてのシートの最初の列しか読み取ることができなくなります。エラーはnullポインター例外です。事前に感謝を助けます
問題は、セルがnullかどうかをテストしないことです。
_if (cell == null)
{
System.out.println("Cell is Empty in Column:" + cols);
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING)
{
//code
}
_
空のセルはnull
または_CELL_TYPE_BLANK
_のいずれかである可能性があるため、一般的な問題として、Cell.getCellType()
関数の処理には注意が必要です。
これは、CellNullPoiterExceptionを回避するための私の方法です。
試してみませんか。幸運を!
/**
* Get string value of {@link Cell} object
*
* @param cell
* {@link Cell} object
* @return String value of {@link Cell} object
*/
private static String getCellValueString(Cell cell) {
String value="";
if(cell!=null) {
switch(cell.getCellType()){
case Cell.CELL_TYPE_BOOLEAN:
value=String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_NUMERIC:
value=BigDecimal.valueOf(
cell.getNumericCellValue()).toPlainString();
break;
case Cell.CELL_TYPE_STRING:
value=String.valueOf(cell.getStringCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
value=String.valueOf(cell.getCellFormula());
break;
case Cell.CELL_TYPE_BLANK:
value="";
break;
}
} else {
logger.error("Cell is null");
}
return value.trim();
}