DynamicReports - источник данных заполнен только один столбец?

Я получил небольшой проект, который требует DynamicReport. Я получил отчет, чтобы получить n-количество столбцов и n-количество строк, но проблема в том, что выходные данные заполняют только 1 столбец всеми данными из источника данных. Как я могу это исправить?

public void raports(){

        //get table Data
        DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
        int mColumns = model.getColumnCount();
        int mRows = model.getRowCount();
        String[] arrColumns = new String[mColumns];

        //store the column names into the array
        for(int i=0; i<mColumns; i++){
            arrColumns[i] = model.getColumnName(i);
        }

        JasperReportBuilder report = DynamicReports.report();//a new report
        TextColumnBuilder[] tcb = new TextColumnBuilder[mColumns];

        //create columns
        for (int i=0; i< mColumns; i++) {
            if(i==0){
                tcb[i] = Columns.column(arrColumns[i]+" hello"+i ,arrColumns[i],DataTypes.stringType()).setHorizontalAlignment(HorizontalAlignment.LEFT);
            }else if(i+1==mColumns){
                tcb[i] = Columns.column(arrColumns[i]+" hello"+i ,arrColumns[i],DataTypes.stringType()).setHorizontalAlignment(HorizontalAlignment.LEFT);
            }else{
                tcb[i] = Columns.column(arrColumns[i]+" hello"+i ,arrColumns[i],DataTypes.stringType());
            }

        }

        //create an empty datasource
        DRDataSource dataSource = new DRDataSource(arrColumns);

        //fill the datasource with information
        for (int i = 0; i < mRows; i++) {
            for (int j = 0; j<mColumns; j++){
                dataSource.add(model.getValueAt(i, j).toString());
            }
        }

        StyleBuilder boldStyle = stl.style().bold();  
        StyleBuilder titleStyle = stl.style(boldCenteredStyle)
                .setVerticalAlignment(VerticalAlignment.MIDDLE)
                .setFontSize(15);
        StyleBuilder boldCenteredStyle = stl.style(boldStyle)
                .setHorizontalAlignment(HorizontalAlignment.CENTER);
        StyleBuilder columnTitleStyle  = stl.style(boldCenteredStyle)
                .setBorder(stl.pen1Point())
                .setBackgroundColor(Color.LIGHT_GRAY);

        report
                .setColumnTitleStyle(columnTitleStyle)
                .highlightDetailEvenRows() 
                .columns(tcb)
                .setDataSource(dataSource)
                .title(
                    cmp.horizontalList()
                    .add(
                    cmp.image("C:\\Users\\Innocentus\\Documents\\NetBeansProjects\\JavaApplication9\\src\\seal.png").setFixedDimension(80, 80),
                    cmp.text("School Health \n Services").setStyle(titleStyle).setHorizontalAlignment(HorizontalAlignment.LEFT),
                    cmp.text("Patient List").setStyle(titleStyle).setHorizontalAlignment(HorizontalAlignment.RIGHT))
                    .newRow()
                    .add(cmp.filler().setStyle(stl.style().setTopBorder(stl.pen2Point())).setFixedHeight(10))
                )
                .pageFooter(cmp.pageXofY().setStyle(boldCenteredStyle))
                .pageFooter(Components.pageXofY());
        try {
            report.show();//show the report
            report.toPdf(new FileOutputStream("C:\\Users\\Innocentus\\Documents\\NetBeansProjects\\JavaApplication9\\src\\report.pdf"));//export the report to a pdf file
        } catch (DRException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

JTable:

+-----------------------------------+
|Title 1 |Title 2 |Title 3 |Title 4 |
+-----------------------------------+
|a       |b       |c       |d       |
|e       |f       |g       |h       |
|i       |j       |k       |l       |
|m       |o       |o       |p       |
+-----------------------------------+

Вот картинка

1 ответ

Цикл for для добавления данных в источник данных неверен, поскольку он явно добавляет все значения в один столбец. Замените цикл for следующим образом:

String[] arr = new String[mColumns];

for (int i = 0; i < mRows; i++) {
                for (int j = 0; j<mColumns; j++){
                    arr[j] = model.getValueAt(i, j).toString();

                }
                dataSource.add(arr);
            }

В приведенном выше коде мы добавляем значения всех столбцов строки в массив строк и добавляем этот список значений столбцов в источник данных этой строки. Надеюсь, это поможет.

Другие вопросы по тегам