2015-05-05 26 views
0

我正在从Excel文件导入数据到Java JTable。我可以导入所有工作表,但我只想导入一些行。这是我用来导入工作表的代码:如何在Java上的JTable中填充一些Excel行?

private void remplirtable(JTable table, int numfeuil,String s) { 

     Workbook wb; 
     File fichier = new File(s); 
     try { 
      //création de la table et importation du fichier 
        wb = Workbook.getWorkbook(fichier); 
      Sheet sheet = wb.getSheet(numfeuil); 
      String[] columnsnames=new String[sheet.getColumns()]; 
      DefaultTableModel model = new DefaultTableModel(); 
      //Remplir la table désignée 
         table.setModel(model); 
      int colonnes = sheet.getColumns(); 
      int lignes = sheet.getRows(); 
      Object data[] = new Object[colonnes]; 
      for (int i=0; i<lignes; i++){ 
       for (int j=0; j<colonnes; j++){ 
       if (i==0) 
        { 
         //Component c=super.prepareRenderer(renderer, j, i); 
         model.addColumn(sheet.getCell(j,i).getContents()); 

        } 
        //System.out.println(sheet.getCell(j,i).getContents()); 
        if(i>=1) 
         data[j]=sheet.getCell(j,i).getContents(); 

       }model.addRow(data); 
      }model.removeRow(0); 
     } catch (BiffException | IOException e) { 
     } 

    } 

为了只导入行(3,4,5),我使用了这段代码。 A是我们存储行数的阵列:

private void RemplirPostes(JTable table, int numfeuil,String s,int[] A) { 
     Workbook wb; 
     File fichier = new File(s); 
     try { 
      //création de la table et importation du fichier 
        wb = Workbook.getWorkbook(fichier); 
      Sheet sheet = wb.getSheet(numfeuil); 
      DefaultTableModel model = new DefaultTableModel(); 
      //Remplir la table désignée 
         table.setModel(model); 
      int colonnes = sheet.getColumns(); 
       Object data[] = new Object[colonnes]; 

         for(int k=0;k<A.length;k++) 
          { 
           for (int j=0; j<colonnes; j++){ 
           if (A[k]==0) 
        { 
         //Component c=super.prepareRenderer(renderer, j, i); 
       model.addColumn(sheet.getCell(j,A[k]).getContents()); 

        } 
        //System.out.println(sheet.getCell(j,i).getContents()); 
        if(A[k]>=1) 

         data[j]=sheet.getCell(j,A[k]).getContents(); 

       }model.addRow(data); 
           } 
      model.removeRow(0); 

       } catch (BiffException | IOException e) { 
     } 

    } 

而这一切都不起作用。

+1

'而这一切并不work.'你能解释一下?那它不起作用呢?它是否编译?胡作非为?例外(我不会推荐_swallowing_他们 - 至少做一些事情,比如打印堆栈跟踪:catch(BiffException | IOException e){e.printStackTrace();}')? – copeg

+0

@copeg首先我想知道我的代码是否是逻辑的,其次是警告:警告:无法读取LineEot的名称范围 - 设置为空警告:无法读取LineEot的名称范围 - 设置为空java.lang.NumberFormatException:空字符串 – user4830457

回答

1

从这个完整example开始,下面的代码创建具有COLUMNSMIN_ROW指定数目的一个表来MAX_ROW,包括端值。

view formula

private static final int COLUMNS = 4; 
private static final int MIN_ROW = 3; 
private static final int MAX_ROW = 5; 
… 
DataFormatter format = new DataFormatter(); 
DefaultTableModel model = new DefaultTableModel(0, COLUMNS); 
for (Row row : sheet) { 
    if (row.getRowNum() >= MIN_ROW && row.getRowNum() <= MAX_ROW) { 
     Vector rowData = new Vector(); 
     for (Cell cell : row) { 
      rowData.add(format.formatCellValue(cell)); 
     } 
     model.addRow(rowData); 
    } 
} 
… 
JFrame f = new JFrame("TableTest"); 
f.add(new JTable(model)); 

附录:看你目前的做法更接近,你可能要适应非连续行。这可能有助于用List<Integer>替换您的阵列。然后,您可以在上面到位谓词的使用:

if (a.contains(row.getRowNum()) {…} 

附录:评价公式,你可以传递一个FormulaEvaluatorformatCellValue()

view evaluated

FormulaEvaluator eval = book.getCreationHelper().createFormulaEvaluator(); 
… 
rowData.add(format.formatCellValue(cell, eval)); 
+0

用此代码我得到这个错误:for-each不适用于表达式类型所需的数组或java.land.Iterable,找到:sheetat这一行:for(Row row:sheet)。 – user4830457

+0

将您的导入与[引用示例](http://stackoverflow.com/a/3562214/230513)中的导入进行比较。 – trashgod