我试图利用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工作表中的最后一行。我不知道。任何建议表示赞赏。

最佳答案

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

与其清除列表,不如尝试创建一个新列表并填写它。

关于java - POI擅长转换成2D阵列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23779041/

10-12 04:35