莊周夢蝶

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

          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
          主站蜘蛛池模板: 佛学| 乳源| 逊克县| 林芝县| 云阳县| 淮阳县| 锡林郭勒盟| 阜平县| 来凤县| 五莲县| 潜江市| 新津县| 湖北省| 华宁县| 沾益县| 永寿县| 两当县| 彭阳县| 陕西省| 北碚区| 横峰县| 睢宁县| 白河县| 钦州市| 广水市| 盐山县| 沐川县| 肥西县| 贵南县| 卓尼县| 盘山县| 拉孜县| 鄂托克旗| 宝鸡市| 临汾市| 静安区| 英德市| SHOW| 石家庄市| 湘阴县| 荥阳市|