var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-20738293-1']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script')"/>
jutleo
欢迎走进有风的地方~~
posts - 63,  comments - 279,  trackbacks - 0

jasperReport支持多种格式的数据源,CSV(Comma Separated values),是一种用来存储数据的纯文本,文件格式,通常用于电子表格或数据库软件。

规则

0 开头是不留空,以行为单位。
1 可含或不含列名,含列名则居文件第一行。
2 一行数据不垮行,无空行。
3 以半角符号,作分隔符,列为空也要表达其存在。
4 列内容如存在,,则用“”包含起来。
5 列内容如存在“”则用“”“”包含。
6 文件读写时引号,逗号操作规则互逆。
7 内码格式不限,可为ASCII、Unicode或者其他。

jasper文件和前面几篇用到的是一样的(person.jasper),准备数据的文本文件Person.txt其中文件的格式对应模板文件的字段【 "pid", "name", "sex", "age", "password", "department"】。

"20000000001","bulktree1","man","21","1111111111","pcisv61"
"20000000002","bulktree2","man","22","2222222222","pcisv62"
"20000000003","bulktree3","man","23","3333333333","pcisv63"
"20000000004","bulktree4","man","24","4444444444","pcisv64"
"20000000005","bulktree5","man","25","5555555555","pcisv65"
"20000000006","bulktree6","man","26","6666666666","pcisv66"
"20000000007","bulktree7","man","27","7777777777","pcisv67"
"20000000008","bulktree8","man","28","8888888888","pcisv68"
"20000000009","bulktree9","man","29","9999999999","pcisv69"
下来我们看看jasperReport的API是怎么识别这些数据的,但是做这个之前我们还要指定数据到底是怎么对应的,定义String类型数组存放模板对应的列名和文本数据对应
String[] columNames = new String[] "pid""name""sex""age""password",
                
"department" }
;
识别这些数据并不难,下面这一句就可以搞定:
JRCsvDataSource jrcsvDataScource = new JRCsvDataSource(JRLoader
                .getLocationInputStream(
"D:\\workspace\\Person.txt"));
我们怎么才能让它识别对应的列呢?查看API看看对应的set方法吧!
// set record delimiter
        jrcsvDataScource.setRecordDelimiter("\r\n");
        
// set columnName
        jrcsvDataScource.setColumnNames(columNames);
至此数据源就准备完了,jasperReport封装了底层的实现,简单吧!下来看看完整的代码:
package org.bulktree.ireport.csvdata;

import java.util.HashMap;

import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRCsvDataSource;
import net.sf.jasperreports.engine.util.JRLoader;

import org.bulktree.ireport.ViewReport;

public class CSVDataSource {
    
    
public static void main(String[] args) {
        
try {
            
new CSVDataSource().reportView();
        }
 catch (Exception e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }

    }


    
private void reportView() throws Exception {
        JasperReport jasperReport 
= (JasperReport) JRLoader
                .loadObject(
"D:\\workspace\\Person.jasper");

        JasperPrint jasperPrint 
= JasperFillManager.fillReport(jasperReport,
                getReportParameter(), getDateSource());
        
        
new ViewReport().viewer(jasperPrint);
    }


    
private HashMap getReportParameter() {
        HashMap parameters 
= new HashMap();
        parameters.put(
"reportTitle""laoshulin");
        
return parameters;
    }


    
private JRCsvDataSource getDateSource() throws Exception {
        String[] columNames 
= new String[] "pid""name""sex""age""password",
                
"department" }
;
        
// get csvdata
        JRCsvDataSource jrcsvDataScource = new JRCsvDataSource(JRLoader
                .getLocationInputStream(
"D:\\workspace\\test\\src\\org\\bulktree\\ireport\\csvdata\\Person.txt"));
        
// set record delimiter
        jrcsvDataScource.setRecordDelimiter("\r\n");
        
// set columnName
        jrcsvDataScource.setColumnNames(columNames);

        
return jrcsvDataScource;
    }

}

还是这样的效果吧!^_^



        至于XML数据源也是很简单,通过读取xml文件获得数据
