воскресенье, 15 ноября 2009 г.

JasperReports: формирование отчета из модели таблицы.

Итак JasperReports - мощная библиотека для создания отчетов.Информация на р;усском о том, что это такое, и примеры можно найти в записках искателей

О выборке данных из базы данных там хорошо написано, но вот появилась необходимость создать отчет с данными отображаемыми в JTable. Принципиально в этом нет ничего сложного: для этого служит класс JRTableModelDataSource. Параметром ему передается TableModel:

mod = jTable1.getModel();
   JRTableModelDataSource map = new JRTableModelDataSource(mod);
try {
JasperReport rep = JasperCompileManager.compileReport("MapReport.jrxml"); 
JasperPrint jasperPrint = JasperFillManager.fillReport(rep,new HashMap(),map);
JasperViewer.viewReport(jasperPrint);
}catch (JRException ex) {
ex.printStackTrace();
}


* This source code was highlighted with Source Code Highlighter.


В шаблоне же SQL запрос не пишется, необходимо только описать переменные, названия которых будут равны названиям соответствующих столцов таблицы.  При этом важно, что бы реальный тип данных в столбце был таким же как и тип в описании переменной в шаблоне, в противном случае будет ошибка.

Простой шаблон, который отобразит данные:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="report name" pageWidth="595" pageHeight="842" columnWidth="535" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
  <field name="name" class="java.lang.String"/>
  <field name="zn" class="java.lang.String"/>
  <detail>
    <band height="20" splitType="Stretch">
      <textField>
        <reportElement x="0" y="0" width="194" height="20"/>
        <textElement/>
        <textFieldExpression class="java.lang.String"><![CDATA[$F{name}]]></textFieldExpression>
      </textField>
      <textField>
        <reportElement x="230" y="0" width="325" height="20"/>
        <textElement/>
        <textFieldExpression class="java.lang.String"><![CDATA[$F{zn}]]></textFieldExpression>
      </textField>
    </band>
  </detail>
</jasperReport>

* This source code was highlighted with Source Code Highlighter.