JasperDesign jasperDesign= JRXmlLoader.load(ireportPath);//因为还是添加元素进去,所以还只是jrxml文件
Integer pageWidth = 0;
if(100*serchColumns.size()>=600){
pageWidth = 100*serchColumns.size()+100;
} else {
pageWidth = 600;
}
Integer pageHeight = 35*customReports.size()+160;
//然后设置报表的长度和高度(针对分页的每页的高度)
jasperDesign.setPageWidth(pageWidth);
jasperDesign.setPageHeight(pageHeight);
//接着动态生成表名:
//表头title
JRDesignBand title = (JRDesignBand)jasperDesign.getTitle();
JRDesignStaticText titleStaticText = new JRDesignStaticText();
titleStaticText.setPdfEncoding("UniGB-UCS2-H");
titleStaticText.setPdfFontName("STSong-Light");
titleStaticText.setHorizontalAlignment(HorizontalAlignEnum.CENTER);
titleStaticText.setVerticalAlignment(VerticalAlignEnum.MIDDLE);
titleStaticText.setFontSize(14);
titleStaticText.setHeight(34);
titleStaticText.setWidth(pageWidth);
titleStaticText.setFontName("SansSerif");
titleStaticText.setBold(true);
titleStaticText.setText("自定义统计报表");
title.addElement(titleStaticText);
//再来动态生成列头和记录
//列头和记录
JRDesignBand columnHeader = (JRDesignBand)jasperDesign.getColumnHeader();//列头
JRSection detail = jasperDesign.getDetailSection();//详细记录
JRDesignBand jRDesignBand = (JRDesignBand)detail.getBands()[0];
//需要先定义变量,好为后面jaspertsoft能够自动填充数据。name其实就是属性名,valueClass是对应的对象类型如String.class
if(null != serchColumns
&& serchColumns.size()>0){
Iterator<Entry<String,String>> serchIte = serchColumns.entrySet().iterator();
int strIndex = 0;
while(serchIte.hasNext()){
Entry<String,String> serchEntry = serchIte.next();
String serchKey = serchEntry.getKey();
String serchValue = serchEntry.getValue();
String detailFieldKey = "attribute"+serchKey.toLowerCase();
/**列属性**/
JRDesignField field = new JRDesignField();
field.setName(detailFieldKey);
field.setValueClass(java.lang.String.class);
jasperDesign.addField(field);
/**列头**/
JRDesignStaticText jDesignStaticText = new JRDesignStaticText();
jDesignStaticText.setWidth(100);
jDesignStaticText.setHeight(34);
jDesignStaticText.setPdfFontName("STSong-Light");
jDesignStaticText.setText(serchValue);
jDesignStaticText.setBackcolor(new Color(153,204,255));
jDesignStaticText.setPdfEncoding("UniGB-UCS2-H");
jDesignStaticText.setHorizontalAlignment(HorizontalAlignEnum.CENTER);
jDesignStaticText.setVerticalAlignment(VerticalAlignEnum.MIDDLE);
jDesignStaticText.setX(100 * strIndex);
jDesignStaticText.setY(0);
columnHeader.addElement(jDesignStaticText);
//详细记录
JRDesignTextField jRDesignTextField = new JRDesignTextField();
jRDesignTextField.setPdfEncoding("UniGB-UCS2-H");
jRDesignTextField.setWidth(100);
jRDesignTextField.setHeight(34);
jRDesignTextField.setPdfFontName("STSong-Light");
jRDesignTextField.setVerticalAlignment(VerticalAlignEnum.MIDDLE);
jRDesignTextField.setHorizontalAlignment(HorizontalAlignEnum.CENTER);
jRDesignTextField.setX(100 *strIndex);
jRDesignTextField.setY(0);
jRDesignTextField.setBlankWhenNull(true);
jRDesignTextField.setStretchWithOverflow(true);
jRDesignTextField.setPrintRepeatedValues(true);
jRDesignTextField.setStretchType(StretchTypeEnum.RELATIVE_TO_TALLEST_OBJECT);
JRDesignExpression expression = new JRDesignExpression();
expression.setText("$F{"+detailFieldKey+"}");
expression.setValueClass(java.lang.String.class);//然后这里是对应的对象类型
jRDesignTextField.setExpression(expression);
jRDesignBand.addElement(jRDesignTextField);
strIndex++;
}
}
/***设置页尾,在这里是页码的位置:
* **/
JRDesignBand pageFooter = (JRDesignBand)jasperDesign.getPageFooter();
JRElement[] elements = pageFooter.getElements();
if(null != elements
&& elements.length>0){
JRDesignTextField pageFooter1 = (JRDesignTextField)elements[0];
if(pageWidth>600){
pageFooter1.setWidth(pageWidth);
pageFooter1.setX(0);
}
pageFooter1.setHeight(34);
pageFooter1.setHorizontalAlignment(HorizontalAlignEnum.RIGHT);
pageFooter1.setVerticalAlignment(VerticalAlignEnum.MIDDLE);
}
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);//编译jrxml文件
return jasperReport;