Skip navigation.

Other fun...

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

Создание отчетов используя 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:


СветофорыПутешествие в Чехию

Comments

Alen4ik 13. March 2008, 09:05

Послание от моего "самого интересного" блога вашему самому интересному: мгм... круто!)))

Anonymous 26. November 2008, 08:17

Yoda writes:

Намана. Только "Отоброжение русских шрифтов" даже меня, тёмного человека, смутило. Главное я не понял, как делается "брожение шрифтов".

Pokidov Dmitriy 26. November 2008, 09:24

Надо подумать чем заменить...

Anonymous 23. March 2009, 10:21

Анонімний writes:

Программный способ задания кирилицы:

JRPdfExporter pdfExporter = new JRPdfExporter();
pdfExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
pdfExporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, name + ".pdf");


HashMap fontMap = new HashMap ();
FontKey key = new FontKey("Times New Roman", true, false);
PdfFont font = new PdfFont("c:\\temp\\timesbd.ttf", "Cp1251", true);
FontKey key1 = new FontKey("Times New Roman", false, false);
PdfFont font1 = new PdfFont("c:\\temp\\times.ttf", "Cp1251", true);
fontMap.put(key, font);
fontMap.put(key1, font1);
pdfExporter.setParameter(JRExporterParameter.FONT_MAP, fontMap);



pdfExporter.exportReport();

Pokidov Dmitriy 23. March 2009, 10:37

Спасибо, будем знать.

How to use Quote function:

  1. Select some text
  2. Click on the Quote link

Write a comment

Comment
(BBcode and HTML is turned off for anonymous user comments.)

If you can't read the words, press the small reload icon.


Smilies

Download Opera, the fastest and most secure browser