首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何设置JRViewer导出选项?

如何设置JRViewer导出选项?
EN

Stack Overflow用户
提问于 2017-11-17 10:56:46
回答 2查看 1.5K关注 0票数 1

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

代码语言:javascript
运行
复制
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 });
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-17 12:54:30

您必须扩展net.sf.jasperreports.swing.JRViewer并将导出贡献者设置为JRViewerToolbar。就像这样:

代码语言:javascript
运行
复制
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;
    }   
}
票数 5
EN

Stack Overflow用户

发布于 2018-08-27 11:04:20

您可以使用这些方法对扩展进行模块化选择。

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

代码语言:javascript
运行
复制
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方法并应用配置的类:

代码语言:javascript
运行
复制
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中。以下是我们如何做到这一点:

代码语言:javascript
运行
复制
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();
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47349042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档