[英]How do you set the JRViewer export options?
最近,我使用最新的jasper-reports lib更新了我的項目。 有一個新的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 });
您必須擴展net.sf.jasperreports.swing.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;
}
}
您可以使用此方法以模塊化方式選擇擴展名。
首先,我們定義一個枚舉,其中包含所有擴展類,所有這些類都是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();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.