在单列-Java中读取包含多个值的Excel文件

时间:2016-05-06 08:46:29

标签: java excel apache-poi

我正在使用Apache POI阅读Excel文件。 我的Excel表结构就像这样

|2000s| 2001, 2003, 2008, 2009|

所以对于右侧数据,我要求它分配到2000s

直到现在我已经实现了这个方式:

List<Class> list = new ArrayList<Class>();
        File file = new File(file_path);
        FileInputStream fis = new FileInputStream(file);

        //Create an instance of workbook which refers to an excel file
        XSSFWorkbook wb = new XSSFWorkbook(fis);

        //This selects the 1st sheet 
        XSSFSheet sheet =  wb.getSheetAt(0);

        //Iterate through each row one by one
        Iterator<Row> itr = sheet.iterator();
        String newName = null; 
        String oldName = null;


        while(itr.hasNext()){
            Row nextRow = itr.next();
            // For each row, iterate through all the columns
            Iterator<Cell> cellIterator = nextRow.cellIterator();
            while (cellIterator.hasNext()) 
            {
                Cell cell = cellIterator.next();

                newName =  nextRow.getCell(0).toString();

                if(nextRow.getCell(1).toString().contains(",")){
                    StringTokenizer st = new StringTokenizer(nextRow.getCell(1).toString(),",");
                    while(st.hasMoreTokens()){
                        oldName = st.nextToken();
                    }
                }
                else{
                     oldName = nextRow.getCell(1).toString();
                }
            }

            System.out.println();
        }   

当我编译时,它会抛出我&#34;空指针异常&#34;在nextRow.getCell(1)行。

我不明白如何将所有逗号值映射到2000s。

这对于普通数据(没有逗号)非常有效。

1 个答案:

答案 0 :(得分:0)

已处理逗号值

我发布了答案,所以有人可以从这里得到帮助。

我所做的是 - 添加了String Tokenizer类,如果单元格中有逗号,它会用逗号分隔符破坏该值。

让我们看看下面的代码

 while(itr.hasNext()){
            Row nextRow = itr.next();
            // For each row, iterate through all the columns
            Iterator<Cell> cellIterator = nextRow.cellIterator();
            while (cellIterator.hasNext()) 
            {
               Cell cell = cellIterator.next();

                newName =  nextRow.getCell(0).toString();

                if(nextRow.getCell(1).toString().contains(",")){
                    StringTokenizer st = new StringTokenizer(nextRow.getCell(1).toString(),",");
                    while(st.hasMoreTokens()){
                        oldName = st.nextToken();
                    }
               }
                else{
                     oldName = nextRow.getCell(1).toString();
                    }
            }
            System.out.println();
        }

此处 newName 获取1st col。的值(2000s) 和 oldName 根据','分隔符获取令牌 - 在这种情况下2001,2003,2008,2009

对于 oldName 的所有这些值, newName 2000s将被映射。

更新:原因我得到'空指针异常',因为第二列(nextRow.getCell(1))的某些单元格为空。

因此,只要迭代器到达空单元格,它就会抛出Null Pointer Exception。 您需要在此处指定缺少单元格政策

通过

Cell cell2 = row.getCell(j,org.apache.poi.ss.usermodel.Row.CREATE_NULL_AS_BLANK);

(它只是将空值视为空白)

通过这种方式,您还可以在读取空值时解析Excel中的空指针异常