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