繁体   English   中英

如何用数据库中的信息填充HashMap,然后将其添加到Jasper报告中?

[英]How do I fill my HashMap with information from my database, and then add it to my Jasper Report?

我正在尝试使用数据库中的信息填充HashMap参数。 我创建了一个SQL查询来检索信息,并创建一个ResultSet来显示信息。 然后,我使用ResultSet分解信息,使我可以将每个值分配给一个字符串。 这是我当前的代码:

    Connection connection;
    Statement stmt;
    ResultSet rs;

    try {

        Class.forName("org.h2.Driver");
        connection = DriverManager.getConnection("jdbc:h2:./GiftCertificateManagerDatabase;AUTO_SERVER=TRUE");
        String query = "SELECT CertificateCode, FirstName, LastName, IssueDate, ExpirationDate, Used FROM giftcertificates";
        stmt = connection.createStatement();
        rs = stmt.executeQuery(query);

        JRResultSetDataSource rsdt = new JRResultSetDataSource(rs);
        JasperReport jasperReport;
        JasperPrint jasperPrint;

        jasperReport = JasperCompileManager.compileReport("Reports/GiftCertificateReport.jrxml");
        HashMap parameters = new HashMap();

        rs.next();

        String CertificateCode = rs.getString("CertificateCode");
        String FirstName = rs.getString("FirstName");
        String LastName = rs.getString("LastName");
        String IssueDate = rs.getString("IssueDate");
        String ExpirationDate = rs.getString("ExpirationDate");
        String Used = rs.getString("Used");

        parameters.put("CertificateCode", CertificateCode);
        parameters.put("FirstName", FirstName);
        parameters.put("LastName", LastName);
        parameters.put("IssueDate", IssueDate);
        parameters.put("ExpirationDate", ExpirationDate);
        parameters.put("Used", Used);

        jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, rsdt);

        JasperViewer view = new JasperViewer(jasperPrint);

        view.setVisible(true);

        System.out.println(rs);
        connection.close();
    } catch (ClassNotFoundException | SQLException | JRException ex) {
        ex.printStackTrace();
        JOptionPane.showMessageDialog(null, ex, "Error", JOptionPane.ERROR_MESSAGE);
    }

如您所见,我使用了rs.next(); 转到数据库的第一行。 它吸收了信息,并且实际上已发送给我的报告,这很棒。 但是,它两次出现在我的报告中。 这是我的报告的外观(单击此处查看大图):

已打印的Jasper报告

