浏览 9465 次
锁定老帖子 主题:Jasper编程方式实现报表导出
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-07-05
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查询,填充报表。 比如一张表有一部分表头是不定的,那就可以在程序中追加表头定义,追加字段定义等。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-07-05
不知道大家在处理动态表头之类的报表时有什么好的方法可以共享一下。
|
|
返回顶楼 | |
发表时间:2007-08-08
嗯~~~,谢谢分享思路,我现在结合ireport设计报表样式,也为动态表头头疼,可以参考参考,谢谢楼主。
当然,这么做貌似对数据的规则性就要求很强了。。 我现在ireport设计模版时直接用的jdbc - sql 方式获取数据结构,配置完报表模版后,实际运行时,数据则是动态从hibernate加载(当然,有些复杂的查询直接用hib的执行sql方式获取的数据),唯一不够灵活的就是动态表头和数据条件的问题,哎。。。总觉得老外的报表不够灵活。。。。 |
|
返回顶楼 | |
发表时间:2007-08-21
duochunyu 写道 嗯~~~,谢谢分享思路,我现在结合ireport设计报表样式,也为动态表头头疼,可以参考参考,谢谢楼主。
动态表头,可以使用交叉报表来实现呀
当然,这么做貌似对数据的规则性就要求很强了。。 我现在ireport设计模版时直接用的jdbc - sql 方式获取数据结构,配置完报表模版后,实际运行时,数据则是动态从hibernate加载(当然,有些复杂的查询直接用hib的执行sql方式获取的数据),唯一不够灵活的就是动态表头和数据条件的问题,哎。。。总觉得老外的报表不够灵活。。。。 |
|
返回顶楼 | |
发表时间:2007-08-21
sql语句里面的from table 这个table可以是变量么?
|
|
返回顶楼 | |
发表时间:2007-12-03
在网上找一些资料发现纯编程来写报表的相关内容很少,也是看了相关的API后才写了个例子。
你在那找的api文档啊 ?? 我也想研究研究 谢谢! |
|
返回顶楼 | |
发表时间:2007-12-03
其实动态的表头功能,其实如果报表格式(布局)简单一点的话,完全可以通过程序来构造报表文件,然后通过报表的xml,通过程序动态的编译成jasper文件,同时实现一个jasper的JRDataSource,这样自己处理报表就灵活了许多。思路和 sunsy 的有点类似
|
|
返回顶楼 | |