将报告生成为txt文件 - 如何在“列标题”和“详细信息”区域中设置文本的确切位置和大小

时间:2013-10-26 04:27:04

标签: java jasper-reports fixed-width

我们要求使用 JasperReports 生成文本报告 精度必须准确,样本格式如下

enter image description here

  1. 标题用户名必须从第0列开始。
  2. 上次访问的标题必须从第23列开始。
  3. 标题处于活动状态必须从第34列开始。
  4. 行分隔符必须包含8个字符(---)并从第22列开始
  5. 名称字段必须左对齐并从第1列开始
  6. 点数字段必须右对齐并在第45列结束,精确到1位。
  7. JasperReports exportToText 方法不符合上述条件,并且 .jrxml 的重复调整无法达到目的。 /> 我们也调整了字符宽度和字符高度,但行和列之间的间距仍然不正确。

    JasperReports API 是否支持文本格式的精确度?
    还有其他API可以帮助我们实现这种格式吗?

1 个答案:

答案 0 :(得分:2)

是的,您可以使用 JasperReports 实现您的设计。

解决任务的步骤。

  1. 第一步。 我们应该在行中的字符数和页面上的行数。
    出于此目的,我们可以使用net.sf.jasperreports.export.text.page.widthnet.sf.jasperreports.export.text.page.height报告的属性对。您还可以使用net.sf.jasperreports.export.text.character.widthnet.sf.jasperreports.export.text.character.height对报告的属性而不是第一个属性。

  2. 第二步。我们知道页面格式的大小(例如以像素为单位。对于没有边距的A4,它是:555x802),我们在页面上设置行和行中的字符数。我们可以计算并设置 staticText textField 元素位置的精确值( x y 坐标和< em> width 和 height 元素的属性),

  3. 样本

    样本数据

    我使用了 csv 数据源( points.csv 文件):

    USER_NAME,LAST_ACCESSED,IS_ACTIVE,POINTS
    John Doe,10/26/2013,Y,87.9
    Sarah Connor,10/23/2013,Y,80.5
    Viktor Navorski,10/14/2013,Y,95.5
    Forrest Gump,10/25/2013,Y,97.0
    Raymond Babbitt,10/24/2013,Y,88.5
    Thomas Crown,10/24/2013,Y,88.0
    Danny Ocean,09/30/2013,Y,90.5
    

    报告设计

    我删除了边距并设置了 A4 报告的格式(555x802像素)。

    enter image description here

    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="text_output" language="groovy" pageWidth="555" pageHeight="802" columnWidth="555" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" uuid="9a0b1db2-1ed0-44e1-960b-4626cea0097d">
        <property name="net.sf.jasperreports.export.text.page.width" value="80"/>
        <property name="net.sf.jasperreports.export.text.page.height" value="40"/>
        <field name="USER_NAME" class="java.lang.String"/>
        <field name="LAST_ACCESSED" class="java.lang.String"/>
        <field name="IS_ACTIVE" class="java.lang.String"/>
        <field name="POINTS" class="java.lang.String"/>
        <columnHeader>
            <band height="43" splitType="Stretch">
                <staticText>
                    <reportElement uuid="d065f8ed-0c05-47d0-a679-a392c9cfabe5" x="0" y="0" width="152" height="20"/>
                    <textElement/>
                    <text><![CDATA[USER_NAME]]></text>
                </staticText>
                <staticText>
                    <reportElement uuid="573550a9-5fc9-41ee-ae4f-7b550868c75d" x="152" y="0" width="143" height="20"/>
                    <textElement/>
                    <text><![CDATA[LAST_ACCESSED]]></text>
                </staticText>
                <staticText>
                    <reportElement uuid="4b1f5b5c-4c61-4159-9357-041fd8e3e775" x="295" y="0" width="138" height="20"/>
                    <textElement/>
                    <text><![CDATA[IS_ACTIVE]]></text>
                </staticText>
                <staticText>
                    <reportElement uuid="1c851f50-9ace-4e30-be1e-7d5454127db8" x="433" y="0" width="103" height="20"/>
                    <textElement/>
                    <text><![CDATA[POINTS]]></text>
                </staticText>
                <staticText>
                    <reportElement uuid="7e358a83-b348-40ca-b6f4-009d6bed4b24" x="0" y="20" width="100" height="23"/>
                    <textElement/>
                    <text><![CDATA[----------------------]]></text>
                </staticText>
                <staticText>
                    <reportElement uuid="523a7abd-0fbd-4b63-b8d5-2ed78ee795cc" x="295" y="20" width="100" height="23"/>
                    <textElement/>
                    <text><![CDATA[---------]]></text>
                </staticText>
                <staticText>
                    <reportElement uuid="7ebe2ec7-9450-4fdf-b99a-48af5fe3ce49" x="152" y="20" width="100" height="23"/>
                    <textElement/>
                    <text><![CDATA[-------------]]></text>
                </staticText>
                <staticText>
                    <reportElement uuid="155d3972-9d99-4d3b-bb41-05f08dcdd5fa" x="433" y="20" width="100" height="23"/>
                    <textElement/>
                    <text><![CDATA[--------]]></text>
                </staticText>
            </band>
        </columnHeader>
        <detail>
            <band height="20" splitType="Stretch">
                <textField>
                    <reportElement uuid="652256e2-0f1e-4848-b1d0-d064caaa5020" x="0" y="0" width="152" height="20"/>
                    <textElement/>
                    <textFieldExpression><![CDATA[$F{USER_NAME}]]></textFieldExpression>
                </textField>
                <textField>
                    <reportElement uuid="380af714-4dbd-4e0f-ae23-bfada0449a2f" x="152" y="0" width="143" height="20"/>
                    <textElement/>
                    <textFieldExpression><![CDATA[$F{LAST_ACCESSED}]]></textFieldExpression>
                </textField>
                <textField>
                    <reportElement uuid="752c0f18-2dea-4209-bd0d-d787d8c462a8" x="295" y="0" width="63" height="20"/>
                    <textElement textAlignment="Right"/>
                    <textFieldExpression><![CDATA[$F{IS_ACTIVE}]]></textFieldExpression>
                </textField>
                <textField>
                    <reportElement uuid="40807ad0-58a4-42b7-9636-04f01c0c3bf5" x="433" y="0" width="54" height="20"/>
                    <textElement textAlignment="Right"/>
                    <textFieldExpression><![CDATA[$F{POINTS}]]></textFieldExpression>
                </textField>
            </band>
        </detail>
    </jasperReport>
    

    结果 - 通过JRTextExporter生成的txt文件

    我已经使用 iReport 生成输出文件。此 txt 文件的内容为:

    The report generated as txt file

    使用Java代码

    如果使用 Java 代码,我们应该为JRTextExporter设置这些参数:JRTextExporterParameter.PAGE_WIDTHJRTextExporterParameter.PAGE_HEIGHT

    示例代码:

    public static void generateReport() throws JRException {
        JRCsvDataSource dataSource = new JRCsvDataSource(JRLoader.getLocationInputStream(csvFileName));
        dataSource.setRecordDelimiter("\r\n");
        dataSource.setUseFirstRowAsHeader(true);
        dataSource.setColumnNames(new String[]{ "USER_NAME", "LAST_ACCESSED", "IS_ACTIVE", "POINTS"});
    
        JasperReport jasperReport = JasperCompileManager.compileReport(reportSource);
        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, dataSource);
    
        JRTextExporter exporter = new JRTextExporter();
    
        exporter.setParameter(JRTextExporterParameter.PAGE_WIDTH, 80);
        exporter.setParameter(JRTextExporterParameter.PAGE_HEIGHT, 40);
        exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
        exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, outputFileName);
        exporter.exportReport();
    }
    

    在此示例中,我使用了相同的 csv 文件作为数据源。


    我们如何计算x坐标

    在您的示例中,您希望以23个符号开始第二列。好的,让我看看我的样本。我们有什么:

    • 页面宽度为 555 像素
    • 行中的字符数为 80

    在这种情况下,一个字符的宽度为 555/80 = 6,9375
    我们在第二列的第一个符号之前有22个符号。它是 22 * 6,9375 = 152,625 像素。在我的示例中,我为第二列标题的 x 属性设置了 152 。在我的示例中,第二列标题中的第一个符号的位置为 23

    对于第三列,计算值为 43 * 6,9375 = 298,3125 ,我样本中的实际 x 295 (第3列用 44 符号标记星号)。

    正如您所看到的,计算过于准确。


    <强> 注意:

    您可以在此处找到有关导出到文本文件的信息:Text Export Sample