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);
}
В приведенном выше коде мы добавляем значения всех столбцов строки в массив строк и добавляем этот список значений столбцов в источник данных этой строки. Надеюсь, это поможет.