有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java DynamicAsper:如何在空白时删除行

我正在用DynamicJasper生成一个报告,我想删除一个报告行,当该行为空时。我知道在JasperReports怎么做

但是有谁能建议我如何使用java代码通过DynamicJasper删除空行吗


共 (1) 个答案

  1. # 1 楼答案

    ^{}的帮助下,我还没有找到解决这个问题的简单方法

    但它可以通过DJ帮助解决

    这是用于生成报表的主类的源代码

    public class BasicReportTest {
    
        private JasperPrint m_jasperPrint;
        private JasperReport m_jasperReport;
        private Map m_params = new HashMap();
        private DynamicReport m_dynamicReport;
    
        public DynamicReport buildReport() throws Exception {
            Style detailStyle = new Style();
            detailStyle.setBorder(Border.THIN);
            detailStyle.setBlankWhenNull(true);
    
            Style headerStyle = new Style();
            headerStyle.setFont(Font.COURIER_NEW_BIG_BOLD);
            headerStyle.setBorder(Border.THIN);
            headerStyle.setHorizontalAlign(HorizontalAlign.CENTER);
            headerStyle.setVerticalAlign(VerticalAlign.MIDDLE);
            headerStyle.setFont(Font.ARIAL_BIG);
    
            FastReportBuilder drb = new FastReportBuilder();
            drb.addColumn("State", "state", String.class.getName(), 30, detailStyle, headerStyle)
                    .addColumn("Branch", "branch", String.class.getName(), 30, detailStyle, headerStyle)
                    .addColumn("Item", "item", String.class.getName(), 50, detailStyle, headerStyle)
                    .addColumn("Amount", "amount", Float.class.getName(), 60, detailStyle, headerStyle)
                    .setTitle("The report with empty rows")
                    .setUseFullPageWidth(true);
    
            DynamicReport dr = drb.build();
            return dr;
        }
    
        public void testReport() throws Exception {
            m_dynamicReport = buildReport();
    
            JRDataSource dataSource = getDataSource();
    
            m_jasperReport = DynamicJasperHelper.generateJasperReport(m_dynamicReport, 
                    getLayoutManager(), m_params);
    
            m_jasperPrint = JasperFillManager.fillReport(m_jasperReport, m_params, dataSource);
    
            exportReport();
        }
    
        protected LayoutManager getLayoutManager() {
            return new CustomLayoutManager();
        }
    
        /*... Some code ... */
    
        public static void main(String[] args) throws Exception {
            BasicReportTest test = new BasicReportTest();
            test.testReport();
        }
    }
    

    这串代码detailStyle.setBlankWhenNull(true);使我们能够在textField中将null值显示为空白。就好像我们会用

    <textField isBlankWhenNull="true">
    

    jrxml文件中

    但我们还需要像这样“生成”xml代码:

    <textField isBlankWhenNull="true">
        <reportElement ... isRemoveLineWhenBlank="true"/>
    

    如上所述,DJ不包含任何用于调用JRElement.setRemoveLineWhenBlank(boolean isRemoveLineWhenBlank)方法的公共方法(包装器)

    这就是为什么我使用定制的^{}类——在我的示例中,它是一个CustomLayoutManager

    以下是它的源代码:

    public class CustomLayoutManager extends ClassicLayoutManager {
    
        @Override
        protected void transformDetailBandTextField(AbstractColumn column, JRDesignTextField textField) {
            super.transformDetailBandTextField(column, textField);
            if (column.getStyle().isBlankWhenNull()) {
                textField.setRemoveLineWhenBlank(true);
            }
        }
    }
    

    我已经重写了transformDetailBandTextField的引擎用于构建Detail带的方法transformDetailBandTextField