如何解决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的部分方法覆盖逻辑和新版本不一样,同时设置setBaseItemLabelGenerator和setItemLabelGenerator能确保生效。
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




