我正在开发使用Swing的框架和报告JasperReports的 Java桌面应用程序基础。 我有一些问题,当JasperViewer来了,我想保存报告。
我如何设置文件名(默认为空)在保存对话框,以及如何限制仅PDF格式?
这里是我的代码:
JRBeanCollectionDataSource beanCollection=new JRBeanCollectionDataSource(matakuliahs);
Map<String,Object> map=new HashMap<String, Object>();
map.put("namaMahasiswa", mahasiswa.getNama());
InputStream input=getClass().getResourceAsStream("/reportsederhana/reportsederhana.jrxml");
JasperDesign design=JRXmlLoader.load(input);
JasperReport report=JasperCompileManager.compileReport(design);
JasperPrint jasperPrint=JasperFillManager.fillReport(report, map, beanCollection);
jasperPrint.setName("Laporan "+mahasiswa.getNama()); // it doesn't give the name
JasperViewer.viewReport(jasperPrint,false);
用于设置默认的扩展名(S)保存到,一个想法是,你需要以某种方式获得JRViewer
从实例JasperViewer
(实例),然后,就作废了JRViewer
例如,你可以设置一些保存的贡献。 看看JRViewer.setSaveContributors(JRSaveContributor[] saveContribs)
对于设置文件名,我不完全肯定,但看看JRViewer.JRViewer(String, boolean)
。
另外,还要检查JRViewer和JasperViewer源代码,它可能会派上用场。
这是一个老的文章,但我遇到了同样的问题...
我从net.sf.jasperreports.view.JRViewer延长我的浏览器组件。 一些代码审查后,我看到了,这是唯一可以控制“lastFolder”,但不能从外部文件名。 所以,你可以设定上次使用的文件夹,如果不是由已经设置了:
if (lastFolder == null) {
this.lastFolder = new File(System.getProperty("user.home"));
}
不过,和多数民众赞成提示:工具栏的所有按钮都是公共领域!
因此,对于我的解决方案我删除了保存按钮的所有的ActionListeners(btnSave):
for (ActionListener actionListener : this.btnSave.getActionListeners()) {
this.btnSave.removeActionListener(actionListener);
}
然后加入我自己的实现。 这是很喜欢原来只与我控制根据该报告的名称和当前时间戳的文件名的区别。
...
File file = new File(lastFolder.getPath() + System.getProperty("file.separator") + DateTime.now().toString() + "_" + jasperPrint.getName());
...
另外我设置从.jasperprint预先选定的文件扩展为.pdf这是更方便的。
...
fileChooser.setFileFilter((FileFilter) saveContributors.get(1));
...
完整的ActionListener代码如下:
this.btnSave.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setLocale(getLocale());
fileChooser.updateUI();
File file = new File(lastFolder.getPath() + System.getProperty("file.separator") + DateTime.now().toString() + "_" + jasperPrint.getName());
fileChooser.setSelectedFile(file);
for (int i = 0; i < saveContributors.size(); i++)
fileChooser.addChoosableFileFilter((FileFilter) saveContributors.get(i));
if (saveContributors.contains(lastSaveContributor))
fileChooser.setFileFilter(lastSaveContributor);
else if (saveContributors.size() > 1)
fileChooser.setFileFilter((FileFilter) saveContributors.get(1));
if (lastFolder != null)
fileChooser.setCurrentDirectory(lastFolder);
int retValue = fileChooser.showSaveDialog(JasperViewer.this);
if (retValue == 0) {
FileFilter fileFilter = fileChooser.getFileFilter();
file = fileChooser.getSelectedFile();
lastFolder = file.getParentFile();
JRSaveContributor contributor = null;
if (fileFilter instanceof JRSaveContributor) {
contributor = (JRSaveContributor) fileFilter;
} else {
int i = 0;
do {
if (contributor != null || i >= saveContributors.size())
break;
contributor = (JRSaveContributor) saveContributors.get(i++);
if (!contributor.accept(file))
contributor = null;
} while (true);
if (contributor == null)
contributor = new JRPrintSaveContributor(jasperReportsContext, getLocale(), null);
}
lastSaveContributor = contributor;
try {
contributor.save(jasperPrint, file);
} catch (JRException ex) {
logger.error("Could not save report.", ex);
JOptionPane.showMessageDialog(JasperViewer.this, trc("JasperViewer.error.save", "Could not save report."));
}
}
}
});