J'utilise le rapport Jasper comme outil de reporting dans ma candidature. Et je me demande comment puis-je envelopper le long texte en développant le reportElement
dynamiquement dans le sens vertical (en élargissant la taille de la ligne, pas la largeur de la colonne). Ou existe-t-il un moyen d'y parvenir? Mon approche ci-dessous est de tronquer le long texte "n nom très long". Pouvez-vous me donner quelques suggestions?
Sortie:
import Java.io.File;
import Java.util.ArrayList;
import Java.util.HashMap;
import Java.util.List;
import Java.util.Map;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import net.sf.jasperreports.view.JasperViewer;
public class JrUtils {
public static void showJrReport(List objectList, String fileName, String title, Map parameters) {
try {
File f = new File(fileName);
JasperDesign jasperDesign = JRXmlLoader.load(f.getAbsolutePath());
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(objectList);
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, ds);
JasperViewer jv = new JasperViewer(jasperPrint, false);
jv.setTitle(title);
jv.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
List<Person> pList = new ArrayList<Person>();
Person p1 = new Person();
p1.setPersonName("Some Name ");
p1.setAddress("Nepal - Address Fits Here");
Person p2 = new Person();
p2.setPersonName("Some very long name");
p2.setAddress("Nepal - Address Fits Here");
pList.add(p1);
pList.add(p2);
showJrReport(pList, "testReport.jrxml", "Test Report", new HashMap<Object, Object>());
}
}
Fichier JrXML du rapport Jasper - testReport.jrxml:
<?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="250" pageHeight="400" columnWidth="210" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<property name="ireport.zoom" value="2.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<field name="personName" class="Java.lang.String"/>
<field name="address" class="Java.lang.String"/>
<columnHeader>
<band height="23" splitType="Stretch">
<rectangle>
<reportElement x="0" y="0" width="88" height="23"/>
</rectangle>
<rectangle>
<reportElement x="88" y="0" width="122" height="23"/>
</rectangle>
<staticText>
<reportElement x="0" y="0" width="88" height="23"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[Name]]></text>
</staticText>
<staticText>
<reportElement x="88" y="0" width="122" height="23"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[Address]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height="21" splitType="Stretch">
<rectangle>
<reportElement x="0" y="0" width="88" height="21"/>
</rectangle>
<textField>
<reportElement x="0" y="0" width="88" height="21"/>
<textElement verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{personName}]]></textFieldExpression>
</textField>
<rectangle>
<reportElement x="88" y="0" width="122" height="21"/>
</rectangle>
<textField>
<reportElement x="88" y="0" width="122" height="21"/>
<textElement verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{address}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
J'ai trouvé la réponse moi-même:
J'ai fait quelques recherches supplémentaires sur les propriétés des composants textField
et rectangle
. Et constaté que je dois définir les propriétés suivantes.
Pour le rectangle:
<rectangle>
<reportElement stretchType="RelativeToBandHeight" ... />
</rectangle>
Pour textField:
<textField isStretchWithOverflow="true">
...
</textField>
Sortie comme prévu:
Le <detail> ...</detail>
section après correction:
<detail>
<band height="21" splitType="Stretch">
<rectangle>
<reportElement stretchType="RelativeToBandHeight" x="0" y="0" width="88" height="21"/>
</rectangle>
<textField isStretchWithOverflow="true">
<reportElement x="2" y="0" width="84" height="21"/>
<textElement verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{personName}]]></textFieldExpression>
</textField>
<rectangle>
<reportElement stretchType="RelativeToBandHeight" x="88" y="0" width="122" height="21"/>
</rectangle>
<textField isStretchWithOverflow="true">
<reportElement x="90" y="0" width="118" height="21"/>
<textElement verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{address}]]></textFieldExpression>
</textField>
</band>
</detail>
MISE À JOUR
Vous pouvez également définir la propriété net.sf.jasperreports.print.keep.full.text
à true
pour y parvenir dans tous vos rapports.
Vous pouvez également rendre la troncature élégante en utilisant les propriétés suivantes définies sur le champ de texte. Vérifiez cela exemple
net.sf.jasperreports.text.truncate.at.char
net.sf.jasperreports.text.truncate.suffix
net.sf.jasperreports.print.keep.full.text