Skip navigation.

Other fun...

http://www.google.com/profiles/dooman87

Posts tagged with "jasperreports"

Создание отчетов используя JasperReports

,

Следующая задачка с которой я столкнулся была созданием отчетов. В качестве инструмента был выбран JasperReports. Со всем несложно разобраться читая документацию, но возникают некоторые проблемы, которые я попытаюсь описать:

ПРОБЛЕМА: Отоброжение русских шрифтов
РЕШЕНИЕ: необходимо найти где есть кириллические truetype шрифты в системе(я просто искал в системе: find / -name *.ttf -print > /tmp/ttf.log), далее в сервере приложений идем в Application Server - JVM Settings - Path Settings. В Classpath Suffix добавлеям директорию где лежат шрифты(например в SOLARIS 10 /usr/openwin/lib/locale/KOI8-R/X11/fonts/TrueType). В файл отчета добавляем следующую секцию:
<style name="Arial_Normal" isDefault="true" fontName="Arial" 
           fontSize="8" isBold="false" isItalic="false" 
           isUnderline="false" isStrikeThrough="false" 
           pdfFontName="ArialBold.ttf" pdfEncoding="KOI8-R" 
           isPdfEmbedded="true"/> 


ПРОБЛЕМА: При компиляции отчета, вылетает исключения о ненахождении библиотек
РЕШЕНИЕ: Необходимо в classpath добавить директорию в которой лежат библиотеки. Если компилируете ant'ом(не в runtime'e) можно указать директорию в флаге -lib.

Также jasperreports требует кучу библиотек, но всех их легко найти после NoClassFoundException из имени пакета.

Вот здесь лежит хорошая книжка по jasperreports.

Генерация предкомпилированного отчета выглядит совсем просто:
    public String generateReport() {
        try {
            //Коннектимя к БД.
            InitialContext ic = new InitialContext();
            DataSource ds = (DataSource) ic.lookup("jdbc/mysql/testdb");
            Connection con = ds.getConnection("login", "password");
            //Заполняем отчет.
            JasperPrint print = JasperFillManager.fillReport(
                "/tmp/jasper_test.jasper", 
                new HashMap(), con
            );
            //Экспортируем отчет в pdf файл.
            JasperExportManager.exportReportToPdfFile(print, 
                getServletContext().getRealPath("") + 
                       "/JasperTest/report.pdf"
            );
        } catch (Exception e) {
            return e.getMessage();
        }

        //Возвращаем линк на сгенерированный отчет
        return getServletContext().getRealPath("") 
             + "/JasperTest/report.pdf";
    }

Компиляция запроса в runtime'e также не вызывает проблем.


Вот файл который был создан для генерации отчета:
<?xml version="1.0"?>

<!DOCTYPE jasperReport PUBLIC "-//JasperReports//DTD Report Design//EN" 
           "http://jasperReports.sourceforge.net/dtds/jasperreport.dtd">


<jasperReport name="SimpleReport" columnCount="4" columnWidth="100">

<style name="Arial_Normal" isDefault="true" fontName="Arial" 
           fontSize="8" isBold="false" isItalic="false"
           isUnderline="false" isStrikeThrough="false"
           pdfFontName="ArialBold.ttf" pdfEncoding="KOI8-R" 
           isPdfEmbedded="true"/>

<queryString>

<![CDATA[select Name,Street,Phone,E_Mail from Companys]]>

</queryString>

<field name="Name" class="java.lang.String"/>

<field name="Street" class="java.lang.String"/>

<field name="Phone" class="java.lang.String"/>

<field name="E_Mail" class="java.lang.String"/>

<background>
    <band height="745">
        <image scaleImage="FillFrame" hAlign="Left" vAlign="Bottom">
            <reportElement x="0" y="0" width="595" height="745"/>
            <imageExpression>"/tmp/image.gif"</imageExpression>
        </image>
    </band>
</background>

<columnHeader>
    <band height="25">
        <staticText>
            <reportElement x="0" y="0" height="20" width="84"/>
            <text>Name</text>
        </staticText>
        <staticText>
            <reportElement x="140" y="0" height="20" width="84"/>
            <text>Street</text>
        </staticText>
        <staticText>
            <reportElement x="280" y="0" height="20" width="84"/>
            <text>Phone</text>
        </staticText>
        <staticText>
            <reportElement x="420" y="0" height="20" width="84"/>
            <text>Email</text>
        </staticText>
        <line>
            <reportElement x="0" y="21" width="555" height="0"/>
        </line>
    </band>
</columnHeader>



<detail>

<band height="30">

<textField>

<reportElement x="0" y="0" width="69" height="24"/>

<textFieldExpression class="java.lang.String">

<![CDATA[$F{Name}]]>

</textFieldExpression>

</textField>

<textField>

<reportElement x="140" y="0" width="69" height="24"/>

<textFieldExpression class="java.lang.String">

<![CDATA[$F{Street}]]>

</textFieldExpression>

</textField>

<textField>

<reportElement x="280" y="0" width="69" height="24"/>

<textFieldExpression class="java.lang.String">

<![CDATA[$F{Phone}]]>

</textFieldExpression>

</textField>

<textField>

<reportElement x="420" y="0" width="69" height="24"/>

<textFieldExpression class="java.lang.String">

<![CDATA[$F{E_Mail}]]>

</textFieldExpression>

</textField>

</band>

</detail>

</jasperReport>


А вот что получилось в итоге после сохранения в xml:


Download Opera, the fastest and most secure browser