JasperReport - 自动换行文本以在文本字段中显示长文本

2022-09-01 04:13:32

我在我的应用程序中使用jasper报告作为报告工具。我想知道如何通过将动态扩展到垂直方向(扩展行大小,而不是列宽)来包装长文本。或者有什么办法可以做到这一点吗?我下面的方法是截断长文本“一些很长的名字”。你能给我一些建议吗?reportElement

输出:

enter image description here

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>());
    }

}

Jasper Report JrXML file - 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>

答案 1

我自己找到了答案:

我对组件的特性和组件做了一些额外的研究。并发现我需要设置以下属性。textFieldrectangle

对于矩形 :

        <rectangle>
            <reportElement stretchType="RelativeToBandHeight" ... />
        </rectangle>

对于文本字段 :

        <textField isStretchWithOverflow="true">
            ...
        </textField>

输出符合预期:

enter image description here

更正后的章节:<detail> ...</detail>

<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>

更新

您还可以将属性设置为在所有报表中实现这一点。net.sf.jasperreports.print.keep.full.texttrue


答案 2

此外,还可以通过使用设置为文本字段的以下属性来使截断变得优雅。检查此示例

net.sf.jasperreports.text.truncate.at.char 
net.sf.jasperreports.text.truncate.suffix 
net.sf.jasperreports.print.keep.full.text 

推荐