Jasperreport的文檔表明:
1> 開發靜态報表建議采納模闆方式
2> 開發動态報表采用直接編輯JasperDesign對象。
但是似乎jasperreport對動态報表的操作缺乏高效率的工具類,因而開發
起來特别的費勁。
經過多方研究,得到了2種解決方案:
1> 結合Velocity技術動态生成jrxml模闆檔案;
2> 采用第三方工具DynamicJasper:DynamicJasper是sourceforge上的一個
開源項目,把它與jasperreport內建,可以相對輕松的解決大多數動态報表問題,
并且為進一步開發使用者自定義報表提供了有效途徑。
我采用的是第二種方案。
jasperreports是一個用來開發報表的元件,通常和ireport來配合使用,可以快速的建構出漂亮的報表。但是ireport畫出的報表模闆過于死闆,就是不支援動态的列。現在要自己實作一個報表模闆,先參考ireport工具畫出的模闆,然後改改,用java代碼自己實作一個。
項目組目前就是這麼做的,自己去寫一個模闆,一個橫排的,一個豎排的,應為字段比較多,一般采用豎排的。我們項目組做動态報表沒有用DynamicJasper這個開源的動态報表的元件,原因是我覺得他用起來也不太友善。還有就是時間的問題。
做了兩個模闆,現在備份下來。首先是橫排的模闆
package cn.hzmc.dynamicreport.example7;
import java.awt.Color;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRAlignment;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRReport;
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.base.JRBaseLine;
import net.sf.jasperreports.engine.base.JRBasePrintText;
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.JRDesignLine;
import net.sf.jasperreports.engine.design.JRDesignQuery;
import net.sf.jasperreports.engine.design.JRDesignStaticText;
import net.sf.jasperreports.engine.design.JRDesignStyle;
import net.sf.jasperreports.engine.design.JRDesignTextField;
import net.sf.jasperreports.engine.design.JasperDesign;
import com.capaa.pipe.config.ReadConfig;
class Sample6 {
@SuppressWarnings("deprecation")
Sample6() throws Exception {
Connection connection = getConnection();
JasperDesign jasperDesign = new JasperDesign();
JRDesignStyle normalStyle = setReportSytle(jasperDesign);
JRDesignQuery query = new JRDesignQuery();
query.setText("select userid,name,age,sex,password,department from person");
jasperDesign.setQuery(query);
//addReportFiled(jasperDesign);
// Title
JRDesignBand band = new JRDesignBand();
band.setHeight(20);
JRDesignStaticText staticText = new JRDesignStaticText();
staticText.setX(200);
staticText.setY(0);
staticText.setWidth(200);
staticText.setHeight(15);
staticText.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_RIGHT); //設定文本的對齊方式
staticText.setStyle(normalStyle);
staticText.setText("杭州美創科技有限公司審計報表 ");
band.addElement(staticText);
JRDesignLine line = new JRDesignLine();
line.setX(0);
line.setY(19);
line.setWidth(500);
line.setHeight(1);
line.setForecolor(new Color(0x99,0xFF,0xFF));
band.addElement(line);
jasperDesign.setTitle(band);
// Page header
band = new JRDesignBand();
//band.setHeight(20);
band.setHeight(0);
jasperDesign.setPageHeader(band);
// Column header
band = new JRDesignBand();
band.setHeight(20);
// 開始添加列字段
String[] headers = {"USERID","NAME","AGE","SEX","PASSWORD","DEPARTMENT"};
String[] alias = {"USERID","NAME","AGE","SEX","PASSWORD","DEPARTMENT"};
int X = 80;
int columnHeaderfontSize = 10;
int fontSize = 8;
int textHeight = 20;
int textWidth = 80;
int detailHeight = 20;
JRDesignBand detail = new JRDesignBand();
detail.setHeight(detailHeight);
for(int i = 0;i<headers.length;i++){
JRDesignStaticText jrstaticText = new JRDesignStaticText();
jrstaticText.setText(headers[i]);
jrstaticText.setFontSize(columnHeaderfontSize);
jrstaticText.setHeight(textHeight);
jrstaticText.setWidth(textWidth);
if(i==0){
X=0;
}else{
X = 80;
}
jrstaticText.setX(X * i);
jrstaticText.setPdfFontName("STSong-Light");
jrstaticText.setPdfEmbedded(true);
jrstaticText.setPdfEncoding("UniGB-UCS2-H");
// jrstaticText.setTextAlignment(JRBasePrintText.HORIZONTAL_ALIGN_CENTER);
// jrstaticText.setLeftBorder(JRBaseLine.PEN_1_POINT);
// jrstaticText.setTopBorder(JRBaseLine.PEN_1_POINT);
// jrstaticText.setRightBorder(JRBaseLine.PEN_1_POINT);
// jrstaticText.setBottomBorder(JRBaseLine.PEN_1_POINT);
jrstaticText.setForecolor(Color.blue);
// jrstaticText.setStretchType((byte)0);
band.addElement(jrstaticText);
// 定義字段,注冊字段
JRDesignField field = new JRDesignField();
field.setName(alias[i]);
field.setValueClass(String.class);
jasperDesign.addField(field);
// add text fields for displaying fields
JRDesignTextField textField = new JRDesignTextField();
JRDesignExpression expression = new JRDesignExpression();
expression.setText("$F{" + alias[i] + "}");
expression.setValueClass(String.class);
textField.setExpression(expression);
textField.setFontSize(fontSize);
textField.setHeight(textHeight);
textField.setWidth(textWidth);
textField.setX(X * i);
textField.setPdfFontName("STSong-Light");
textField.setPdfEmbedded(true);
textField.setPdfEncoding("UniGB-UCS2-H");
textField.setTextAlignment(JRBasePrintText.HORIZONTAL_ALIGN_CENTER);
textField.setLeftBorder(JRBaseLine.PEN_1_POINT);
textField.setTopBorder(JRBaseLine.PEN_1_POINT);
textField.setRightBorder(JRBaseLine.PEN_1_POINT);
textField.setBottomBorder(JRBaseLine.PEN_1_POINT);
//textField.setForecolor(new Color(0x99,0xFF,0xFF));
textField.setForecolor(Color.blue);
textField.setStretchWithOverflow(true);
detail.addElement(textField);
}
jasperDesign.setColumnHeader(band);
//detail
jasperDesign.setDetail(detail);
// Column footer
band = new JRDesignBand();
band.setHeight(10);
jasperDesign.setColumnFooter(band);
// Page footer
band = new JRDesignBand();
band.setHeight(80);
staticText = new JRDesignStaticText();
staticText.setX(0);
staticText.setY(0);
staticText.setWidth(100);
staticText.setHeight(20);
staticText.setPdfFontName("STSong-Light");
staticText.setPdfEmbedded(true);
staticText.setPdfEncoding("UniGB-UCS2-H");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
staticText.setText(sdf.format(new Date()));
band.addElement(staticText);
JRDesignTextField textField = new JRDesignTextField();
textField.setX(450);
textField.setY(0);
textField.setWidth(100);
textField.setHeight(20);
textField.setPdfFontName("STSong-Light");
textField.setPdfEmbedded(true);
textField.setPdfEncoding("UniGB-UCS2-H");
JRDesignExpression expression = new JRDesignExpression();
expression = new JRDesignExpression();
expression.setValueClass(java.lang.Integer.class);
expression.setText("$V{PAGE_NUMBER}");
textField.setExpression(expression);
band.addElement(textField);
jasperDesign.setPageFooter(band);
System.out.println(expression.getText());
// Summary
band = new JRDesignBand();
band.setHeight(0);
// band.addElement(chart1);
jasperDesign.setSummary(band);
System.out.println("After Connection");
JasperReport jasperReport = JasperCompileManager
.compileReport(jasperDesign);
Map parameters = new HashMap();
System.out.println("After Parameter");
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
parameters, connection);
System.out.println("After Print");
JasperExportManager.exportReportToHtmlFile(jasperPrint, "D://test2.html");
JasperExportManager.exportReportToPdfFile(jasperPrint, "D://test2.pdf");
JasperExportManager.exportReportToXmlFile(jasperPrint, "D://test2.xml", false);
System.out.println("After Export");
}
private void addReportFiled(JasperDesign jasperDesign) throws JRException {
JRDesignField field;
field=new JRDesignField();
field.setName("USERID");
field.setValueClass(java.math.BigDecimal.class);
jasperDesign.addField(field);
field = new JRDesignField();
field.setName("NAME");
field.setValueClass(java.lang.String.class);
jasperDesign.addField(field);
field = new JRDesignField();
field.setName("AGE");
field.setValueClass(java.lang.String.class);
jasperDesign.addField(field);
field = new JRDesignField();
field.setName("SEX");
field.setValueClass(java.lang.String.class);
jasperDesign.addField(field);
field = new JRDesignField();
field.setName("PASSWORD");
field.setValueClass(java.lang.String.class);
jasperDesign.addField(field);
field = new JRDesignField();
field.setName("DEPARTMENT");
field.setValueClass(java.lang.String.class);
jasperDesign.addField(field);
}
private JRDesignStyle setReportSytle(JasperDesign jasperDesign)
throws JRException {
jasperDesign.setName("SampleReport");
jasperDesign.setPageWidth(595);
jasperDesign.setPageHeight(842);
jasperDesign.setColumnWidth(535);
jasperDesign.setColumnSpacing(0);
jasperDesign.setLeftMargin(30);
jasperDesign.setRightMargin(30);
jasperDesign.setTopMargin(20);
jasperDesign.setBottomMargin(20);
// whenNoDataType="NoPages"
jasperDesign.setWhenNoDataType(JRReport.WHEN_NO_DATA_TYPE_BLANK_PAGE);
// isTitleNewPage="false"
jasperDesign.setTitleNewPage(false);
// isSummaryNewPage="false"
jasperDesign.setSummaryNewPage(false);
// jasperDesign.setOrientation(JRReport.ORIENTATION_PORTRAIT);
// jasperDesign.setPrintOrder(JRReport.PRINT_ORDER_VERTICAL);
JRDesignStyle normalStyle = new JRDesignStyle();
normalStyle.setName("Arial_Normal");
normalStyle.setDefault(true);
normalStyle.setFontName("Arial");
normalStyle.setFontSize(12);
normalStyle.setPdfFontName("STSong-Light");
normalStyle.setPdfEncoding("UniGB-UCS2-H");
normalStyle.setPdfEmbedded(true);
jasperDesign.addStyle(normalStyle);
JRDesignStyle boldStyle = new JRDesignStyle();
boldStyle.setName("Arial_Bold");
boldStyle.setFontName("Arial");
boldStyle.setFontSize(12);
boldStyle.setBold(true);
boldStyle.setPdfFontName("STSong-Light");
boldStyle.setPdfEncoding("UniGB-UCS2-H");
boldStyle.setPdfEmbedded(true);
jasperDesign.addStyle(boldStyle);
JRDesignStyle italicStyle = new JRDesignStyle();
italicStyle.setName("Arial_Italic");
italicStyle.setFontName("Arial");
italicStyle.setFontSize(12);
italicStyle.setItalic(true);
italicStyle.setPdfFontName("STSong-Light");
italicStyle.setPdfEncoding("UniGB-UCS2-H");
italicStyle.setPdfEmbedded(true);
jasperDesign.addStyle(italicStyle);
return normalStyle;
}
private Connection getConnection() throws SQLException {
Connection connection = ReadConfig.getProduceInstance().getDataSource()
.getConnection();
return connection;
}
}
class Sample {
public static void main(String args[]) throws Exception {
Sample6 obj = new Sample6();
}
}
然後是豎排的模闆
package cn.hzmc.dynamicreport.example8;
import java.awt.Color;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRAlignment;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRReport;
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.base.JRBaseLineBox;
import net.sf.jasperreports.engine.base.JRBasePrintText;
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.JRDesignLine;
import net.sf.jasperreports.engine.design.JRDesignQuery;
import net.sf.jasperreports.engine.design.JRDesignStaticText;
import net.sf.jasperreports.engine.design.JRDesignStyle;
import net.sf.jasperreports.engine.design.JRDesignTextField;
import net.sf.jasperreports.engine.design.JasperDesign;
import com.capaa.pipe.config.ReadConfig;
class Sample {
@SuppressWarnings("deprecation")
Sample() throws Exception {
Connection connection = getConnection();
JasperDesign jasperDesign = new JasperDesign();
JRDesignStyle normalStyle = setReportSytle(jasperDesign);
JRDesignQuery query = new JRDesignQuery();
query.setText("select userid,name,age,sex,password,department from person");
jasperDesign.setQuery(query);
//addReportFiled(jasperDesign);
// Title
JRDesignBand band = new JRDesignBand();
band.setHeight(20);
JRDesignStaticText staticText = new JRDesignStaticText();
staticText.setX(200);
staticText.setY(0);
staticText.setWidth(200);
staticText.setHeight(15);
staticText.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_RIGHT); //設定文本的對齊方式
staticText.setStyle(normalStyle);
staticText.setText("杭州美創科技有限公司審計報表 ");
band.addElement(staticText);
JRDesignLine line = new JRDesignLine();
line.setX(0);
line.setY(19);
line.setWidth(500);
line.setHeight(1);
line.setForecolor(new Color(0x99,0xFF,0xFF));
band.addElement(line);
jasperDesign.setTitle(band);
// Page header
band = new JRDesignBand();
//band.setHeight(20);
band.setHeight(0);
jasperDesign.setPageHeader(band);
// Column header
band = new JRDesignBand();
band.setHeight(0);
jasperDesign.setColumnHeader(band);
//detail
// 開始添加列字段
String[] headers = {"USERID","NAME","AGE","SEX","PASSWORD","DEPARTMENT"};
String[] alias = {"USERID","NAME","AGE","SEX","PASSWORD","DEPARTMENT"};
int Y = 20;
int columnHeaderfontSize = 10;
int fontSize = 8;
int textHeight = 19;
int textWidth = 180;
int detailHeight = 130;
JRDesignBand detail = new JRDesignBand();
detail.setHeight(detailHeight);
for(int i=0;i<headers.length;i++){
}
for(int i = 0;i<headers.length;i++){
JRDesignStaticText jrstaticText = new JRDesignStaticText();
jrstaticText.setText(headers[i]);
jrstaticText.setFontSize(columnHeaderfontSize);
jrstaticText.setHeight(textHeight);
jrstaticText.setWidth(textWidth);
jrstaticText.setY(Y * i);
jrstaticText.setPdfFontName("STSong-Light");
jrstaticText.setPdfEmbedded(true);
jrstaticText.setPdfEncoding("UniGB-UCS2-H");
// jrstaticText.setTextAlignment(JRBasePrintText.HORIZONTAL_ALIGN_CENTER);
jrstaticText.setTextAlignment(JRBasePrintText.HORIZONTAL_ALIGN_LEFT);
jrstaticText.setForecolor(Color.black);
// jrstaticText.setStretchType((byte)0);
// band.addElement(jrstaticText);
detail.addElement(jrstaticText);
// 定義字段,注冊字段
JRDesignField field = new JRDesignField();
field.setName(alias[i]);
field.setValueClass(String.class);
jasperDesign.addField(field);
// add text fields for displaying fields
JRDesignTextField textField = new JRDesignTextField();
JRDesignExpression expression = new JRDesignExpression();
expression.setText("$F{" + alias[i] + "}");
expression.setValueClass(String.class);
textField.setExpression(expression);
textField.setFontSize(fontSize);
textField.setHeight(textHeight);
textField.setWidth(textWidth);
textField.setX(textWidth);
textField.setY(Y*i);
textField.setPdfFontName("STSong-Light");
textField.setPdfEmbedded(true);
textField.setPdfEncoding("UniGB-UCS2-H");
//textField.setTextAlignment(JRBasePrintText.HORIZONTAL_ALIGN_CENTER);
textField.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_LEFT);
//textField.setForecolor(new Color(0x99,0xFF,0xFF));
textField.setForecolor(Color.black);
textField.setStretchWithOverflow(true);
detail.addElement(textField);
}
// jasperDesign.setColumnHeader(band);
//detail
jasperDesign.setDetail(detail);
// Column footer
band = new JRDesignBand();
band.setHeight(0);
jasperDesign.setColumnFooter(band);
// Page footer
band = new JRDesignBand();
band.setHeight(20);
JRDesignLine line2 = new JRDesignLine();
line2.setX(0);
line2.setY(-10);
line2.setWidth(450);
line2.setHeight(0);
line2.setForecolor(new Color(0x99,0xFF,0xFF));
band.addElement(line2);
staticText = new JRDesignStaticText();
staticText.setX(0);
staticText.setY(0);
staticText.setWidth(100);
staticText.setHeight(20);
staticText.setPdfFontName("STSong-Light");
staticText.setPdfEmbedded(true);
staticText.setPdfEncoding("UniGB-UCS2-H");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
staticText.setText(sdf.format(new Date()));
band.addElement(staticText);
JRDesignTextField textField = new JRDesignTextField();
textField.setX(450);
textField.setY(0);
textField.setWidth(100);
textField.setHeight(20);
textField.setPdfFontName("STSong-Light");
textField.setPdfEmbedded(true);
textField.setPdfEncoding("UniGB-UCS2-H");
JRDesignExpression expression = new JRDesignExpression();
expression = new JRDesignExpression();
expression.setValueClass(java.lang.Integer.class);
expression.setText("$V{PAGE_NUMBER}");
textField.setExpression(expression);
band.addElement(textField);
jasperDesign.setPageFooter(band);
System.out.println(expression.getText());
// Summary
band = new JRDesignBand();
band.setHeight(0);
jasperDesign.setSummary(band);
System.out.println("After Connection");
JasperReport jasperReport = JasperCompileManager
.compileReport(jasperDesign);
Map parameters = new HashMap();
System.out.println("After Parameter");
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
parameters, connection);
System.out.println("After Print");
JasperExportManager.exportReportToHtmlFile(jasperPrint, "D://test3.html");
JasperExportManager.exportReportToPdfFile(jasperPrint, "D://test3.pdf");
JasperExportManager.exportReportToXmlFile(jasperPrint, "D://test3.xml", false);
System.out.println("After Export");
}
private void addReportFiled(JasperDesign jasperDesign) throws JRException {
JRDesignField field;
field=new JRDesignField();
field.setName("USERID");
field.setValueClass(java.math.BigDecimal.class);
jasperDesign.addField(field);
field = new JRDesignField();
field.setName("NAME");
field.setValueClass(java.lang.String.class);
jasperDesign.addField(field);
field = new JRDesignField();
field.setName("AGE");
field.setValueClass(java.lang.String.class);
jasperDesign.addField(field);
field = new JRDesignField();
field.setName("SEX");
field.setValueClass(java.lang.String.class);
jasperDesign.addField(field);
field = new JRDesignField();
field.setName("PASSWORD");
field.setValueClass(java.lang.String.class);
jasperDesign.addField(field);
field = new JRDesignField();
field.setName("DEPARTMENT");
field.setValueClass(java.lang.String.class);
jasperDesign.addField(field);
}
private JRDesignStyle setReportSytle(JasperDesign jasperDesign)
throws JRException {
jasperDesign.setName("SampleReport");
jasperDesign.setPageWidth(595);
jasperDesign.setPageHeight(842);
jasperDesign.setColumnWidth(335);
jasperDesign.setColumnSpacing(0);
jasperDesign.setLeftMargin(30);
jasperDesign.setRightMargin(30);
jasperDesign.setTopMargin(20);
jasperDesign.setBottomMargin(20);
// whenNoDataType="NoPages"
jasperDesign.setWhenNoDataType(JRReport.WHEN_NO_DATA_TYPE_BLANK_PAGE);
// isTitleNewPage="false"
jasperDesign.setTitleNewPage(false);
// isSummaryNewPage="false"
jasperDesign.setSummaryNewPage(false);
// jasperDesign.setOrientation(JRReport.ORIENTATION_PORTRAIT);
// jasperDesign.setPrintOrder(JRReport.PRINT_ORDER_VERTICAL);
JRDesignStyle normalStyle = new JRDesignStyle();
normalStyle.setName("Arial_Normal");
normalStyle.setDefault(true);
normalStyle.setFontName("Arial");
normalStyle.setFontSize(12);
normalStyle.setPdfFontName("STSong-Light");
normalStyle.setPdfEncoding("UniGB-UCS2-H");
normalStyle.setPdfEmbedded(true);
jasperDesign.addStyle(normalStyle);
JRDesignStyle boldStyle = new JRDesignStyle();
boldStyle.setName("Arial_Bold");
boldStyle.setFontName("Arial");
boldStyle.setFontSize(12);
boldStyle.setBold(true);
boldStyle.setPdfFontName("STSong-Light");
boldStyle.setPdfEncoding("UniGB-UCS2-H");
boldStyle.setPdfEmbedded(true);
jasperDesign.addStyle(boldStyle);
JRDesignStyle italicStyle = new JRDesignStyle();
italicStyle.setName("Arial_Italic");
italicStyle.setFontName("Arial");
italicStyle.setFontSize(12);
italicStyle.setItalic(true);
italicStyle.setPdfFontName("STSong-Light");
italicStyle.setPdfEncoding("UniGB-UCS2-H");
italicStyle.setPdfEmbedded(true);
jasperDesign.addStyle(italicStyle);
return normalStyle;
}
private Connection getConnection() throws SQLException {
Connection connection = ReadConfig.getProduceInstance().getDataSource().getConnection();
return connection;
}
}
class Vertical {
public static void main(String args[]) throws Exception {
Sample obj = new Sample();
}
}