I need to read the excel file, so I can reference the column index by name, and I do like that :
package main;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class ReadExcel {
public static void main(String[] args) {
try {
InputStream fs = new FileInputStream("/.../ListProducts.xls");
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wb.getSheetAt(0);
Map<String, Integer> map = new HashMap<String,Integer>(); //Create map
HSSFRow row = sheet.getRow(0); //Get first row
//following is boilerplate from the java doc
short minColIx = row.getFirstCellNum(); //get the first column index for a row
short maxColIx = row.getLastCellNum(); //get the last column index for a row
for(short colIx=minColIx; colIx<maxColIx; colIx++) { //loop from first to last index
HSSFCell cell = row.getCell(colIx); //get the cell
map.put(cell.getStringCellValue(),cell.getColumnIndex()); //add the cell contents (name of column) and cell index to the map
}
List<ReportRow> listOfDataFromReport = new ArrayList<ReportRow>();
for(int x = 1; x<=sheet.getPhysicalNumberOfRows(); x++){
ReportRow rr = new ReportRow();
HSSFRow dataRow = sheet.getRow(x);
int idxForColumn1 = map.get("Id");
int idxForColumn2 = map.get("Name");
int idxForColumn3 = map.get("Price");
HSSFCell cell1 = dataRow.getCell(idxForColumn1);
HSSFCell cell2 = dataRow.getCell(idxForColumn2);
HSSFCell cell3 = dataRow.getCell(idxForColumn3);
rr.setColumn1(cell1.getStringCellValue());
rr.setColumn2(cell2.getStringCellValue());
rr.setColumn3(cell3.getStringCellValue());
listOfDataFromReport.add(rr);
}
for(int j = 0; j< listOfDataFromReport.size();j++){
System.out.println("Column 1 Value: " + listOfDataFromReport.get(j).getColumn1());
//etc...
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
When I run the program, I get this in output :
null
I have already the excel file in the correct destination and with the right name of column.
EDIT
When I add e.printStackTrace();
, I get this:
java.lang.NullPointerException
at main.ReadExcel.main(ReadExcel.java:51)
null
EDIT2
I notice that variables of setColumn1,setColumn2,...
methods are double
.
I do this :
rr.setColumn1(cell1.getNumericCellValue());
rr.setColumn2(cell2.getNumericCellValue());
rr.setColumn3(cell3.getNumericCellValue());
I get the following error when I try to run the program to read data:
Exception in thread "main" java.lang.IllegalStateException: Cannot get
a NUMERIC value from a STRING cell at
org.apache.poi.hssf.usermodel.HSSFCell.typeMismatch(HSSFCell.java:654)
at org.apache.poi.hssf.usermodel.HSSFCell.getNumericCellValue(HSSFCell.java:679)
Well I got kinda different opinion than @maytham-ɯɐɥʇʎɐɯ. Assuming names of the columns are correct in your code, I think that this may be the problem:
for(int x = 1; x<=sheet.getPhysicalNumberOfRows(); x++){
Let's say number of physical rows is 3
, so they are numbered 0, 1, 2
and you are iterating till 3
, thus when you trying to get the cell later it throws the NullPointerException
, because there is no such row.
Try doing x < sheet.getPhysicalNumberOfRows();
(less than, not less/equal than) in the for
loop I mentioned earlier.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.