POI擅长2D阵列

时间:2014-05-21 09:22:33

标签: java apache-poi

我正在尝试使用Apache POI来读取excel文件并将其转换为二维对象数组。附件是代码部分。

   public class ImportUtil {

    public static DefaultTableModel importFromFile(File f) {
        DefaultTableModel tableModel = null;
        try {
            FileInputStream file = new FileInputStream(f);
            XSSFWorkbook workbook = new XSSFWorkbook(file);
            XSSFSheet sheet = workbook.getSheetAt(0);
            Iterator<Row> rowIterator = sheet.iterator();
            List<Object> columnNames = new ArrayList<Object>();
            Vector<Object> cellVals = new Vector<Object>();
            Vector<Vector<Object>> tempData = new Vector<Vector<Object>>();
            while(rowIterator.hasNext()){
                //cellVals.clear();
                cellVals.clear();
                Row row = rowIterator.next();
                Iterator<Cell> cellIterator = row.cellIterator();
                /*
                 * Treat first row in excel file as column names, column names are assumed to be of type String 
                 */
                if(row.getRowNum()==0){
                    while(cellIterator.hasNext()){
                        Cell cell = cellIterator.next();
                        columnNames.add(cell.getStringCellValue());
                    }
                }else{
                    while(cellIterator.hasNext()){
                        Cell cell = cellIterator.next();
                        switch (cell.getCellType()) {
                        case Cell.CELL_TYPE_NUMERIC:
                            if(DateUtil.isCellDateFormatted(cell)){
                                cellVals.add(cell.getDateCellValue());
                            }else{
                                cellVals.add(cell.getNumericCellValue());
                            }
                            break;
                        case Cell.CELL_TYPE_STRING:
                            cellVals.add(cell.getStringCellValue());
                            break;
                        default:
                            System.out.print("Unhanlded Type." + "\t\t\t");
                            break;
                        }
                    }
                    System.out.println(cellVals);
                    tempData.add(cellVals);

                }
            }
            file.close();
            Object[][] modelData = VectorToArray.to2DArray(tempData);
            for(int i=0;i<modelData.length;i++){
            for(int j=0;j<modelData[i].length;j++){
                    System.out.print(modelData[i][j]);
                }
                System.out.println("");
            }
            tableModel = new DefaultTableModel(modelData, columnNames.toArray());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return tableModel;
    }
}

class VectorToArray{
    public static Object[][] to2DArray(Vector<Vector<Object>> v){
        Object[][] out = new Object[v.size()][0];
        for(int i=0;i<out.length;i++){
            out[i] = ((Vector<Object>)v.get(i)).toArray();
        }
        return out;
    }
}

代码编译,但它没有正常运行。 当我打印包含一行数据的cellVals时,它是正确的。 但是这一节:

    Object[][] modelData = VectorToArray.to2DArray(tempData);
    for(int i=0;i<modelData.length;i++){
        for(int j=0;j<modelData[i].length;j++){
            System.out.print(modelData[i][j]);
        }
        System.out.println("");
    }

打印Excel工作表中的最后一行。我无法弄明白。任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:2)

如果我没有弄错,当你将一个元素添加到一个不“复制”该元素的列表时,它会采用相同的引用。因此,当您执行tempData.add(cellVals)然后清除cellVals时,将清除您刚添加的那个。这就是为什么你最终只得到tmpList中的最后一个CellVals。

而不是清除列表尝试创建一个新的并填充它。

答案 1 :(得分:0)

通过在不同位置声明cellVals来解决问题。

if(row.getRowNum==0){
}
else{
   Vector<Object> cellVals = new Vector<Object>();
}

在解决方案1(不正确)中,我首先声明cellVals并使用cellVals.clear()清除上一行的内容。 在解决方案2中(似乎是正确的),我在需要时声明了一个新的cellVals。