//创建对工作薄文件的引用
HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(file));
//创建对工作表的引用
HSSFSheet sheet = workbook.getSheetAt(0);
HSSFRow row;
//获取表格的行数
int rows = sheet.getPhysicalNumberOfRows();
Vector<String> tabletmp = new Vector<>();
Vector<Vector<String>> tableAllData = new Vector<>();
for (int r=0; r<rows; r++){
//获取单元格中指定的行对象
row = sheet.getRow(r);
if(row != null){
int cells = row.getPhysicalNumberOfCells();
//读取r行的内容*****************
for(short c=0; c<cells; c++){
HSSFCell cell = row.getCell((short)c);
if(cell != null){
if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING){
tabletmp.add(cell.getStringCellValue());
}else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
tabletmp.add(cell.getNumericCellValue() + "");
}
}
}
tableAllData.add(tabletmp);
tabletmp.removeAllElements();
}
}
tablePane.addExcel(tableAllData);
这段代码的功能是:读取一个excel表格,并且将表格里的内容添加到二维数组tableAllData变量里面。
看起来没有什么错误,但是实际上运行之后我才发现tableAllData里面的数据全为空。让我百思不得其解。后来我安装书上的方式将tabletmp变量的声明放到循环里才将问题搞定。代码如下:
//创建对工作薄文件的引用
HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(file));
//创建对工作表的引用
HSSFSheet sheet = workbook.getSheetAt(0);
HSSFRow row;
//获取表格的行数
int rows = sheet.getPhysicalNumberOfRows();
for (int r=0; r<rows; r++){
//获取单元格中指定的行对象
row = sheet.getRow(r);
Vector<String> tabletmp = new Vector<>();
if(row != null){
int cells = row.getPhysicalNumberOfCells();
//读取r行的内容*****************
for(short c=0; c<cells; c++){
HSSFCell cell = row.getCell((short)c);
if(cell != null){
if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING){
tabletmp.add(cell.getStringCellValue());
}else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
tabletmp.add(cell.getNumericCellValue() + "");
}
}
}
tableAllData.add(tabletmp);
}
}
tablePane.addExcel(tableAllData);
想一想,我终于明白为什么了。tableAllData.add(tabletmp) 这段代码只是添加了tabletmp变量的引用,也就是C里面说的指针。tableAllData内所存的数据与tabletmp所存的数据都在同一地址单元内。接下来的这段代码tabletmp.removeAllElements(); 将tabletmp内的数据清空,那么同时tableAllData变量所指向的数组也为空。