记得刚学Jasperreport的时候,在谷歌和百度上搜到的大多数入门文章都是教授如何使用数据库来做报表的。对于只采用简单数据集和那些直接面向数据的报表,使用数据库作为数据源是合适的;但是也有很多的报表不是直接面向原始数据的,例如财务报表,都是需要计算和做后续处理;也有一些报表引用的数据粒度小,但是数量多,使用数据库做数据源是不合适的。
XML一直被认为是一种很好的描述结构化数据的语言。
首先XML文件的数据结构非常清晰。可以把报表所需要的数据集成到一个XML文件上,然后再通过在文件内查询,这比每需要一条数据就使用SQL来查询要显得更高效和简单。试想一下,你的同事A告诉你,“报表的数据都在这份XML文件里哦”。而同事B则对你说:”那些数据在某个数据库里,你自己去查吧。“,你更喜欢听到哪一句呢?(当然我的语气上的差别就说明了我的喜好,我老怀疑后者在背向我的那一刻有在奸笑。)
其次,现在对象映射到XML的工具很多。哦?你知道我在暗示什么吗?没错,你可以面向对象,而不用面向丑陋的表格。在上一篇文章中,我给出这样一个数据源。
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--> 1
<?
xml version="1.0" encoding="utf-8"
?>
2
<
NameList
>
3
<
Person
>
4
<
Name
>
强尼
</
Name
>
5
<
Gender
>
男
</
Gender
>
6
<
Age
>
56
</
Age
>
7
</
Person
>
8
<
Person
>
9
<
Name
>
阿美
</
Name
>
10
<
Gender
>
女
</
Gender
>
11
<
Age
>
23
</
Age
>
12
</
Person
>
13
<
Person
>
14
<
Name
>
李丽
</
Name
>
15
<
Gender
>
女
</
Gender
>
16
<
Age
>
58
</
Age
>
17
</
Person
>
18
<
Person
>
19
<
Name
>
杰森
</
Name
>
20
<
Gender
>
男
</
Gender
>
21
<
Age
>
32
</
Age
>
22
</
Person
>
23
<
Person
>
24
<
Name
>
刘三
</
Name
>
25
<
Gender
>
男
</
Gender
>
26
<
Age
>
21
</
Age
>
27
</
Person
>
28
</
NameList
>
如果你是个典型的面向对象的思考者,应该马上想到一个叫Person的Java类。大概像下面这样。
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--> 1
package
com.blogjava.heis.jasper.chapter2;
2
3
public
class
Person {
4
5
private
String name;
6
private
String gender;
7
private
int
age;
8
9
private
String getName() {
10
return
name;
11
}
12
private
void
setName(String name) {
13
this
.name
=
name;
14
}
15
private
String getGender() {
16
return
gender;
17
}
18
private
void
setGender(String gender) {
19
this
.gender
=
gender;
20
}
21
private
int
getAge() {
22
return
age;
23
}
24
private
void
setAge(
int
age) {
25
this
.age
=
age;
26
}
27
}
想像一下,把一个个对象排着队跳进模板,然后一张完整的报表就出来了,不用管那些烦人的Sql,那应该是多么美好的一件事儿。面向对象果然是我们的福音。接下来看看我们如何把对象转换成XML文件。
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->package
com.blogjava.heis.jasper.chapter2;
import
java.io.File;
import
java.io.FileWriter;
import
java.io.StringWriter;
import
java.util.ArrayList;
import
org.apache.commons.betwixt.io.BeanWriter;
public
class
BeanToXMLConverter {
private
final
static
String FILE_PATH
=
"
c:/test.xml
"
;
/**
* Create an example bean and then convert it to xml.
*/
public
static
final
void
main(String [] args)
throws
Exception {
Person person1
=
new
Person();
person1.setName(
"
张三
"
);
person1.setGender(
"
男
"
);
person1.setAge(
35
);
Person person2
=
new
Person();
person2.setName(
"
李四
"
);
person2.setGender(
"
女
"
);
person2.setAge(
25
);
ArrayList
<
Person
>
al
=
new
ArrayList
<
Person
>
();
al.add(person1);
al.add(person2);
NameList nameList
=
new
NameList();
nameList.setList(al);
try
{
BeanToXMLConverter wea
=
new
BeanToXMLConverter();
wea.writeToXMLFile(nameList);
}
catch
(Exception e){
e.printStackTrace();
}
}
private
void
writeToXMLFile(Object obj)
throws
Exception{
StringWriter outputWriter
=
new
StringWriter();
outputWriter.write(
"
<?xml version='1.0' ecoding='UTF-8' ?>\n
"
);
BeanWriter beanWriter
=
new
BeanWriter(outputWriter);
beanWriter.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(
false
);
beanWriter.getBindingConfiguration().setMapIDs(
false
);
beanWriter.enablePrettyPrint();
beanWriter.write(obj);
String xmlFilePath
=
FILE_PATH;
File xmlFile
=
new
File(FILE_PATH);
if
(
!
xmlFile.exists()){
xmlFile.createNewFile();
}
FileWriter fw
=
new
FileWriter(xmlFilePath);
fw.write(outputWriter.toString().toCharArray());
fw.flush();
System.out.println(outputWriter.toString());
outputWriter.close();
}
}
NameList类代码。
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--> 1
package
com.blogjava.heis.jasper.chapter2;
2
3
import
java.util.List;
4
5
public
class
NameList {
6
7
private
List
<
Person
>
list;
8
9
public
List
<
Person
>
getList() {
10
return
list;
11
}
12
13
public
void
setList(List
<
Person
>
list) {
14
this
.list
=
list;
15
}
16
}
17
运行以上的代码需要四个包,commons-betwixt.jar,commons-logging.jar, commons-collections.jar, commons-beanutils-core.jar。这些都可以从http://commons.apache.org/
下载。JDK需要1.5或以上。
看到这里你心里也许开始矛盾(或者不屑),对,同事Q也是这样想的。
Q:“这不是摆明更麻烦么?对象转换为XML,再从XML查数据,你这瞎折腾我,浪费资源在转换上!!”
俺:“也许是多了一些功夫,多占用了点资源。但是这可以让报表的数据可读性更强,更重要的是报表制作可以和SQL说拜拜,他和对象走得更密切了。”
Q:“但是你的XML文件不是还是需要查询么?你能保证那些查询语句比SQL更简单么?”
俺:“我能给你肯定的回答。但是XML的查询就要留到下一章去介绍了。这星期OT比较多,先溜啦,88。”
Q:“哎,你给我说清楚点再走……”
分享到:
相关推荐
### JasperReport中使用多个数据源的方法详解 #### 场景背景 在报表开发过程中,有时我们需要在一个报表中展示不同来源的数据。例如,在同一份报告中同时呈现交叉表和饼状图,而这两部分数据可能源自不同的数据库表...
jasperreport允许使用多个数据源,这对于处理复杂报表场景非常有用。例如,一个报表可能需要合并来自不同数据库或不同JavaBean的数据。jasperreport通过定义多个JRDataSource和在报表设计中分别引用它们来实现这一...
总结来说,使用JasperReport的自定义JavaBean数据源,可以方便地将业务对象与报表紧密结合,提高报表的灵活性和可维护性。通过创建JavaBean,设计报表,编写数据源代码,最后运行报表,你可以轻松地实现自定义的数据...
它使用XML或Java代码来定义报告布局,并支持多种数据源,包括数据库连接、CSV文件、XML数据等。JasperReport与C#语言的结合主要通过iReport设计工具,使得非Java开发者也能利用其功能。 **C#入门详解**:虽然...
2. **数据绑定**:jasperreport支持多种数据源,包括数据库连接、Java集合、XML数据等。报表可以通过SQL查询动态获取数据,也可以使用JavaBeans或其他自定义数据提供者。 3. **多格式输出**:jasperreport的强大之...
### jasperReport资料文档5 —— 使用非数据库数据源创建报表 #### 概述 本文档探讨了如何利用非数据库数据源在JasperReports中创建报表。除了传统的数据库连接之外,JasperReports还支持多种其他数据源,如空数据...
JasperReport是一款流行的开源报表工具,能够生成各种格式的报表,而JavaBean是一个Java对象,封装成List后可以作为JasperReport的数据源。本文档还提供了源码下载地址,方便读者了解和实践。 JasperReport学习之...
JasperReport支持多种数据源,包括数据库、CSV文件、XML文件等,并能与Java应用程序、Web应用程序或独立的应用程序无缝集成。 在JasperReport 4.0.0版本中,用户可以利用其内置的报表设计工具——JasperDesign,...
JasperReport是一款强大的开源报表工具,它允许开发者创建复杂的报告设计并从各种数据源获取数据,包括关系型数据库。本篇文章将深入探讨如何使用JasperReport从数据库中提取数据,以及如何在Web环境下进行打印。 ...
jasperreport创建多个List数据源报表 通多个detail实现多个table效果,简单 快捷
### jasperReport资料文档4 —— 从数据库创建动态报表 #### 一、概述 本文档旨在指导用户如何使用JasperReports从数据库中创建动态报表。动态报表是指那些能够根据实时或预先设定的数据源更新其内容的报表。通过...
3. 创建数据源:根据项目需求,配置适合的数据源,如数据库查询结果集、Java对象集合等。 4. 填充报表:将数据源与报表模板结合,生成报表实例。 5. 输出报表:报表可以导出为多种格式,如PDF、HTML、Excel等,...
subDataSets 是一种特殊的数据源,它可以从外部数据源中获取数据,并将其存储在内存中,以便于报表生成。要设置 subDataSets 数据源,需要在报表设计中点击“数据源”按钮,然后选择“subDataSets”,并填写数据源...
通过以上分析,我们可以看出“JasperReport动态报表归并行数据”涉及到的核心概念包括动态报表设计、数据源处理、数据归并、自定义脚本let以及开发工具的使用。掌握这些知识点,能帮助开发者创建出适应各种业务需求...
- 通过 Java 代码连接到数据源(如数据库),执行 SQL 查询获取数据。 - 使用 `JRDataSource` 接口实现自定义数据源,适应复杂的数据结构。 - `JRBeanCollectionDataSource` 或 `JRMapCollectionDataSource` 用于...
本文详细介绍了JasperReport的基本概念、设计方式、数据源配置以及集成部署等方面的内容。通过本文的学习,读者可以更好地理解和掌握如何使用JasperReport进行报表设计与开发。随着对JasperReport的深入了解,开发者...
1. 数据源设置:ireport支持多种数据源,包括JDBC、XML、CSV等,使报表可以连接各种数据库获取数据。 2. 报表设计:掌握表格、图表、文本框等元素的使用,以及样式和样式的自定义,能构建出丰富的报表界面。 3. 导出...
你还会学到如何处理数据源,包括静态数据、数据库查询以及使用Java集合。此外,书中还将介绍如何在Java应用程序中嵌入报表,以及如何利用JasperReport的API动态生成报表。 JasperReport的核心在于它的报表模板。...
3. 将List对象转换为JasperReport理解的数据源,例如JRBeanCollectionDataSource。 4. 使用 JasperFillManager.fillReport() 方法将模板和数据源结合,生成填充后的报表。 5. 最后,通过 JasperExportManager....