JasperReport—在构建了大量JRXML报告之后使用DynamicJasper
问题概述
目前,我的java软件使用编译的. jrxml文件来生成报告。但是,用户抱怨他们想要自定义报告。这基本上是所以我发现了DynamicJasper。问题是我之前构建的即用型. jasper报告有自己的布局,我最终调整了布局,为通过参数发送的徽标插入了图像占位符。
问题
有没有一种方法可以复制样式或以简单的方式重用这些以前构建的报告布局?
据我所知,我使用名为Cherry的Jasper模板构建了这些报告。有些我用风景画,有些我用肖像画。
由于问题本身的限制,我不认为这个问题是重复的:我不能将每个报告都重建为DynamicJasper,也不能积极地更改layour。
参考文献
如何在DynamicJasper中使用jrxml文件作为设计模板
如何在DynamicReports和JasperReports中获得相同的样式
所以为了回答我自己的问题,这里有一个食谱。
1你把你的jrxml和清洁它根据:http://dynamicjasper.com/2010/10/06/how-to-use-custom-jrxml-templates/
这基本上需要:
>
模板不能有组,必要时DynamicJAsper会创建它们。
详图标注栏必须为空:DynamicJasper将在详图标注栏中工作,任何以前存在的图元都将被删除。
每个页面大小和方向需要一个模板:这是因为DJ知道如何安排他创建的元素,但不知道如何安排现有的元素。
2º调用setTemplateFile方法:
public DynamicReportBuilder setTemplateFile(String path,
boolean importFields,
boolean importVariables,
boolean importParameters,
boolean importDatasets)
具有所需的布尔标志。这些布尔标志将允许您加载或不加载在jrxml上设置的参数、字段、变量和数据集。
下面我附上了一个模拟示例。但是,您需要自己的jrxml文件来测试。
public class TestReport {
protected static JasperPrint jp;
protected static JasperReport jr;
protected static Map params = new HashMap();
protected static DynamicReport dr;
public static void main(String args[]) throws SQLException, ColumnBuilderException, ClassNotFoundException {
TestReport t = new TestReport();
t.createReport();
}
public void createReport() throws SQLException, ColumnBuilderException, ClassNotFoundException {
ArrayList<Fruit> createMockDataset = createMockDataset();
Style titleStyle = new Style();
titleStyle.setHorizontalAlign(HorizontalAlign.CENTER);
titleStyle.setFont(Font.ARIAL_SMALL_BOLD);
Style dataStyle = new Style();
dataStyle.setHorizontalAlign(HorizontalAlign.CENTER);
dataStyle.setFont(Font.ARIAL_SMALL);
dataStyle.setBlankWhenNull(true);
final List items = SortUtils.sortCollection(createMockDataset, Arrays.asList(new String[]{"name", "description"}));
FastReportBuilder drb = new FastReportBuilder();
drb.setTemplateFile("templatePortrait.jrxml", true, true, true, true);
drb.addColumn("name", "name", String.class.getName(), 30, dataStyle)
.addColumn("description", "description", String.class.getName(), 50, dataStyle)
.setTitle("Report")
.setSubtitle("")
.setPrintBackgroundOnOddRows(true)
.setUseFullPageWidth(true);
DynamicReport dynamicReport = drb.build();
dynamicReport.setTitleStyle(titleStyle);
HashMap parametros = new HashMap();
parametros.put("dataRelatorio", MyTools.getDataPorExtenso());
doReport(dynamicReport, items, parametros);
}
public void doReport(final DynamicReport _report, final Collection _data, HashMap parametros) {
try {
JRDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(_data);
JasperPrint jasperPrint = DynamicJasperHelper.generateJasperPrint(_report, new ClassicLayoutManager(), beanCollectionDataSource, parametros);
JasperViewer.viewReport(jasperPrint);
} catch (JRException ex) {
ex.printStackTrace();
}
}
public ArrayList<Fruit> createMockDataset() {
ArrayList<Fruit> fruits = new ArrayList<>();
Fruit f1 = new Fruit();
f1.name = "Apple X1";
f1.description = "Yummy yummy apple for the stackoverflow readers 1";
Fruit f2 = new Fruit();
f2.name = "Apple Ag";
f2.description = "Yummy yummy apple for the stackoverflow readers 2";
Fruit f3 = new Fruit();
f3.name = "Apple Mn";
f3.description = "Yummy yummy apple for the stackoverflow readers 3";
Fruit f4 = new Fruit();
f4.name = "Apple O2";
f4.description = "Yummy yummy apple for the stackoverflow readers 4";
//Evaluations for f1
for (int i = 0; i < 4; i++) {
Evaluation e = new Evaluation();
e.id = i;
e.score = Math.random() * 10;
f1.evaluations.add(e);
}
//evaluations for f4
for (int i = 0; i < 4; i++) {
Evaluation e = new Evaluation();
e.id = i;
e.score = Math.random() * 10;
f4.evaluations.add(e);
}
fruits.add(f1);
fruits.add(f2);
fruits.add(f3);
fruits.add(f4);
return fruits;
}
public class Fruit {
public String name;
public String description;
public ArrayList<Evaluation> evaluations = new ArrayList<Evaluation>();
public Fruit() {
}
public Fruit(String name, String description) {
this.name = name;
this.description = description;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public ArrayList<Evaluation> getEvaluations() {
return evaluations;
}
public void setEvaluations(ArrayList<Evaluation> evaluations) {
this.evaluations = evaluations;
}
}
public class Evaluation {
public int id;
public double score;
public Evaluation() {
}
public Evaluation(int id, double score) {
this.id = id;
this.score = score;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
}
我已经创建了报告(report1.jrxml)复制了它(report1.jasper),我只想用这个列表的信息来填充它:
问题内容: 当测试中存在异常时,让Jenkins解析xunit.xml报告文件时遇到问题。XML看起来格式正确,因此仅查看它就看不到任何问题。我在某处可以比较xml的xsd文件,看看实际上是什么导致文件无法解析? 关于我的设置:我在詹金斯(Jenkins)为一个PHP项目设置了一份夜间工作。我们正在使用Cakephp 1.3,因此我们仍在使用SimpleTest而不是PHPUnit。我能弄清楚在使
问题内容: 我正在处理生成Excel文件的JasperReport报告。由于某种原因,我的单元格格式/类型不应该如此。例如,我的单元格中有Date对象,但是当我生成Excel文件时,它将单元格类型设置为Number,或者Long类型是单元格中的文本,但是单元格的格式是number,并且当用户编辑日期单元格时(例如,日期为11/02) / 2012更改为11/03/2012),它将日期转换为数字(4
我有一组数据要使用jasper报告以表格格式显示,并且当前正在编写. jrxml文件。 在我的数据集中,我有数据可以帮助我们了解表的列数,从而使它成为表的动态列。 因此,问题是从数据库中提取的数据是特定于行的;那么,我怎样才能把它转换成表的列数呢? 我有一个从其中提取数据的dB表: 我必须同样创建报告: -: LEVEL的数量成为特定测试的列数。
问题内容: 我有一个带glassfish 3.1 + JSF for jasperreport 4.0.1的EJB站点。该网站在流式pdf上没有问题,但是在使用runReportToPdfStream打印PDF时会生成空白PDF,以下是代码段: EJB test.jrxml- 没有SQL连接的简单报告 在JSF上生成此报告时,在glassfish中没有错误日志,但是只显示了空白PDF。请帮助,让我
问题内容: 在将Jenkins更新到2.156版(从1.6版开始)之后,我们的一些构建作业在完成后以及移至构建后动作之前会卡住。作业本身在5分钟内完成(与之前相同),然后挂起5-10分钟再继续。 我设法将其缩小为: 可以在此处找到引用的代码(自2.141版本开始提供)。 threadDump#1,threadDump#2 我们可以做些什么吗? 问题答案: 2.141引入了2分钟的进程终止等待时间(