You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决JRXML报表中CategoryPlot图表百分比保留两位小数在PDF中失效的问题

解决CategoryPlot百分比标签两位小数不生效的问题

针对你在JFreeChart 1.0.0和iReport 1.2.8环境下遇到的这个问题——自定义ChartCustomizer设置CategoryPlot的百分比标签保留两位小数,但导出PDF后完全不生效,我帮你梳理了几个核心的修复点,都是针对这个老版本环境的坑:

1. 修复自定义Customizer类的核心问题

你的代码里有几个容易忽略的细节,直接导致标签要么不显示,要么格式不对:

补全代码并启用标签可见性

首先补全缺失的导入类,然后必须开启标签可见性(默认是隐藏的,这大概率是PDF里看不到标签的核心原因),同时调整格式器和标签生成器的参数:

import net.sf.jasperreports.engine.JRChart;
import net.sf.jasperreports.engine.JRChartCustomizer;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import java.text.DecimalFormat;
import java.text.NumberFormat;

public class BarChartPercentageCustomizer implements JRChartCustomizer {
    @Override
    public void customize(JFreeChart chart, JRChart jasperChart) {
        CategoryPlot barPlot = (CategoryPlot) chart.getPlot();
        BarRenderer renderer = (BarRenderer) barPlot.getRenderer();
        
        // 关键!默认标签是隐藏的,必须手动开启
        renderer.setBaseItemLabelsVisible(true);
        // 可选:设置标签字体,避免PDF中字体缺失导致不显示
        renderer.setBaseItemLabelFont(new java.awt.Font("Arial", java.awt.Font.PLAIN, 10));
        
        // 配置百分比格式:根据你的数据源类型选对应的格式
        // 情况A:数据是小数比例(比如0.1234 → 12.34%)
        NumberFormat formatter = new DecimalFormat("#0.00%");
        // 情况B:数据是原始百分比数值(比如12.34 → 12.34%)
        // NumberFormat formatter = new DecimalFormat("#0.00'%'");
        
        // 标签模式用{0}就够了,{2}是系列名称,没必要加(除非你需要显示)
        StandardCategoryItemLabelGenerator labelGenerator = new StandardCategoryItemLabelGenerator(
            "{0}", formatter
        );
        
        // 兼容JFreeChart 1.0.0的老API:同时设置base和普通的itemLabelGenerator
        renderer.setBaseItemLabelGenerator(labelGenerator);
        renderer.setItemLabelGenerator(labelGenerator);
    }
}

重点说明:

  • 标签可见性setBaseItemLabelsVisible(true)是重中之重,默认标签是隐藏的,哪怕你配置了生成器也不会显示。
  • 格式串选择:别搞混数据类型!如果你的数据是0.5(代表50%),用#0.00%就对了;如果数据直接是50(代表50%),就用#0.00'%',不然会变成5000.00%。
  • 老版本API兼容:JFreeChart 1.0.0里BarRenderer的部分方法覆盖逻辑和新版本不一样,同时设置setBaseItemLabelGeneratorsetItemLabelGenerator能确保生效。

2. 确保JRXML里的Customizer配置正确

在报表的XML中,找到对应的<chart>标签,一定要加上自定义类的全路径,别漏了包名:

<chart>
    <reportElement x="0" y="0" width="500" height="300"/>
    <barChart>
        <categoryDataset>
            <!-- 你的数据集配置 -->
        </categoryDataset>
        <barPlot>
            <!-- 你的图表样式配置 -->
        </barPlot>
    </barChart>
    <!-- 替换成你的Customizer类全名 -->
    <customizerClass>com.yourcompany.reports.BarChartPercentageCustomizer</customizerClass>
</chart>

3. 针对iReport 1.2.8和PDF渲染的额外检查

  • 类路径验证:把编译好的Customizer类放到iReport的lib目录,或者项目的classpath里,不然报表编译时找不到类,自定义逻辑根本不会执行。
  • PDF字体支持:如果PDF里标签显示乱码或者不显示,要确保报表配置了PDF支持的字体(比如Arial)。可以在iReport里添加字体扩展,或者直接用JVM默认支持的字体。
  • 预览先测:先在iReport的预览里看图表是否显示正确的百分比标签,如果预览正常但PDF异常,大概率是字体或者类路径的问题。

最后测试

修改完之后,先在iReport里预览报表,确认标签显示正确,再导出PDF验证效果。如果还是有问题,检查一下数据源的数值类型是不是和格式串匹配。

内容的提问来源于stack exchange,提问作者Falion

火山引擎 最新活动