3

i have already managed to export a pdf report with jasperreports but i cannot export to excel format.

The xls output file my program produces doesn't open with Excel(corrupted), and is totally empty if i open it with LibreOffice.

Here is the jrxml code(a test example):

<?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="xls" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="d8281a37-1a28-43e6-824c-0d39b69f7d23">
<property name="net.sf.jasperreports.export.xls.detect.cell.type" value="true"/>
<property name="net.sf.jasperreports.print.keep.full.text" value="true"/>
<property name="net.sf.jasperreports.export.xls.wrap.text" value="false"/>
<property name="net.sf.jasperreports.export.xls.auto.fit.row" value="true"/>
<property name="net.sf.jasperreports.export.xls.auto.fit.column" value="true"/>
<style name="table">
    <box>
        <pen lineWidth="1.0" lineColor="#000000"/>
    </box>
</style>
<style name="table_TH" mode="Opaque" backcolor="#F0F8FF">
    <box>
        <pen lineWidth="0.5" lineColor="#000000"/>
    </box>
</style>
<style name="table_CH" mode="Opaque" backcolor="#BFE1FF">
    <box>
        <pen lineWidth="0.5" lineColor="#000000"/>
    </box>
</style>
<style name="table_TD" mode="Opaque" backcolor="#FFFFFF">
    <box>
        <pen lineWidth="0.5" lineColor="#000000"/>
    </box>
</style>
<subDataset name="Table Dataset 1" uuid="3897caef-b047-4ba2-8b62-bd46ec43553d"/>
<field name="credit" class="java.lang.Double"/>
<field name="time" class="java.lang.String"/>
<title>
    <band height="50"/>
</title>
<pageHeader>
    <band height="50">
        <staticText>
            <reportElement x="0" y="30" width="100" height="20" uuid="4a091ece-05dc-48a7-8390-bf3722715ca8"/>
            <text><![CDATA[Nikos]]></text>
        </staticText>
    </band>
</pageHeader>
<columnHeader>
    <band height="50">
        <staticText>
            <reportElement x="0" y="30" width="100" height="20" uuid="39c43e60-ee74-4373-bafb-b78647870be5"/>
            <text><![CDATA[Nikos]]></text>
        </staticText>
    </band>
</columnHeader>
<detail>
    <band height="153">
        <textField>
            <reportElement x="0" y="0" width="100" height="20" uuid="ec837765-6e78-417f-b6ea-1cec760fba54"/>
            <textFieldExpression><![CDATA[$F{credit}]]></textFieldExpression>
        </textField>
        <textField>
            <reportElement x="100" y="0" width="100" height="20" uuid="23e21ff0-e776-4a04-a5d0-a4188694446e"/>
            <textFieldExpression><![CDATA[$F{time}]]></textFieldExpression>
        </textField>
    </band>
</detail>
<summary>
    <band height="229">
        <textField>
            <reportElement x="0" y="0" width="100" height="20" uuid="a5015437-e944-41c1-88bf-9a0d9f88e2d0"/>
            <textFieldExpression><![CDATA[$F{credit}]]></textFieldExpression>
        </textField>
        <textField>
            <reportElement x="100" y="0" width="100" height="20" uuid="066120ca-8df1-40fb-8dea-b93bf5ef30a9"/>
            <textFieldExpression><![CDATA[$F{time}]]></textFieldExpression>
        </textField>
    </band>
</summary>

And this is my java program (contains also pdf successful export):

