java - 如何使用Java代码强制交叉表忽略宽度?

标签 java jasper-reports export-to-excel crosstab

下面的方法使用 JasperReport 将报告导出到 xlsx(excel),但我遇到了问题。我需要设置属性(忽略宽度== true),我需要在java上设置,因为我有另一种方法可以将我导出为PDF。我尝试了很多形式但没有运气。有什么建议吗?

The property i need is called "Property_ignore_width", i need to know how to set this property on java.

public void exportexcel() throws JRException, IOException {
        conexion con = new conexion();
        Map<String, Object> parametros = new HashMap<String, Object>();
        FacesContext context = FacesContext.getCurrentInstance();
        ServletContext servleContext = (ServletContext) context.getExternalContext().getContext();
        parametros.put("RutaImagen", servleContext.getRealPath("/reportes/"));
        parametros.put("movimiento", movimiento);
        parametros.put("desde", desde);
        parametros.put("hasta", hasta);

        String reporte = movimiento.equals("Descarga") ? "GeneralNaves.jasper" : "GeneralNavesExport.jasper";

        String dirReporte = servleContext.getRealPath("/reportes/" + reporte);
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
        response.addHeader("Content-disposition", "attachment;filename=ReporteNaves_A_Naves.xlsx");
        response.setContentType("application/xlsx");

        JasperPrint impres = JasperFillManager.fillReport(dirReporte, parametros, con.getConnection());
        JRXlsxExporter expor = new JRXlsxExporter();
        expor.setExporterInput(new SimpleExporterInput(impres));
        expor.setExporterOutput(new SimpleOutputStreamExporterOutput(response.getOutputStream()));

        SimpleXlsxReportConfiguration config = new SimpleXlsxReportConfiguration();
        config.setCollapseRowSpan(Boolean.FALSE);
        config.setWhitePageBackground(Boolean.FALSE);
        config.setRemoveEmptySpaceBetweenRows(Boolean.TRUE);
        expor.setConfiguration(config);
        expor.exportReport();
        context.responseComplete();
    }

最佳答案

我们可以更改 net.sf.jasperreports.crosstab.ignore.width的值 属性在 JasperReports API 的帮助下。

应为 Crosstab 元素设置此属性,而不是为整个报表设置。 这意味着我们应该获取 Crosstab 元素并使用其方法 JRCrosstab.setIgnoreWidth(boolean)

示例

我们可以在 Summary 频段使用带有交叉表的简单模板和 csv 数据源。

数据源

示例中使用的是 csv 数据源。

language,framework
Java,Guava
Java,Lombok
Java,JasperReports
Java,Spring
Java,Vaadin
C#,ASP.NET MVC
C#,NancyFX
C#,Automapper
JavaScript,AngularJS
JavaScript,React
JavaScript,jQuery

下例中该数据源的数据适配器名称为frameworks.csv。文件的第一行被跳过 - 它包含列的名称。

报告模板

交叉表正在使用主数据集。

