代码之家  ›  专栏  ›  技术社区  ›  ave4496

如何设置JRWiewer导出选项?

  •  1
  • ave4496  · 技术社区  · 7 年前

    最近,我用最新的jasper reports库更新了我的项目。 有一个新的JRViewer类(net.sf.jasperreports.swing)取代了旧的类(net.sf.jasperreports.view)。现在我不知道如何设置导出选项。旧代码是这样的:

    JRPdfSaveContributor pdf = new JRPdfSaveContributor(locale, resBundle);
    JRRtfSaveContributor rtf = new JRRtfSaveContributor(locale, resBundle);
    JRSingleSheetXlsSaveContributor xls = new JRSingleSheetXlsSaveContributor(locale, resBundle);
    JRDocxSaveContributor docx = new JRDocxSaveContributor(locale, resBundle);
    viewer.setSaveContributors(new JRSaveContributor[] { pdf, rtf, xls, docx });
    
    2 回复  |  直到 7 年前
        1
  •  5
  •   dada67    7 年前

    你必须扩大网络。旧金山。jasperreports。摆动JRViewer并将导出贡献者设置为JRViewerToolbar。类似这样:

    public class MyJRViewer extends JRViewer {
        //define the constructor that you use
        public MyJRViewer(JasperPrint jasperPrint) {
            super(jasperPrint);
        }
    
        @Override
        protected JRViewerToolbar createToolbar() {
            JRViewerToolbar toolbar = super.createToolbar();
    
            Locale locale = viewerContext.getLocale();
            ResourceBundle resBundle = viewerContext.getResourceBundle();
            JRPdfSaveContributor pdf = new JRPdfSaveContributor(locale, resBundle);
            JRRtfSaveContributor rtf = new JRRtfSaveContributor(locale, resBundle);
            JRSingleSheetXlsSaveContributor xls = new JRSingleSheetXlsSaveContributor(locale, resBundle);
            JRDocxSaveContributor docx = new JRDocxSaveContributor(locale, resBundle);
            toolbar.setSaveContributors(new JRSaveContributor[] {pdf, rtf, xls, docx});
    
            return toolbar;
        }   
    }
    
        2
  •  1
  •   Mehdi    6 年前

    您可以使用此方法进行扩展的模块化选择。

    首先,我们定义一个包含所有扩展类的枚举,所有这些类都是JRSaveContributor的子类 用于保存扩展名 .

    import net.sf.jasperreports.view.JRSaveContributor;
    import net.sf.jasperreports.view.save.*;
    
    public enum Extension {
        PDF(JRPdfSaveContributor.class),
        RTF(JRRtfSaveContributor.class),
        SINGLE_SHEET_XLS(JRSingleSheetXlsSaveContributor.class),
        MULTIPLE_SHEET_XLS(JRMultipleSheetsXlsSaveContributor.class),
        DOCX(JRDocxSaveContributor.class),
        ODT(JROdtSaveContributor.class),
        HTML(JRHtmlSaveContributor.class),
        XML(JRXmlSaveContributor.class),
        CSV(JRCsvSaveContributor.class),
        PRINT(JRPrintSaveContributor.class),
        EMBEDDED_IMAGES_XML(JREmbeddedImagesXmlSaveContributor.class);
    
        private Class<? extends JRSaveContributor> clazz;
    
        Extension(Class<? extends JRSaveContributor> clazz) {
            this.clazz = clazz;
        }
    
        public Class<? extends JRSaveContributor> getClazz() {
            return clazz;
        }
    }
    

    接下来,我们需要编写一个类来覆盖createToolbar方法并应用配置:

    import net.sf.jasperreports.engine.JasperPrint;
    import net.sf.jasperreports.swing.JRViewer;
    import net.sf.jasperreports.swing.JRViewerToolbar;
    import net.sf.jasperreports.view.JRSaveContributor;
    
    import static x.y.z.Extension.*;
    
    import java.lang.reflect.Constructor;
    import java.util.Locale;
    import java.util.ResourceBundle;
    
    public class MyJRViewer extends JRViewer {
    
        private static final Extension[] extensions;
    
        static {
            //HERE YOU CAN ADD WHATEVER EXTENSION YOU WANT
            extensions = new Extension[]{PDF, RTF, DOCX, ODT, HTML};
            //ADD THIS IF YOU WANT ALL
            //extensions = Extension.values();
        }
    
    
        public MyJRViewer(JasperPrint jasperPrint) {
            super(jasperPrint);
    
        }
    
        @Override
        protected JRViewerToolbar createToolbar() {
            JRViewerToolbar toolbar = super.createToolbar();
            Locale locale = viewerContext.getLocale();
            ResourceBundle resBundle = viewerContext.getResourceBundle();
    
            JRSaveContributor[] jrsc = new JRSaveContributor[extensions.length];
            Class[] type = {Locale.class, ResourceBundle.class};
            Object[] obj = {locale, resBundle};
            for (int i = 0; i < extensions.length; i++) {
                try {
                    Constructor cons = extensions[i].getClazz().getConstructor(type);
                    jrsc[i] = (JRSaveContributor) cons.newInstance(obj);
                } catch (Exception x) {
                    x.printStackTrace();
                }
            }
    
            toolbar.setSaveContributors(jrsc);
            return toolbar;
        }
    }
    

    如您所见,您可以更改静态块中的扩展,以获得所需的扩展。此类使用反射创建JRSaveContributor子类。

    最后,您可以轻松创建JFrame并将其添加到JFrame中。我们可以这样做:

    public class MyLauncher {
        public static void main(String[] args) {
            try {
                JasperReport compileReport = JasperCompileManager.compileReport(MyLauncher.class.getResourceAsStream("/myReport.jrxml"));
                JasperPrint fillReport = JasperFillManager.fillReport(compileReport, myReportParameters, new JREmptyDataSource());
    
                final MyJRViewer mrj = new MyJRViewer(fillReport);
                SwingUtilities.invokeLater(new Runnable() {
                   @Override
                   public void run() {
                       JFrame frame = new JFrame("Overview");
                       frame.add(mrj);
                       frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
                       frame.setUndecorated(true);
                       frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                       frame.setVisible(true);
    
                   }
                });
            } catch (JRException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }