莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          JasperReport與hibernate結合使用

          Posted on 2007-02-06 12:31 dennis 閱讀(3115) 評論(1)  編輯  收藏 所屬分類: java
          花了兩天時間,終于把jasperreport與項目中使用的hibernate結合使用.最新版本的ireport支持HQL查詢,可以在 ireport里面寫HQL語句查詢并設計好報表.需要注意的是把hibernate.cfg.xml包括進classpath!!(菜單options ->classpath進行設置)給張圖:

          test2.jpg

          設計好報表之后編譯成jasper文件,在servlet中調用,我們需要實現自己的hibernate datasource:

          public class HibernateQueryResultDataSource implements JRDataSource {

          ?private String[] fields;

          ?private Iterator iterator;

          ?private Object currentValue;

          ?public HibernateQueryResultDataSource(List list, String[] fields) {
          ??this.fields = fields;
          ??this.iterator = list.iterator();
          ?}

          ?public Object getFieldValue(JRField field) throws JRException {
          ??Object value = null;
          ??int index = getFieldIndex(field.getName());
          ??if (index > -1) {
          ???Object[] values = (Object[]) currentValue;
          ???value = values[index];
          ??}
          ??return value;
          ?}

          ?public boolean next() throws JRException {
          ??currentValue = iterator.hasNext() ? iterator.next() : null;
          ??return (currentValue != null);
          ?}

          ?private int getFieldIndex(String field) {
          ??int index = -1;
          ??for (int i = 0; i < fields.length; i++) {
          ???if (fields[i].equals(field)) {
          ????index = i;
          ????break;
          ???}
          ??}
          ??return index;
          ?}

          }

          此類構造函數需要兩個參數,查詢結果的list以及查詢的所有屬性名(這些屬性名必須和報表界面的field名一致)

          ,使用方式如下:

          1.導出pdf:

          File reportFile = new File(getServletContext().getRealPath(
          ????"/reports/" + queryResult.getReportFileName() + ".jasper"));

          ??HibernateQueryResultDataSource dataSource = new HibernateQueryResultDataSource(
          ????queryResult.getList(parameters), queryResult.getFields());
          ??if (reportType.equals("pdf") || reportType.equals("")) {
          ???try {
          ????byte[] bytes = JasperRunManager.runReportToPdf(reportFile
          ??????.getPath(), null, dataSource);
          ????response.setContentType("application/pdf");
          ????response.setContentLength(bytes.length);
          ????ServletOutputStream ouputStream = response.getOutputStream();
          ????ouputStream.write(bytes, 0, bytes.length);
          ????ouputStream.flush();
          ????ouputStream.close();

          ???} catch (Exception e) {
          ????e.printStackTrace();
          ???}
          ??}

          2.導出excel,需要把poi-2.0-final-20040126.jar放進web的lib里:

          try {

          ????JasperPrint print = JasperFillManager.fillReport(
          ??????new FileInputStream(reportFile), null, dataSource);
          ????// JRXlsExporter t=null;
          ????JRXlsExporter jRXlsExporter = new JRXlsExporter();
          ????ByteArrayOutputStream xlsReport = new ByteArrayOutputStream();
          ????jRXlsExporter.setParameter(JRExporterParameter.JASPER_PRINT,
          ??????print);
          ????jRXlsExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
          ??????xlsReport);
          ????jRXlsExporter
          ??????.setParameter(
          ????????JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,
          ????????Boolean.TRUE);
          ????jRXlsExporter.setParameter(
          ??????JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,
          ??????Boolean.TRUE);
          ????// jRXlsExporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,ReportsConstants.bankDetailsHtml);

          ????// jRXlsExporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,
          ????// Boolean.TRUE);

          ????jRXlsExporter.exportReport();
          ????byte[] bytes = xlsReport.toByteArray();

          ???
          ????response.setContentType("application/vnd.ms-excel");
          ????response.setContentLength(bytes.length);
          ????xlsReport.close();
          ????OutputStream ouputStream = response.getOutputStream();
          ????ouputStream.write(bytes, 0, bytes.length);
          ????ouputStream.flush();
          ????ouputStream.close();

          ???} catch (Exception e) {
          ????e.printStackTrace();
          ???}


          評論

          # re: JasperReport與hibernate結合使用  回復  更多評論   

          2008-05-26 09:41 by wanglijun
          我不知道那里配置問題的文件,在iReport使終找不到Hibarnate的映射文件。能不能給我一點資料。我的E-mail是:czwangli88@126.com。Thank you
          主站蜘蛛池模板: 华安县| 蒙城县| 漯河市| 南康市| 从江县| 长寿区| 鹿邑县| 秦皇岛市| 沾化县| 威宁| 克东县| 马尔康县| 铜山县| 天台县| 宣威市| 五家渠市| 桐庐县| 长岭县| 泰兴市| 伊金霍洛旗| 松滋市| 南康市| 新泰市| 淮北市| 依安县| 饶阳县| 贡觉县| 珠海市| 高淳县| 息烽县| 龙游县| 喀什市| 保靖县| 库车县| 岱山县| 翁源县| 双柏县| 怀来县| 宜城市| 那坡县| 久治县|