ind*_*igo 1 java excel apache-poi
我正在尝试使用Apache POI读取Excel文件。我的目标是从每一行中获取单元格2和3,并将它们放入数组中。在某些行中,单元格3为空(我不是在谈论EMPTY,NULL或BLANK)。如果在Excel中检查它们,则为空。
这些空单元格中的一些(不是全部)导致NullPonterException:线程“ main” java.lang.NullPointerException中的异常。尝试获取单元格值或单元格类型时会发生这种情况。我的印象是该位置没有牢房。
同时,如果我row.createCell(2).setCellType(1);为该特定行执行该程序,则继续到该类型的下一个单元格。那是(我能找到的)唯一的解决方法,可以继续从下一行读取单元格。
您能否帮助我理解如何(使用代码)识别这些单元并将解决方法放到适当位置,以便我可以继续阅读直到文件末尾?
这是代码:
static ArrayList<String> getFirstFile() throws IOException
{
FileInputStream fileIn = null;
ArrayList <String> namesFirstFile = new ArrayList <String>();
String folderPath = "C:\\";
String indivList1 = "filename.xls";
fileIn = new FileInputStream(folderPath+indivList1);
POIFSFileSystem fs = new POIFSFileSystem(fileIn);
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wb.getSheetAt(0);
int rowNumber = 6; //skipping the first 6 rows as irrelevant
HSSFRow row = sheet.getRow(rowNumber);
String firstName = "";
String lastName = "";
while(row.getCell(0).getCellType() == 0) {
lastName = row.getCell(1).toString();
firstName = row.getCell(2).toString();
namesFirstFile.add((rowNumber-6), (lastName + " " + firstName));
rowNumber++;
row = sheet.getRow(rowNumber);
}
}
Run Code Online (Sandbox Code Playgroud)
您必须检查该单元格的存在。请记住,如果存在一行并不表示所有单元格都存在。如果不存在该特定单元格,则执行get操作将引发空指针错误,但create单元格将不会引发错误,因为它会在该特定行中创建该单元格。仅当该单元格对象存在时,才能对其进行点运算符。
例如:
如果位于第三位置的单元格将起作用:
row1.getCell(2).getStringCellValue(); // if the value is of string type
否则,您需要检查是否使用if并在需要时创建该单元格。
// This checks if the cell is present or it'll return null if the cell
// is not present (it won't check the value in cell)
if (row1.getCell(2) != null)
{
row1.createCell(2);
}
Run Code Online (Sandbox Code Playgroud)
如果该单元格不存在,而您的唯一目标是获取该值,则可以在数组中设置默认值。
这两行将不起作用,因为它将把单元格对象转换为字符串,但不能将其内容转换为字符串:
lastName = row.getCell(1).toString();
firstName = row.getCell(2).toString();
Run Code Online (Sandbox Code Playgroud)
您必须将其更改为:
lastName = row.getCell(1).getStringCellValue();
firstName = row.getCell(2).getStringCellValue();
Run Code Online (Sandbox Code Playgroud)
如果该单元格中没有任何值,则无需执行此操作:
if (row.getCell(2) != null)
{
row.createCell(2);
}
firstName = row.getCell(2).toString();
Run Code Online (Sandbox Code Playgroud)
更改为:
if (row.getCell(2) != null)
{
firstName = row.getCell(2); // your other operations
} else {
firstname = "default value"; // your other operations
}
Run Code Online (Sandbox Code Playgroud)
仅在创建单元格而不设置值时,才需要获取单元格值。
row.createCell(2);仅在为单元格设置值时才需要使用。在这里,您没有任何价值。
static Row.MissingCellPolicy CREATE_NULL_AS_BLANK
为丢失的单元格创建一个新的空白单元格。
static Row.MissingCellPolicy RETURN_BLANK_AS_NULL
缺失的单元格返回为空,空白单元格也是如此
static Row.MissingCellPolicy RETURN_NULL_AND_BLANK
缺失的单元格返回为空,空白单元格正常返回
这个问题对这个话题有很好的讨论。
| 归档时间: |
|
| 查看次数: |
7970 次 |
| 最近记录: |