我们要求使用 JasperReports 生成文本报告 精度必须准确,样本格式如下
JasperReports , exportToText 方法不符合上述条件,并且 .jrxml 的重复调整无法达到目的。 /> 我们也调整了字符宽度和字符高度,但行和列之间的间距仍然不正确。
JasperReports API 是否支持文本格式的精确度?
还有其他API可以帮助我们实现这种格式吗?
答案 0 :(得分:2)
是的,您可以使用 JasperReports 实现您的设计。
第一步。 我们应该在行中的字符数和页面上的行数。
出于此目的,我们可以使用net.sf.jasperreports.export.text.page.width和net.sf.jasperreports.export.text.page.height报告的属性对。您还可以使用net.sf.jasperreports.export.text.character.width和net.sf.jasperreports.export.text.character.height对报告的属性而不是第一个属性。
第二步。我们知道页面格式的大小(例如以像素为单位。对于没有边距的A4,它是:555x802),我们在页面上设置行和行中的字符数。我们可以计算并设置 staticText 和 textField 元素位置的精确值( x , y 坐标和< em> width 和 height 元素的属性),
我使用了 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像素)。
<?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>
我已经使用 iReport 生成输出文件。此 txt 文件的内容为:
如果使用 Java 代码,我们应该为JRTextExporter设置这些参数:JRTextExporterParameter.PAGE_WIDTH和JRTextExporterParameter.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 文件作为数据源。
在您的示例中,您希望以23个符号开始第二列。好的,让我看看我的样本。我们有什么:
在这种情况下,一个字符的宽度为 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