`
sunsy
  • 浏览: 37824 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Jasper编程方式实现报表导出

阅读更多
项目里用到了jasperreport,平时都是用ireport来设计好报表模板直接使用就好了,但是碰到动态表头等情况就比较麻烦了,而且有些报表可能仅是针对一个数据表或者说一个实体对象的操作,对于这种报表一个个设计JRXML也比较麻烦,尝试了一下编程的方式来生成报表,只是个简单的测试。在网上找一些资料发现纯编程来写报表的相关内容很少,也是看了相关的API后才写了个例子。

ReportProcess.java是一个简单的用来构造、编译并导出报表的类。
package jasper.test;

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;

import net.sf.jasperreports.engine.JRException;
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.design.JRDesignBand;
import net.sf.jasperreports.engine.design.JRDesignExpression;
import net.sf.jasperreports.engine.design.JRDesignField;
import net.sf.jasperreports.engine.design.JRDesignStaticText;
import net.sf.jasperreports.engine.design.JRDesignTextField;
import net.sf.jasperreports.engine.design.JasperDesign;

public class ReportProcess {

	public static void main(String[] args) {
		try {
			JasperReport jp = getJasperReport();
			InputStream in = new FileInputStream(
					"src/test/java/jasper/test/Data.csv");// 换成自己目录
			CsvDataSource csvDataSource = new CsvDataSource(
					new InputStreamReader(in));
			in.close();

			JasperPrint jpr = JasperFillManager.fillReport(jp, null,
					csvDataSource);
			JasperExportManager.exportReportToHtmlFile(jpr, "c:/test.html");// 写的时候随便指定了个查看的目录
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static JasperReport getJasperReport() throws JRException {
		JasperDesign design = new JasperDesign();
		design.setName("testReport");

		JRDesignBand title = new JRDesignBand();
		title.setHeight(50);
		JRDesignStaticText titleText = new JRDesignStaticText();
		titleText.setText("test report");
		titleText.setX(230);
		titleText.setFontSize(20);
		titleText.setHeight(50);
		titleText.setWidth(100);
		title.addElement(titleText);
		design.setTitle(title);

		String[] headers = { "name", "age", "gender", "like" };
		JRDesignBand columnHeader = new JRDesignBand();
		columnHeader.setHeight(30);

		JRDesignBand detail = new JRDesignBand();
		detail.setHeight(30);

		for (int i = 0; i < headers.length; i++) {
			// add column headers
			JRDesignStaticText staticText = new JRDesignStaticText();
			staticText.setText(headers[i]);
			staticText.setFontSize(16);
			staticText.setHeight(30);
			staticText.setWidth(50);
			staticText.setX(50 * i);
			columnHeader.addElement(staticText);

			// define fields
			JRDesignField field = new JRDesignField();
			field.setName(headers[i]);
			field.setValueClass(String.class);
			design.addField(field);

			// add text fields for displaying fields
			JRDesignTextField textField = new JRDesignTextField();
			JRDesignExpression expression = new JRDesignExpression();
			expression.setText("$F{" + headers[i] + "}");
			expression.setValueClass(String.class);
			textField.setExpression(expression);
			textField.setFontSize(14);
			textField.setHeight(30);
			textField.setWidth(50);
			textField.setX(50 * i);
			detail.addElement(textField);
		}
		design.setColumnHeader(columnHeader);
		design.setDetail(detail);

		return JasperCompileManager.compileReport(design);
	}

}


CsvDataSource.java是摘自JASER例子里的一个数据源实现,有现成的做例子的时候就拿来用了,用这个比较简单,不用写数据库那一堆。
package jasper.test;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Reader;
import java.util.List;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;
import net.sf.jasperreports.engine.JRRewindableDataSource;
import au.com.bytecode.opencsv.CSVReader;

/**
 * 
 * 这个类摘自JASPER带的一个例子里的CSV数据源实现。
 * 
 */
public class CsvDataSource implements JRRewindableDataSource {
	private CSVReader csvReader;
	private List rows;
	private int currentRowIndex = -1;
	private int currentColIndex = 0;
	private int totalRows;

	public CsvDataSource(Reader reader) {
		try {
			csvReader = new CSVReader(reader);
			rows = csvReader.readAll();
			totalRows = rows.size();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public boolean next() throws JRException {
		boolean retVal = true;

		currentRowIndex++;
		currentColIndex = 0;

		if (currentRowIndex >= totalRows) {
			retVal = false;
		}

		return retVal;
	}

	public Object getFieldValue(JRField arg0) throws JRException {
		String value = null;
		String[] currentRow = (String[]) rows.get(currentRowIndex);

		value = currentRow[currentColIndex];
		currentColIndex++;

		return value;
	}

	public void moveFirst() throws JRException {
		currentRowIndex = 0;
		currentColIndex = 0;
	}
}


Data.csv里的数据。
jim,12,male,basketball
lily,13,female,dancing
david,23,male,swimming
su,23,female,running


结果大致是这个样子。
                  test report  
 name    age   gender   like  
 jim     12    male     basketb  
 lily    13    female   dancing  
 david   23    male     swimmi
 su      23    female   running 


这里就是个实验性的代码,但至少可以知道,我们可以通过一些手段来编程处理JASPER的报表。可以写得更完善一些,动态获取表头个数与内容,写QUERY查询,填充报表。
比如一张表有一部分表头是不定的,那就可以在程序中追加表头定义,追加字段定义等。
分享到:
评论
7 楼 happly 2008-04-07  
有什么办法生成柱状图.
6 楼 diystyle 2007-12-03  
其实动态的表头功能,其实如果报表格式(布局)简单一点的话,完全可以通过程序来构造报表文件,然后通过报表的xml,通过程序动态的编译成jasper文件,同时实现一个jasper的JRDataSource,这样自己处理报表就灵活了许多。思路和 sunsy 的有点类似
5 楼 fire01312 2007-12-03  
在网上找一些资料发现纯编程来写报表的相关内容很少,也是看了相关的API后才写了个例子。

你在那找的api文档啊 ?? 我也想研究研究  谢谢!
4 楼 laiseeme 2007-08-21  
sql语句里面的from table 这个table可以是变量么?
3 楼 ssy8110 2007-08-21  
duochunyu 写道
嗯~~~,谢谢分享思路,我现在结合ireport设计报表样式,也为动态表头头疼,可以参考参考,谢谢楼主。
    当然,这么做貌似对数据的规则性就要求很强了。。
    我现在ireport设计模版时直接用的jdbc - sql 方式获取数据结构,配置完报表模版后,实际运行时,数据则是动态从hibernate加载(当然,有些复杂的查询直接用hib的执行sql方式获取的数据),唯一不够灵活的就是动态表头和数据条件的问题,哎。。。总觉得老外的报表不够灵活。。。。
动态表头,可以使用交叉报表来实现呀
2 楼 duochunyu 2007-08-08  
嗯~~~,谢谢分享思路,我现在结合ireport设计报表样式,也为动态表头头疼,可以参考参考,谢谢楼主。
    当然,这么做貌似对数据的规则性就要求很强了。。
    我现在ireport设计模版时直接用的jdbc - sql 方式获取数据结构,配置完报表模版后,实际运行时,数据则是动态从hibernate加载(当然,有些复杂的查询直接用hib的执行sql方式获取的数据),唯一不够灵活的就是动态表头和数据条件的问题,哎。。。总觉得老外的报表不够灵活。。。。
1 楼 sunsy 2007-07-05  
不知道大家在处理动态表头之类的报表时有什么好的方法可以共享一下。

相关推荐

    Ireport中文详细资料(上册)

    5. "Java_JasperReport"和"Jasper编程方式实现报表导出-企业应用-Java -JavaEye做最棒的软件开发交流社区.files":这部分内容可能涉及到JasperReport的Java编程接口,讲解如何通过编程方式与JasperReport交互,实现...

    ireport+jsp基于jasperReport 实现导出报表至web页面

    标题中的“ireport+jsp基于jasperReport 实现导出报表至web页面”是指使用iReport工具和JasperReport库,结合JavaServer Pages (JSP) 技术,来创建和展示动态报表,并能将这些报表导出到Web页面上供用户查看。...

    ireport + jasper的使用

    然后在Java项目中引入jasperreports库,通过编程方式加载jrxml文件,指定数据源,执行填充操作,最后调用jasper提供的API将报表导出为所需格式。例如,以下是一个简单的示例: ```java // 加载jrxml文件 ...

    JAVA+IREPORT实现报表功能

    本教程主要聚焦于使用JAVA和IREPORT来实现报表功能,包括PDF和EXCEL的生成。下面将详细介绍这两个技术及其结合使用的方法。 JAVA,全称Java编程语言,是一种广泛应用于服务器端开发的高级编程语言,具有跨平台、...

    JasperReport 水晶报表

    - **自定义逻辑:** 用户可以通过编程方式添加自定义逻辑,增强报表的复杂性和功能。 - **报表服务器:** 拥有自己的报表服务器,便于报表的管理和分发。 **3. JasperReport与水晶报表的对比:** - **开源与闭源:*...

    jasper-jarbao3-7

    1. **JasperReports组件**:JasperReports由多个组件组成,如JasperReport本身用于创建报表设计,JasperServer提供报表服务器功能,JasperExportManager用于导出报表,JasperFillManager用于填充报表,...

    jasperreport+ireport创建javaBean多数据源报表

    它支持多种数据源,包括数据库、CSV文件、JavaBeans等,并且可以将报表导出为PDF、HTML、Excel等多种格式。jasperreport的核心是基于XML的设计模板,这些模板可以通过ireport设计工具进行可视化编辑。 ireport是...

    JasperReport+iReport报表工具

    JSP(JavaServer Pages)是一种用于生成动态网页内容的技术,JasperReport可以将报表导出为JSP页面,便于在Web环境中展示。Java是一种广泛使用的编程语言,JasperReport和iReport都是用Java编写,因此运行这些工具...

    iReport-4.5.1(jasper视图编辑工具)

    iReport是专为JasperReports库和JasperReports Server打造的一款强大的报表可视化设计工具,它为用户提供了直观的图形化界面,使得非编程背景的人员也能轻松创建复杂的报表和图表。iReport 4.5.1是其一个稳定版本,...

    java+ireport报表开发实例

    它提供了一个WYSIWYG(所见即所得)的环境,允许开发者通过拖放方式添加表格、图表、文本等元素,实现报表的定制。iReport与Java的JasperReports库紧密集成,使得报表可以无缝地嵌入到Java应用程序中。 二、iReport...

    iReport web报表开发实例

    通过编程方式生成报表实例,然后将其输出到HTTP响应流中。如果使用的是Java EE框架,如Spring MVC,可以创建一个控制器方法来处理报表的生成和下载请求。 九、最佳实践 在实际开发中,应遵循一些最佳实践,如合理...

    java和ireport制作报表实例

    总的来说,Java与iReport结合可以实现灵活、高效的报表系统。通过熟练掌握这两个工具,开发者能构建出满足各种需求的定制化报表,为企业决策提供有力支持。这个实例提供了实践这些概念的机会,对于学习和提升报表...

    基于Jasperreport动态单元格合并模板

    通过编程方式或在JRXML中设置`net.sf.jasperreports.export.xls.auto.fit`属性,可以控制在导出到Excel时是否自动调整列宽。 2. **多层分组**:JasperReport支持多级分组,这意味着可以按照多个字段对数据进行层次...

    编程语言java+ireport应用.pdf

    - `JasperExportManager`或其子类(如`JExcelApiExporter`、`JRHtmlExporter`)用于将报表导出为不同格式,如HTML、XLS或PDF。例如,`selectHtmlReport`方法会将报表输出为HTML,以便在网页上显示。 - 通过设置...

    JasperReport报表设计总结

    例如,可以将报表导出为PDF文件,或者直接在Web应用中显示报表。 ##### 4. 示例代码:JDBCConnection类 下面是一个简单的示例,展示了如何使用JDBCConnection类来获取数据库连接并传递给JasperReport使用。 ```...

    jasperserver-restclient:Jasper Server Rest客户端

    总之,Jasper Server Rest客户端为Java开发者提供了一个强大且灵活的工具,使他们能够在Java应用程序中无缝集成JasperServer的功能,实现报表的自动化管理和执行。通过熟练掌握RESTful API的使用,开发者可以大大...

    基于java的JasperReports 报表类库v3.5.zip

    - **PDF、HTML、Excel等导出**: JasperReports可以将报表导出为多种格式,满足不同场景的需求。 - **动态交互**: 支持JavaScript和Ajax技术,实现Web环境下的动态报表,如筛选、排序和钻取。 5. **JasperReports ...

    jasperreport报表模板预览 applet与servlet通信

    Servlet可能需要调用JasperFillManager来填充报表,JasperExportManager来导出报表,以及JasperPrint对象来存储报表的打印信息。 Applet与Servlet之间的通信通常通过HTTP请求完成,可能是GET或POST方式。Applet会...

Global site tag (gtag.js) - Google Analytics