这是我的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="595" pageHeight="842" columnWidth="535" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="29a25e63-6738-4f28-a9b1-84d9571ae46e"> <property name="ireport.zoom" value="1.0"/> <property name="ireport.x" value="0"/> <property name="ireport.y" value="0"/> <parameter name="CertificateCode" class="java.lang.String"/> <parameter name="FirstName" class="java.lang.String"/> <parameter name="LastName" class="java.lang.String"/> <parameter name="IssueDate" class="java.lang.String"/> <parameter name="ExpirationDate" class="java.lang.String"/> <parameter name="Used" class="java.lang.String"/> <background> <band splitType="Stretch"/> </background> <columnHeader> <band height="20" splitType="Stretch"> <staticText> <reportElement x="0" y="0" width="100" height="20" uuid="bb628493-cab6-4d39-acff-79669009ac6b"/> <text><![CDATA[Certificate Code]]></text> </staticText> <staticText> <reportElement x="100" y="0" width="100" height="20" uuid="2c18a226-2bdf-45e1-b286-f7795cf1d17f"/> <text><![CDATA[First Name]]></text> </staticText> <staticText> <reportElement x="200" y="0" width="100" height="20" uuid="e6b35970-0592-4d97-a054-fb0c65244618"/> <text><![CDATA[Last Name]]></text> </staticText> <staticText> <reportElement x="300" y="0" width="100" height="20" uuid="ee345d19-12f4-4ea7-a9d9-924c50904cb9"/> <text><![CDATA[Issue Date]]></text> </staticText> <staticText> <reportElement x="400" y="0" width="100" height="20" uuid="c5d69f5e-e716-4393-9815-d9cee8bab88b"/> <text><![CDATA[Expiration Date]]></text> </staticText> <staticText> <reportElement x="500" y="0" width="55" height="20" uuid="9760f598-6e30-45ad-9d05-2696f6d45c8e"/> <text><![CDATA[Used?]]></text> </staticText> </band> </columnHeader> <detail> <band height="20" splitType="Stretch"> <textField> <reportElement x="0" y="0" width="100" height="20" uuid="34b20574-2e15-41c6-928d-2dc52b9c4e7e"/> <textFieldExpression><![CDATA[$P{CertificateCode}]]></textFieldExpression> </textField> <textField> <reportElement x="100" y="0" width="100" height="20" uuid="1652ab96-50cd-4ce3-84b1-83bf074b480c"/> <textFieldExpression><![CDATA[$P{FirstName}]]></textFieldExpression> </textField> <textField> <reportElement x="200" y="0" width="100" height="20" uuid="bcfec07b-d07d-474b-a397-781b9ce0254f"/> <textFieldExpression><![CDATA[$P{LastName}]]></textFieldExpression> </textField> <textField> <reportElement x="300" y="0" width="100" height="20" uuid="cdd427e7-b1cf-4ed3-9cfe-8a13e71c0e0d"/> <textFieldExpression><![CDATA[$P{IssueDate}]]></textFieldExpression> </textField> <textField> <reportElement x="400" y="0" width="100" height="20" uuid="1f64f071-8d53-4de2-be05-23e78753f467"/> <textFieldExpression><![CDATA[$P{ExpirationDate}]]></textFieldExpression> </textField> <textField> <reportElement x="500" y="0" width="55" height="20" uuid="38402e3c-3279-4a76-85f8-0266d77e34e1"/> <textFieldExpression><![CDATA[$P{Used}]]></textFieldExpression> </textField> </band> </detail> </jasperReport>

这是我的iReport设计器的图像(单击此处查看大图):

iReport Designer屏幕

我显然需要使用while循环,例如while (rs.next()) { } ,但是为了将所有行都从循环中获取,我应该将它放在哪里以及在循环中放入什么代码。数据库要插入到报告中?

与往常一样,在此先感谢您提供任何有用的答案。

List<?> list=new ArrayList<HashMap<String,String>>();
while(rs.hasNext()){
    rs.next();
    HashMap<String,String> parameters=new HashMap<>();

    String CertificateCode = rs.getString("CertificateCode");
    String FirstName = rs.getString("FirstName");
    String LastName = rs.getString("LastName");
    String IssueDate = rs.getString("IssueDate");
    String ExpirationDate = rs.getString("ExpirationDate");
    String Used = rs.getString("Used");

    parameters.put("CertificateCode", CertificateCode);
    parameters.put("FirstName", FirstName);
    parameters.put("LastName", LastName);
    parameters.put("IssueDate", IssueDate);
    parameters.put("ExpirationDate", ExpirationDate);
    parameters.put("Used", Used);

  list.add(parameters);

}

结果;

[

{证书代码:lskff,名字:asdkff,姓氏:lsdkfs,发布日期:sdjflksf,到期日期:lsdfjlsdf,已使用:skdfjl},

{证书代码:lskff,名字:asdkff,姓氏:lsdkfs,发布日期:sdjflksf,到期日期:lsdfjlsdf,已使用:skdfjl},

{证书代码:lskff,名字:asdkff,姓氏:lsdkfs,发布日期:sdjflksf,到期日期:lsdfjlsdf,已使用:skdfjl}

]

我认为您正在将JRDataSource提供的报告详细信息与参数映射混淆。

参数映射是可以在报表上显示的一组键值。

JRDataSource可用于填充明细数据。

JasperReports中的变量,参数和字段之间有什么区别?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM