3

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

在此处输入图像描述

  1. 标题用户名必须从第 0 列开始。
  2. 最后访问的标题必须从第 23 列开始。
  3. 标题处于活动状态必须从第 34 列开始。
  4. 行分隔符必须有 8 个字符 (---) 并从第 22 列开始
  5. 名称字段必须左对齐并从第 1 列开始
  6. 点字段必须右对齐并在第 45 列结束,精确到 1 位。

JasperReportsexportToText方法不满足上述条件,重复调整.jrxml无法达到目的。
我们也调整了字符宽度和字符高度,但行和列之间的间距仍然不正确。

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

4

1 回答 1

5

是的,您可以使用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)并且我们设置了行中的字符数和页面中的行数。我们可以计算和设置staticTexttextField元素位置的精确值( xy坐标和元素的宽度高度属性),

样本

样本数据源

我使用了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 像素)。

在此处输入图像描述

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文件的内容是:

生成为 txt 文件的报告

使用 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(第三列星号为44 个符号)。

如您所见,计算太准确了。


笔记:

您可以在此处找到有关导出到文本文件的信息:文本导出示例

于 2013-10-26T19:24:09.390 回答