2015-08-31 3 views
1

Я пытаюсь прочитать файл XLS в Java, который выглядит примерно такApache POI получает чтение NPE XLS файл

Column A|Product ID|Number Sold
.................|105029 ....|15
.................|102930 ....|9
.................|203911 ....|29
.................|105029 ....|4

где мне нужно, чтобы сложить общее количество продаваемого продукта для каждого продукта ID а затем создайте новый файл с отсортированными данными. Эта программа должна быть гибкой, так как в ней может быть 1000 различных идентификаторов продукта или 400. Код ниже - это то, что у меня есть до сих пор ... но есть немало проблем с этим, и моя нехватка знаний Java делает это действительно разочаровывает.

Первый цикл цикла не продолжается, он застревает при r = 1, хотя второй цикл продолжается.

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(); 

      } 
} 

Но я получаю nullpointExceptions.

Exception in thread "main" java.lang.NullPointerException
at Read.readXLSFile(Read.java:29)
at Read.main(Read.java:45)
Java Result: 1

+0

Сообщения исключения вы получаете – Koby

+0

исключения в потоке «главный» java.lang.NullPointerException \t в Read.readXLSFile (Read.java:29) \t at Read.main (Read.java:45) Java Результат: 1 – Jnewbie

+0

Не знаю, в чем проблема, так как я не уверен, что в строке 29, если строки if == rows1statement недействительны, вы можете сравнивать объекты ячеек и не обязательно значения. Почему бы не получить значения с помощью getNumericCellValue, а затем сравнить их с помощью equals? – Koby

ответ

3

У вас ошибка вне по-одному: r идет до numRows и j начинается в r + 1 - что во время последней итерации numRows + 1. Поскольку в этой строке нет содержимого, getCell(…) вернет null (согласно определению API). Вот откуда и начинается NullPointerException.

Изменить

for(int r=1;r<=numRows;r++){ 

в

for(int r=1;r<numRows;r++){ 

, чтобы избавиться от ошибки. Кроме того, защитное программирование (т.е. проверка getCell(…) результатов для null является хорошей идеей.

Смежные вопросы