0

I'm working on importing data from an Excel file into a Java JTable. I can import all the sheet, but I want to import only some rows. This is the code I'm using to import the sheet:

 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) {
        }

    }

In order to import only the rows (3,4,5), I used this code. A is the array in which we stock the rows numbers:

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) {
        }

    }

And all this doesn't work.

trashgod
  • 203,806
  • 29
  • 246
  • 1,045
  • 1
    `And all this doesn't work.` Can you elaborate? What about it doesn't work? Does it compile? Misbehave? Exceptions (I would not recommend _swallowing_ them - at least do something, like print out the stack trace: `catch (BiffException | IOException e) {e.printStackTrace();}`)? – copeg May 05 '15 at 16:49
  • @copeg First I wonder if my code is logic, and second these are warnings:Warning: Cannot read name ranges for LineEot - setting to empty Warning: Cannot read name ranges for LineEot - setting to empty java.lang.NumberFormatException: empty String – user4830457 May 05 '15 at 19:54

1 Answers1

1

Starting from this complete example, the following code creates a table having the indicated number of COLUMNS from MIN_ROW to MAX_ROW, inclusive.

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) {
        List<String> rowData = new ArrayList();
        for (Cell cell : row) {
            rowData.add(format.formatCellValue(cell));
        }
        model.addRow(rowData.toArray(new String[0]));
    }
}
…
JFrame f = new JFrame("TableTest");
f.add(new JTable(model));

Addendum: Looking closer at your current approach, you may want to accommodate non-contiguous rows. It may help to replace your array with a List<Integer>. You can then use contains() in place of the predicate above:

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

Addendum: To evaluate formulae, you can pass a FormulaEvaluator to formatCellValue().

view evaluated

FormulaEvaluator eval = book.getCreationHelper().createFormulaEvaluator();
…
rowData.add(format.formatCellValue(cell, eval));
trashgod
  • 203,806
  • 29
  • 246
  • 1,045
  • with this code I got this error : for-each not applicable to expression type required array or java.land.Iterable, found: sheetat this line : for (Row row : sheet). – user4830457 May 05 '15 at 20:26
  • Compare your imports to those in the [example cited](http://stackoverflow.com/a/3562214/230513). – trashgod May 05 '15 at 20:27