我试图利用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/