Java ApachePOI获取读取xls文件的NPE
我正在尝试将一个XLS文件读入java,看起来像这样 A列|产品ID |销售编号Java ApachePOI获取读取xls文件的NPE,java,for-loop,apache-poi,Java,For Loop,Apache Poi,我正在尝试将一个XLS文件读入java,看起来像这样 A列|产品ID |销售编号 ..105029..15 102930….9 203911…29 ..105029..4 其中,我需要将每个产品ID的产品销售总数相加,然后创建一个新文件,其中包含已排序的数据。这个程序应该是灵活的,因为可以有1000个不同的产品ID或400个不同的产品ID。下面的代码是我到目前为止所拥有的。。。但是它有很多问题,我缺乏java知识,这让我很沮丧 第一个for循环没有继续,它停留在r=1,尽管第二个for循环继续
..105029..15
102930….9
203911…29
..105029..4
其中,我需要将每个产品ID的产品销售总数相加,然后创建一个新文件,其中包含已排序的数据。这个程序应该是灵活的,因为可以有1000个不同的产品ID或400个不同的产品ID。下面的代码是我到目前为止所拥有的。。。但是它有很多问题,我缺乏java知识,这让我很沮丧 第一个for循环没有继续,它停留在r=1,尽管第二个for循环继续
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class Read {
public static void readXLSFile() throws IOException{
InputStream ExcelFile = new FileInputStream("C:/Sales Data.xls");
HSSFWorkbook wb = new HSSFWorkbook(ExcelFile);
HSSFSheet sheet=wb.getSheetAt(0);
int numRows = sheet.getPhysicalNumberOfRows();
//to intialize an array
int[]idAccum = new int[numRows];
//holds the product id
int[]saleAccum = new int[numRows];
//holds the total sales per product ID
for(int r=1;r<=numRows;r++){
//iterates through the product ID and matching sales
for(int j=r+1;j<numRows+1; j++){
HSSFCell rows = sheet.getRow(r).getCell(1);
HSSFCell cells = sheet.getRow(r).getCell(2);
HSSFCell rows1 = sheet.getRow(j).getCell(1);
HSSFCell cells1 = sheet.getRow(j).getCell(2);
if(rows==rows1){
//compares product ids
idAccum[r]=rows1.getNumericCellValue();
//places product id in element r if rows and rows1 match
saleAccum[r]+=cells.getNumericCellValue();
//adds number of items sold to corresponding product ID
}
}
System.out.println(idAccum[r]);
System.out.println(saleAccum[r]);
}
}
public static void main(String[] args) throws IOException {
readXLSFile();
}
}
import java.io.FileInputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入org.apache.poi.hssf.usermodel.HSSFCell;
导入org.apache.poi.hssf.usermodel.HSSFSheet;
导入org.apache.poi.hssf.usermodel.HSSFWorkbook;
公开课阅读{
公共静态void readXLSFile()引发IOException{
InputStream ExcelFile=新文件InputStream(“C:/Sales Data.xls”);
HSSF工作手册wb=新的HSSF工作手册(Excel文件);
HSSFSheet sheet=wb.getSheetAt(0);
int numRows=sheet.getPhysicalNumberOfRows();
//初始化数组的步骤
int[]idAccum=新的int[numRows];
//保存产品id
int[]salaccum=新int[numRows];
//保存每个产品ID的总销售额
对于(int r=1;r您有一个off by one错误:r
上升到numRows
,而j
从r+1
开始–在最后一次迭代中是numRows+1
。由于该行中没有内容,getCell(…)
在它上面将返回null
(根据API定义)。这就是NullPointerException
的来源
改变
for(int r=1;r<=numRows;r++){
for(int r=1;r在Read.readXLSFile(Read.java:29)和Read.main(Read.java:45)的线程“main”java.lang.NullPointerException中放置要获取的异常Java结果:1我不知道问题出在哪里,因为我不确定第29行中的内容,但是,if rows==Rows1语句无效,因为您可能正在比较cells对象,而不一定是值。为什么不使用getNumericCellValue获取值,然后使用equals进行比较?您应该分两步执行,1/读取整个s使用地图数据,一行一行地记录和汇总地图中的“销售”数量(key=id,value=sum;番石榴Multiset
也有效)2/使用地图数据。即使你的NPE得到了修复,我担心ArrayOutOfBoundException
s和糟糕的结果(如果你有3次id,第二次出现的情况会用你的代码汇总两次)。作为旁注,对于java中的对象(而不是==
)始终使用equals
。哪一个是第29行?
for(int r=1;r<numRows;r++){