我正在尝试使用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工作表中的最后一行。我无法弄明白。任何建议都表示赞赏。
答案 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。