Document document = JRXmlUtils.parse(JRLoader.getLocationInputStream(xmlFileName));
不同的是document会作为一个参数传递给报表,fillReport方法就不会出现第三个参数,完整代码如下:
package org.bulktree.ireport.xmldata;

import java.util.HashMap;
import java.util.Locale;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.query.JRXPathQueryExecuterFactory;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.engine.util.JRXmlUtils;

import org.bulktree.ireport.ViewReport;
import org.w3c.dom.Document;

public class XMLDataSource {

    
private static final String JASPER_FILE_NAME = "D:\\workspace\\Person.jasper";
    
private static final String XML_FILE_NAME = "D:\\workspace\\person.xml";

    
private void viewerReport() throws JRException {
        JasperReport jasperReport 
= (JasperReport) JRLoader.loadObject(JASPER_FILE_NAME);

        JasperPrint jasperPrint 
= JasperFillManager.fillReport(jasperReport,
                getReportParameter(XML_FILE_NAME));

        
new ViewReport().viewer(jasperPrint);
    }


    
private HashMap getReportParameter(String xmlFileName) {
        HashMap parameters 
= new HashMap();
        
try {
            parameters.put(
"reportTitle""laoshulin");
            Document document 
= JRXmlUtils.parse(JRLoader.getLocationInputStream(xmlFileName));

            parameters.put(JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT,
                    document);
            parameters.put(JRXPathQueryExecuterFactory.XML_DATE_PATTERN, 
"yyyy-MM-dd");
            parameters.put(JRXPathQueryExecuterFactory.XML_NUMBER_PATTERN, 
"#,##0.##");
            parameters.put(JRXPathQueryExecuterFactory.XML_LOCALE, Locale.CHINESE);
            parameters.put(JRParameter.REPORT_LOCALE, Locale.CHINA);

        }
 catch (JRException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }


        
return parameters;
    }


    
public static void main(String[] args) throws Exception {
        
new XMLDataSource().viewerReport();
    }

}

        预览效果就不看了吧!哈哈 都是一样的道理,现在看看jasperReport的API有多强大了吧!

posted on 2008-12-15 10:08 凌晨风 阅读(4382) 评论(19)  编辑  收藏 所属分类: iReport + JasperReport 系列

FeedBack:
# re: iReport+jasperReport之CSV、XML数据源
2008-12-15 11:55 | 飘流甁
不错!  回复  更多评论
  
# re: iReport+jasperReport之CSV、XML数据源
2009-01-14 18:40 | 梦想在这里起飞
都是api级别的研究,不错啊~

iReport中文网
http://ireport.cubebi.com

  回复  更多评论
  
# re: iReport+jasperReport之CSV、XML数据源[未登录]
2009-06-15 20:43 | 菜鸟
写得很好,小弟现在有个问题想请教,CSV如果里面有个字段是int型的不是String类型的怎样转换?如果不转换会报一个找不到该字段的错误。。。。。急急。。。请教各位大哥,如果看到此消息,请告诉小弟,小弟感激不尽,小弟的邮箱xiongshunhong@purple-river.com  回复  更多评论
  
# re: iReport+jasperReport之CSV、XML数据源
2009-06-16 08:54 | 凌晨风
这个问题很好处理,查一下api,对这类型转化有说明的  回复  更多评论
  
# re: iReport+jasperReport之CSV、XML数据源[未登录]
2010-01-12 11:28 | max
小弟有个问题,大虾能不能帮我解答下啊,xml数据源的 xml中的标签,元素有没有规定要如何写啊?  回复  更多评论
  
# re: iReport+jasperReport之CSV、XML数据源
2010-01-12 12:32 | 凌晨风
@max
标准的xml文件即可  回复  更多评论
  
# re: iReport+jasperReport之CSV、XML数据源
2014-07-30 10:30 | 李岩风
@飘流甁
new ViewReport().viewer(jasperPrint); 这个没找到 在哪  回复  更多评论
  
# re: iReport+jasperReport之CSV、XML数据源
2014-07-30 10:34 | 李岩风
new ViewReport().viewer(jasperPrint); 能告诉我这个在哪吗,为什么我导步进去  回复  更多评论
  
