jasperreports - excel 导出
jasperreports - excel export
我已经设法用 jasperreports 导出 pdf 报告,但我无法导出为 excel 格式。
我的程序生成的 xls 输出文件无法使用 Excel(已损坏)打开,如果我使用 LibreOffice 打开它则完全是空的。
这里是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="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>
这是我的 java 程序(还包含 pdf 成功导出):
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();
}
}
当我使用 iReport Designer 以 xls 格式预览时,我得到了想要的结果。
所以我想问题出在我的 java 代码中...
感谢大家的帮助,
我弄清楚是什么导致了这个问题,我对 pdf 报告和 xls 使用相同的 bean 列表,并且出于某种原因,当我将列表传递给 fillReport() 为 pdf 创建打印对象时,所有 bean从列表中删除的位置。
我为 xls 打印对象创建了第二个 JRBeanCollection,一切正常!
我已经设法用 jasperreports 导出 pdf 报告,但我无法导出为 excel 格式。
我的程序生成的 xls 输出文件无法使用 Excel(已损坏)打开,如果我使用 LibreOffice 打开它则完全是空的。
这里是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="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>
这是我的 java 程序(还包含 pdf 成功导出):
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();
}
}
当我使用 iReport Designer 以 xls 格式预览时,我得到了想要的结果。 所以我想问题出在我的 java 代码中...
感谢大家的帮助, 我弄清楚是什么导致了这个问题,我对 pdf 报告和 xls 使用相同的 bean 列表,并且出于某种原因,当我将列表传递给 fillReport() 为 pdf 创建打印对象时,所有 bean从列表中删除的位置。 我为 xls 打印对象创建了第二个 JRBeanCollection,一切正常!