前言:
前段实现有个需求,boss要求做一个生成pdf的接口。简单来讲就是产给你参数,然后根据这些参数生成pdf。麻烦就在于pdf中有个表格。于是到处搜贴,网上大多讲的是如何利用DataSet生成Table,帖子里都是教你怎么搞数据库。但是我不想用数据库,只是简单地将javabean数据注入paf中。下面来说一下,我的处理办法。
我从ireport设计和程序两方面来说一下这个问题。
1、 ireport设计
a) 首先是新建一个report。
b) 插入一个table。
选择table,然后将table拖入report。
由于我们是利用javabean不通过什么dataset,所以这里可以直接选择第二项然后继续就行了。
由于我是做个简单的demo所以就绘制了一个最简单的table,完成
界面出来以后你会发现,多了这些东西。
这里先描述一下如何将javabean数据插入table中的,table默认是设置dataset类型的数据作为数据源,dataset一般是通过sql查询出的结果,即便不设置也会自动创建一个dataset,上图中的table Dataset 1就是默认给table创建的数据源。切入点就是将dataset对象替换。修改成可以通过javabean传入的类型,这里我们就用net.sf.jasperreports.engine.data.JRBeanCollectionDataSource
类型的report Filed作为dataset的数据源。
那么我们需要先新建一个Filed,并设置类型
注意这里的类型没有我们想要的,直接将类型设置上就行。
这样以后再xml中可以看到类型是
Table中用到的Filed需要从table Dataset 1中添加里。我们先创建两个
修改table中的数据源
选中table右击编辑数据源
将默认的清掉,然后双击table_datas
apply,然后再ok即可。
然后在设置table显示的数据,直接将table Dataset 1下的t1 t2拽进来就行。
现在已经完成了全部的ireport操作,编译一下。就行了
2、 开发部分
先简单说一下我的开发环境。
MyEclipse8.6、tomcat7、jdk6
demo项目采用了springmvc的框架
重点看一下传参数和生成模块的代码
@RequestMapping("/create")
publicvoid createPdf(HttpServletRequest request,
HttpServletResponse response) {
init(request);
Map<String, Object> parameters = new HashMap<String,Object>();
parameters.put("SUBREPORT_DIR", jasperPath);
List<PdfDetail> list = new ArrayList<PdfDetail>();
PdfDetail detail = new PdfDetail();
detail.setField1("hello");
//本地路径的图片
detail.setMi(imagePath);
//添加网络路径图片
detail.setImageUrl("http://d.hiphotos.baidu.com/image/pic/item/e824b899a9014c08ed5f84a5087b02087bf4f44e.jpg");
//创建table数据
List<PdfTable> pdfTables = new ArrayList<PdfTable>();
PdfTable pdfTable = new PdfTable();
pdfTable.setT1("t1");
pdfTable.setT2("t2");
pdfTables.add(pdfTable);
pdfTables.add(pdfTable);
pdfTables.add(pdfTable);
pdfTables.add(pdfTable);
pdfTables.add(pdfTable);
pdfTables.add(pdfTable);
pdfTables.add(pdfTable);
pdfTables.add(pdfTable);
detail.setTable_datas(new JRBeanCollectionDataSource(pdfTables));
list.add(detail);
//添加两张美女提提神
//添加网络路径的图片
list.add(new PdfDetail("http://a.hiphotos.baidu.com/image/pic/item/faf2b2119313b07eb2ce890c0ed7912397dd8c47.jpg"));
list.add(new PdfDetail("http://e.hiphotos.baidu.com/image/pic/item/dcc451da81cb39db62ca5653d2160924ab1830a8.jpg"));
//成功pdf文件
try {
createFileWrite(response,request.getSession().getServletContext(), list, jasperPath, System
.currentTimeMillis()
+ "", parameters);
} catch (Exception e) {
e.printStackTrace();
}
}
对了在介绍一下解决中文不显示问题:
其实很简单
选中文本属性的控件,属性底部区域
修改后
QQ群:255825960
代码下载地址:http://pan.baidu.com/s/1qWLjRru
ireport环境、文档、代码、效果下载地址:http://pan.baidu.com/s/1sjkAdkh
代码的介绍很短。不过相信大家还是可以看懂吧。还可以去群里讨论。
效果图:
255825960255825960255255825960255825960825960
ireport