# re: iReport+jasperReport之CSV、XML数据源
2014-07-30 10:36 | 凌晨风
@李岩风
这个是客户端的applet类,你需要继续看客户端打印  回复  更多评论
  
# re: iReport+jasperReport之CSV、XML数据源
2014-07-30 10:55 | 李岩风
@凌晨风
在下一篇中吗?这个是加载那个xml文件的吗  回复  更多评论
  
# re: iReport+jasperReport之CSV、XML数据源
2014-07-30 10:58 | 李岩风
@凌晨风
我没找到关于new ViewReport().viewer(jasperPrint) 的啊 这个ViewReport是不是一个类  回复  更多评论
  
# re: iReport+jasperReport之CSV、XML数据源
2014-07-30 11:03 | 李岩风

@凌晨风
风哥,你有一套ireport 导出pdf用xml作为数据源的案例吗?   回复  更多评论
  
# re: iReport+jasperReport之CSV、XML数据源
2014-07-30 11:20 | 凌晨风
@李岩风
http://jutleo.github.io/ireport/2013/05/07/iReport-jasperReport-13.html

这个是好几年的代码了,我手头没有现成的,我的blog已经迁移到以上地址,思路和关键代码都在。  回复  更多评论
  
# re: iReport+jasperReport之CSV、XML数据源
2014-07-30 11:24 | 李岩风

@凌晨风
new ViewReport().viewer(jasperPrint) 这个我始终找不到 不然我没法加载xml文件 new的这个ViewReport() 找不到啊!  回复  更多评论
  
# re: iReport+jasperReport之CSV、XML数据源
2014-07-30 11:26 | 李岩风
@凌晨风
xml作为数据源 应该是写一个类 然后运行就行了 获取节点放到ireport里 运行类 应该就能出来pdf了啊  回复  更多评论
  
# re: iReport+jasperReport之CSV、XML数据源
2014-07-30 11:27 | 李岩风
@凌晨风
public class XMLDataSource {

private static final String JASPER_FILE_NAME = "D:\\workspace\\Person.jasper";
private static final String XML_FILE_NAME = "D:\\workspace\\person.xml";

private void viewerReport() throws JRException {
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(JASPER_FILE_NAME);

JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
getReportParameter(XML_FILE_NAME));

new ViewReport().viewer(jasperPrint);
}

private HashMap getReportParameter(String xmlFileName) {
HashMap parameters = new HashMap();
try {
parameters.put("reportTitle", "laoshulin");
Document document = JRXmlUtils.parse(JRLoader.getLocationInputStream(xmlFileName));

parameters.put(JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT,
document);
parameters.put(JRXPathQueryExecuterFactory.XML_DATE_PATTERN, "yyyy-MM-dd");
parameters.put(JRXPathQueryExecuterFactory.XML_NUMBER_PATTERN, "#,##0.##");
parameters.put(JRXPathQueryExecuterFactory.XML_LOCALE, Locale.CHINESE);
parameters.put(JRParameter.REPORT_LOCALE, Locale.CHINA);

} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return parameters;
}

public static void main(String[] args) throws Exception {
new XMLDataSource().viewerReport();
}
}

就是这个类 里面有个new ViewReport().viewer(jasperPrint);   回复  更多评论
  
# re: iReport+jasperReport之CSV、XML数据源
2014-07-30 11:28 | 凌晨风
@李岩风
建议你看一下jasperReport自带的例子  回复  更多评论
  
# re: iReport+jasperReport之CSV、XML数据源
2014-07-30 11:30 | 李岩风
@凌晨风
能给个地址吗  回复  更多评论
  
# re: iReport+jasperReport之CSV、XML数据源
2014-07-30 11:44 | 凌晨风
@李岩风
我这里也没有 好多年前的事情了,QQ:jutleo@gmail.com,可以私聊。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 

<2008年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

留言簿(11)

我参与的团队

随笔分类

随笔档案

文章分类

文章档案

新闻分类

新闻档案

收藏夹

围脖

最新随笔

搜索

  •  

最新评论

阅读排行榜

评论排行榜