Как да попълня някои редове на Excel в JTable на Java?

Работя върху импортирането на данни от Excel файл в Java JTable. Мога да импортирам целия лист, но искам да импортирам само някои редове. Това е кодът, който използвам за импортиране на листа:

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

    }

И всичко това не работи.


person user4830457    schedule 05.05.2015    source източник
comment
And all this doesn't work. Можете ли да уточните? Какво ще кажеш, че не работи? Компилира ли се? да се държа лошо? Изключения (не бих препоръчал да ги поглъщате - поне направете нещо, като отпечатайте проследяването на стека: catch (BiffException | IOException e) {e.printStackTrace();})?   -  person copeg    schedule 05.05.2015
comment
@copeg Първо се чудя дали моят код е логичен, и второ, това са предупреждения: Предупреждение: Не могат да се четат диапазони от имена за LineEot - празна настройка Предупреждение: Не могат да се четат диапазони от имена за LineEot - празна настройка java.lang.NumberFormatException: празен низ   -  person user4830457    schedule 05.05.2015


Отговори (1)


Започвайки от този пълен пример, следният код създава таблица с посочения номер COLUMNS от MIN_ROW до MAX_ROW включително.

преглед на формула

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>. След това можете да използвате contains() на мястото на предиката по-горе:

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

Допълнение: За да оцените формули, можете да подадете FormulaEvaluator до formatCellValue().

преглед на оценката

FormulaEvaluator eval = book.getCreationHelper().createFormulaEvaluator();
…
rowData.add(format.formatCellValue(cell, eval));
person trashgod    schedule 05.05.2015
comment
с този код получих тази грешка: for-each неприложимо към тип израз изисква масив или java.land.Iterable, намерени: sheetat този ред: for (Row row: sheet). - person user4830457; 05.05.2015
comment
Сравнете вашите импортирания с тези в цитирания пример. - person trashgod; 05.05.2015