public static void main(String[] args) {
    String inPdfFileName = "src/test/javabeans.jasper";
    String inXlsFileName = "src/test/xls.jasper";
    String outPdfName = "test.pdf";
    String outXlsName = "test.xls";
    HashMap pdfParams = new HashMap();
    HashMap xlsParams = new HashMap();

    Collection<FundBean> fundbeans = FundBeanFactory.getBeanCollection();
    pdfParams.put("HighTime", FundBeanFactory.getMax().getTime());
    pdfParams.put("LowTime", FundBeanFactory.getMin().getTime());

    pdfParams.put("Highest", FundBeanFactory.getMax().getCredit().toString());
    pdfParams.put("Lowest", FundBeanFactory.getMin().getCredit().toString());

    JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(fundbeans);
    try {
        JasperPrint PdfPrint = JasperFillManager.fillReport(
                inPdfFileName,
                pdfParams,
                beanCollectionDataSource);

        JasperPrint xlsPrint = JasperFillManager.fillReport(
                inXlsFileName,
                xlsParams,
                beanCollectionDataSource);

        JRPdfExporter pdfExporter = new JRPdfExporter();
        pdfExporter.setExporterInput(new SimpleExporterInput(PdfPrint));
        pdfExporter.setExporterOutput(new SimpleOutputStreamExporterOutput(outPdfName));
        SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration();
        configuration.setCreatingBatchModeBookmarks(true);
        pdfExporter.setConfiguration(configuration);
        pdfExporter.exportReport();

        JRXlsExporter xlsExporter = new JRXlsExporter();

        xlsExporter.setExporterInput(new SimpleExporterInput(xlsPrint));
        xlsExporter.setExporterOutput(new SimpleOutputStreamExporterOutput(outXlsName));
        SimpleXlsReportConfiguration xlsReportConfiguration = new SimpleXlsReportConfiguration();
        xlsReportConfiguration.setOnePagePerSheet(false);
        xlsReportConfiguration.setRemoveEmptySpaceBetweenRows(true);
        xlsReportConfiguration.setDetectCellType(false);
        xlsReportConfiguration.setWhitePageBackground(false);
        xlsExporter.setConfiguration(xlsReportConfiguration);

        xlsExporter.exportReport();
    } catch (JRException e) {
        e.printStackTrace();
    }
  }

When i preview in xls format with iReport Designer i get the desired result. So i guess the problem lies in my java code...

Alex K
  • 22,315
  • 19
  • 108
  • 236
  • possible duplicate of [Unreadable content message with Jasper and .xlsx](http://stackoverflow.com/questions/31649772/unreadable-content-message-with-jasper-and-xlsx) – Robert Mugattarov Jul 29 '15 at 06:26
  • Thanks a lot, this helped me understand where the problem is, the two fields don't get any data from JRBeanCollection.I am now able to open the xls file but i can't figure out why the fields don't get filled.In the code above, the pdf report gets filled from the same javabean,working fine.Can you help? –  Jul 29 '15 at 07:59
  • You bean collection might be empty or the beans do not follow the Java bean conventions: http://stackoverflow.com/questions/1973073/what-is-a-java-bean – Robert Mugattarov Jul 29 '15 at 08:49
  • This isn't the problem i guess.I use the same javaBean and same method for the bean collection both for the Pdf exporter and the Xls exporter.Pdf output gets filled, xls report doesn't.I've tried so many different things,scanned the code many times..Do you have another idea? –  Jul 29 '15 at 09:14
  • It might be a type mismatch. 1) The time report field is declared of type String - try using a datetime type. 2) Also, make field class match field expression class. Right now both your fields have the expression class String. 3) Add this property to your report http://jasperreports.sourceforge.net/config.reference.html#net.sf.jasperreports.export.xls.detect.cell.type with the value true – Robert Mugattarov Jul 29 '15 at 09:26
  • thank you for your answers.Still the problem remains..i had net.sf.jasperreports.export.xls.detect.cell.type already set to true, i also make filed class -expression class match.Still, not solved.. –  Jul 29 '15 at 09:36

1 Answers1

2

Thanks for all help, i figured out what caused the problem, i was using the same bean List both for the pdf report and for the xls,and for some reason when i was passing the list to fillReport() to create the print object for the pdf, all beans where removed from the list. I created a second JRBeanCollection for the xls Print object and everything works fine!