Java ApachePOI获取读取xls文件的NPE

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循环继续

我正在尝试将一个XLS文件读入java,看起来像这样

A列|产品ID |销售编号
..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++){