<?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="Crosstab with dynamic width" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="731dbfe4-e4ef-4631-8a59-1952b5bf048c">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="frameworks.csv"/>
    <field name="language" class="java.lang.String"/>
    <field name="framework" class="java.lang.String"/>
    <summary>
        <band height="120">
            <crosstab ignoreWidth="false">
                <reportElement x="90" y="30" width="200" height="90" uuid="8cc82b0a-4e26-4cc6-b0e2-e5d13a5190df">
                    <property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.VerticalRowLayout"/>
                </reportElement>
                <rowGroup name="language" width="60" totalPosition="End">
                    <bucket class="java.lang.String">
                        <bucketExpression><![CDATA[$F{language}]]></bucketExpression>
                    </bucket>
                    <crosstabRowHeader>
                        <cellContents mode="Opaque">
                            <textField>
                                <reportElement x="0" y="0" width="60" height="20" uuid="449ab423-ade7-4962-804c-dc39f326eaa6"/>
                                <textFieldExpression><![CDATA[$V{language}]]></textFieldExpression>
                            </textField>
                        </cellContents>
                    </crosstabRowHeader>
                    <crosstabTotalRowHeader>
                        <cellContents mode="Opaque">
                            <staticText>
                                <reportElement x="0" y="0" width="60" height="20" forecolor="#FFFFFF" uuid="f3873d23-8f90-46ec-8e4a-7ea5635eb3aa"/>
                                <text><![CDATA[Total language]]></text>
                            </staticText>
                        </cellContents>
                    </crosstabTotalRowHeader>
                </rowGroup>
                <columnGroup name="framework" height="20" totalPosition="End">
                    <bucket class="java.lang.String">
                        <bucketExpression><![CDATA[$F{framework}]]></bucketExpression>
                    </bucket>
                    <crosstabColumnHeader>
                        <cellContents mode="Opaque">
                            <textField>
                                <reportElement x="0" y="0" width="60" height="20" uuid="4ec3e655-ea93-406a-b5b9-b56a46c12b19"/>
                                <textFieldExpression><![CDATA[$V{framework}]]></textFieldExpression>
                            </textField>
                        </cellContents>
                    </crosstabColumnHeader>
                    <crosstabTotalColumnHeader>
                        <cellContents mode="Opaque">
                            <staticText>
                                <reportElement x="0" y="0" width="60" height="20" forecolor="#FFFFFF" uuid="4f9b4bdc-24fb-4df9-ab5f-423c82939535"/>
                                <text><![CDATA[Total framework]]></text>
                            </staticText>
                        </cellContents>
                    </crosstabTotalColumnHeader>
                </columnGroup>
                <measure name="language_MEASURE" class="java.lang.Integer" calculation="Count">
                    <measureExpression><![CDATA[$F{language}]]></measureExpression>
                </measure>
                <crosstabCell width="60" height="20">
                    <cellContents mode="Opaque">
                        <textField>
                            <reportElement x="0" y="0" width="60" height="20" uuid="5e9cc753-3f32-4ab8-b79d-073fc574c85f"/>
                            <textFieldExpression><![CDATA[$V{language_MEASURE}]]></textFieldExpression>
                        </textField>
                    </cellContents>
                </crosstabCell>
                <crosstabCell width="60" height="20" columnTotalGroup="framework">
                    <cellContents mode="Opaque">
                        <textField>
                            <reportElement x="0" y="0" width="60" height="20" forecolor="#FFFFFF" uuid="1ec48067-6435-463e-9688-768be0dd33be"/>
                            <textFieldExpression><![CDATA[$V{language_MEASURE}]]></textFieldExpression>
                        </textField>
                    </cellContents>
                </crosstabCell>
                <crosstabCell width="60" height="20" rowTotalGroup="language">
                    <cellContents mode="Opaque">
                        <textField>
                            <reportElement x="0" y="0" width="60" height="20" forecolor="#FFFFFF" uuid="4208c8c9-fffa-48c3-acaa-6aeccc72c141"/>
                            <textFieldExpression><![CDATA[$V{language_MEASURE}]]></textFieldExpression>
                        </textField>
                    </cellContents>
                </crosstabCell>
                <crosstabCell width="60" height="20" rowTotalGroup="language" columnTotalGroup="framework">
                    <cellContents mode="Opaque">
                        <textField>
                            <reportElement x="0" y="0" width="60" height="20" forecolor="#FFFFFF" uuid="efb32f08-a362-4b68-b9ed-ba36a944d385"/>
                            <textFieldExpression><![CDATA[$V{language_MEASURE}]]></textFieldExpression>
                        </textField>
                    </cellContents>
                </crosstabCell>
            </crosstab>
        </band>
    </summary>
</jasperReport>

在 Jaspersoft Studio 中,报告的设计如下所示: Report's design at JSS

Java 代码

主要思想是获取Summary区域的crosstab元素并修改其属性。

用于设置属性的基于Java 8的代码:

JasperReport jasperReport;
try (InputStream inputStream = JRLoader.getResourceInputStream(report.getTemplateName())) {
    jasperReport = JasperCompileManager.compileReport(JRXmlLoader.load(inputStream));
    Arrays.stream(jasperReport.getSummary().getElements()).filter(element -> element instanceof JRCrosstab)
            .forEach(jrElement -> ((JRCrosstab) jrElement).setIgnoreWidth(true)); // get all crosstabs and set PROPERTY_IGNORE_WIDTH property
}

try (InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("frameworks.csv")) {
    Map<String, Object> params = new HashMap<>();
    JRCsvDataSource ds = new JRCsvDataSource(inputStream);
    ds.setUseFirstRowAsHeader(true);

    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, ds);

    exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
    SimpleOutputStreamExporterOutput exporterOutput = null;
    try {
        exporterOutput = new SimpleOutputStreamExporterOutput(file);
        exporter.setExporterOutput(exporterOutput);
        exporter.exportReport();
    } finally {
        if (exporterOutput != null) {
            exporterOutput.close();
        }
    }
}

输出结果

代码生成的结果将是: The output pdf file

如果我们使用 setIgnoreWidth 调用注释代码字符串 (net.sf.jasperreports.crosstab.ignore.width == false),结果将是:

The output pdf file. Ignore width = false

关于java - 如何使用Java代码强制交叉表忽略宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44396377/

相关文章:

java - java中的快捷键

javascript - Angularjs 身份验证问题

java - JasperReports 可选依赖项

java - 如何将我的 *.jasper 文件与 *.class 文件一起包含在 Maven 构建中?

c# - 将锯齿状数组直接转换为二维数组而不迭代每个项目?

c# - 如何将数据从包含图像的网格导出到 excel?

java - 检查隐藏 wifi 网络的可用性

java - 为什么 String 方法regionMatches 不委托(delegate)给重载方法

java - Jasperreports-6.3.0 Webapp示例编译抛出异常

php - 将 MySQL 数据导出到 Excel 矩阵