【问题标题】:Why is style ignored in XLSX when using markup?为什么在使用标记时在 XLSX 中忽略样式?
【发布时间】:2016-08-11 22:57:59
【问题描述】:

我对部分文本使用粗体样式,所以它看起来像:

"<style isBold = 'true'>" + $P{REPORT_RESOURCE_BUNDLE}.getString("report.label.foo") +": "+"</style>"+$F{foo}

在 jrxml 这个textField 看起来像:

<textField>
<reportElement style="moduleBorderColumnStyle" mode="Opaque" x="0" y="0" width="555" height="20" uuid="6adbbfa7-e549-4378-903c-04095c2f34c4"/>
<textElement markup="styled"/>
<textFieldExpression><![CDATA["<style isBold = 'true'>" +
$P{REPORT_RESOURCE_BUNDLE}
.getString("report.label.foo")
+": "+"</style>"+$F{foo}]]></textFieldExpression>
</textField>

TextField 标记属性 - 样式化

它适用于 PDF 和 HTML。但是,我在 XLSX 中使用相同的问题。

不幸的是,即使直接将字体大小设置为 14(我之前尝试从样式设置它),我也得到了整个标签的字体 11 callibri (这是默认字体),它正在使用标记&lt;style isBold='true'&gt;

我对@9​​87654325@ 和标记 = HTML 进行了相同的尝试 - 结果没有改变。

结论:XLSX 中的任何样式文本都对字体不敏感(设置为默认),如何解决?

编辑:

我发现问题出在我之前申请textField 的风格上,但问题仍然只是在 excel 中。 &lt;style&gt; 标签只是将其覆盖为默认字体和字体大小。

【问题讨论】:

  • @PetterFriberg 是的,我还有一个问题。我在这里不使用条件样式。字体覆盖问题
  • @PetterFriberg 和 XLSX 中
  • 我认为这是错误,我一直在测试一些,在 xlsx 中(不是在 xls 中)如果标记与 textField 一起使用,样式属性将被忽略,我会看看是否可以找到解决方法,但事实上,这是一个错误
  • @PetterFriberg 谢谢你,你有任何想法如何解决它或以其他方式解决它吗?我可以创建 2 个不同的文本字段,但语言环境会很丑(不同的边距)

标签: jasper-reports export-to-excel xlsx


【解决方案1】:

我可以在导出到xlsx 时确认相同的错误,样式被忽略,这似乎与为XSSFSheet 中的单元格创建RichTextString 有关。 (不正确/没有字体设置为RichTextString?)

编辑:我创建了一个bug issue,标记为已解决,可用于下一个版本(当前版本为 v6.3.0)

重现错误的简单示例

jrxml (SimpleTest.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="SimpleTest" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" isIgnorePagination="true" uuid="e4188d8a-c7f9-4f7d-8f0f-ada07b89d42f">
    <style name="test" mode="Transparent" forecolor="#CC0000" fontSize="14"/>
    <detail>
        <band height="20">
            <textField isStretchWithOverflow="true">
                <reportElement style="test" positionType="Float" stretchType="RelativeToTallestObject" x="0" y="0" width="200" height="20" uuid="6d5644bf-480e-4ed2-831b-3ed043f38f70"/>
                <textElement verticalAlignment="Middle" markup="html">
                    <paragraph lineSpacing="Single"/>
                </textElement>
                <textFieldExpression><![CDATA["<b>TEST</b> TEXT"]]></textFieldExpression>
            </textField>
            <textField isStretchWithOverflow="true">
                <reportElement style="test" positionType="Float" stretchType="RelativeToTallestObject" x="200" y="0" width="200" height="20" uuid="f876d0a3-136b-468c-b3bd-bd9cd5475ca9"/>
                <textElement verticalAlignment="Middle" markup="html">
                    <paragraph lineSpacing="Single"/>
                </textElement>
                <textFieldExpression><![CDATA["TEXT2"]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

要导出到 xls 和 xlsx 的 java 代码

JasperReport report = JasperCompileManager.compileReport("SimpleTest.jrxml");
JasperPrint jasperPrint = JasperFillManager.fillReport(report,new HashMap<String, Object>(), new JREmptyDataSource(1));

//Export to excel xls
JRXlsExporter exporterXls = new JRXlsExporter();
File outputFile = new File("excelTest.xls");
exporterXls.setExporterInput(new SimpleExporterInput(jasperPrint));
exporterXls.setExporterOutput(new SimpleOutputStreamExporterOutput(outputFile));
SimpleXlsReportConfiguration configXls = new SimpleXlsReportConfiguration();
configXls.setDetectCellType(true);
configXls.setRemoveEmptySpaceBetweenColumns(true);
configXls.setRemoveEmptySpaceBetweenRows(true);
configXls.setCollapseRowSpan(true);
configXls.setWhitePageBackground(false);
exporterXls.setConfiguration(configXls);
exporterXls.exportReport();

//Export to excel xlsx
JRXlsxExporter exporterXlsx = new JRXlsxExporter();
File output = new File("excelTest.xlsx");
exporterXlsx.setExporterInput(new SimpleExporterInput(jasperPrint));
exporterXlsx.setExporterOutput(new SimpleOutputStreamExporterOutput(output));
SimpleXlsxReportConfiguration configXlsx = new SimpleXlsxReportConfiguration();
configXlsx.setDetectCellType(true);
configXlsx.setRemoveEmptySpaceBetweenColumns(true);
configXlsx.setRemoveEmptySpaceBetweenRows(true);
configXlsx.setCollapseRowSpan(true);
configXlsx.setWhitePageBackground(false);
exporterXlsx.setConfiguration(configXlsx);
exporterXlsx.exportReport();

输出 xls(左)、xlsx(右)

xlsx 中的单元格 A1,样式未应用

解决方法

不要在textField不使用样式,因此将样式直接应用于textField

在示例中,我们将forecolor="#CC0000"fontSize="14" 添加到textField 并删除style 属性

<textField isStretchWithOverflow="true">
    <reportElement positionType="Float" stretchType="RelativeToTallestObject" x="0" y="0" width="200" height="20" forecolor="#CC0000" uuid="6d5644bf-480e-4ed2-831b-3ed043f38f70"/>
    <textElement verticalAlignment="Middle" markup="html">
        <font size="14"/>
        <paragraph lineSpacing="Single"/>
    </textElement>
    <textFieldExpression><![CDATA["<b>TEST</b> TEXT"]]></textFieldExpression>
</textField>

【讨论】:

  • @quento 仅供参考:我已经打开了一个错误问题,请参阅 community.jaspersoft.com/jasperreports-library/issues/8326,因为我找不到任何相关问题,jasper-reports 的人非常好,所以他们可能很快就会逐步解决
  • 感谢大家发现这个错误。现在已修复,该修复将在下一个 JasperReports 版本中提供。
  • @PetterFriberg 如果不能删除样式属性怎么办?
  • @AmmarAkouri 获取最新版本的 jasper-report 或使用 poi 发布详细说明,我看不到许多其他解决方案。
  • @PetterFriberg 我已经有了最新的,我的问题是颜色和文本对齐方式完全按照我希望它们在预览模式下显示,但是当我导出到 Excel 时颜色似乎有点暗,文本对齐被忽略。我尝试了您的建议并将样式直接应用于文本字段,但一点运气都没有!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 2012-05-10
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
相关资源
最近更新 更多