直接上代碼
package com.report;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRMapCollectionDataSource;
import net.sf.jasperreports.engine.design.JRDesignBand;
import net.sf.jasperreports.engine.design.JRDesignExpression;
import net.sf.jasperreports.engine.design.JRDesignField;
import net.sf.jasperreports.engine.design.JRDesignStaticText;
import net.sf.jasperreports.engine.design.JRDesignTextField;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
public class DynamicIreport {
public static void main(String[] args) throws JRException {
report();
}
@SuppressWarnings("deprecation")
public static void report() throws JRException{
int randomNum = new Random().nextInt(20);
String jrxmlPath ="D:\\workspace\\iReportTestAndJfreeChart\\report\\report1.jrxml";
JasperDesign jasperDesign= JRXmlLoader.load(jrxmlPath);//因為還是添加元素進去,是以還隻是jrxml檔案
JRDesignBand columnHeaderBand = (JRDesignBand )jasperDesign.getColumnHeader();//擷取ColumnHeader攔
JRDesignBand detailBand = (JRDesignBand )jasperDesign.getDetail();//擷取Detail攔
JRDesignTextField detailField= (JRDesignTextField )detailBand.getElementByKey("detail");
JRDesignStaticText columnHeaderField = (JRDesignStaticText)columnHeaderBand.getElementByKey("header");
columnHeaderBand.removeElement(columnHeaderField);
detailBand.removeElement(detailField);//得到對象之後 将其從xml的檔案中移除
Map<String,Object> map = new HashMap<String, Object>();
List< Map<String,Object>> list = new ArrayList< Map<String,Object>>();
//根據随即生成的數進行動态添加列
for(int i=0,y=3;i<=randomNum;i++,y++){
String detailFieldKey = "detail"+y;
//String columnHeaderFieldKey = "staticText-"+y+1;
map.put(detailFieldKey,y);
//map.put(columnHeaderFieldKey,"列"+y);
JRDesignField jRDesignField= new JRDesignField();
jRDesignField.setName(detailFieldKey);
jRDesignField.setValueClass(java.lang.String.class);
jasperDesign.addField(jRDesignField);
detailField= (JRDesignTextField)detailField.clone();
detailField.setX(i*60);
JRDesignExpression expression = new JRDesignExpression();
expression.setText("$F{"+detailFieldKey+"}");
expression.setValueClass(java.lang.String.class);
detailField.setExpression(expression);
detailBand.addElement(detailField);
columnHeaderField = (JRDesignStaticText)columnHeaderField.clone();
columnHeaderField.setX(i*60);
columnHeaderField.setText("列"+y);
columnHeaderBand.addElement(columnHeaderField);
}
list.add(map);
JRDataSource jRDataSource = new JRMapCollectionDataSource(list); // 資料集
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);//編譯jrxml檔案
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,null,jRDataSource); //填充列印
JasperExportManager.exportReportToPdfFile(jasperPrint,"D:\\workspace\\iReportTestAndJfreeChart\\report\\test.pdf");
}
}