Создание отчетов используя JasperReports
Tuesday, 11. March 2008, 10:32:22
ПРОБЛЕМА: Отоброжение русских шрифтов
РЕШЕНИЕ: необходимо найти где есть кириллические 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:









