下面的方法使用 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 中,报告的设计如下所示:
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();
}
}
}
输出结果
如果我们使用 setIgnoreWidth 调用注释代码字符串 (net.sf.jasperreports.crosstab.ignore.width == false),结果将是:
关于java - 如何使用Java代码强制交叉表忽略宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44396377/