java 中创建Vector二维数组添加一维Vector的问题

 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变量所指向的数组也为空。

 

posted @ 2013-04-24 11:19  薛遗山  阅读(1837)  评论(0编辑  收藏  举报