/* 2 * ============================================================================ 3 * GNU Lesser General Public License 4 * ============================================================================ 5 * 6 * JasperReports - Free Java report-generating library. 7 * Copyright (C) 2001-2006 JasperSoft Corporation http://www.jaspersoft.com 8 * 9 * This library is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU Lesser General Public 11 * License as published by the Free Software Foundation; either 12 * version 2.1 of the License, or (at your option) any later version. 13 * 14 * This library is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * Lesser General Public License for more details. 18 * 19 * You should have received a copy of the GNU Lesser General Public 20 * License along with this library; if not, write to the Free Software 21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. 22 * 23 * JasperSoft Corporation 24 * 303 Second Street, Suite 450 North 25 * San Francisco, CA 94107 26 * http://www.jaspersoft.com 27 */ 28 package net.sf.jasperreports.view.save; 29 30 import java.io.File ; 31 import java.text.MessageFormat ; 32 33 import javax.swing.JOptionPane ; 34 35 import net.sf.jasperreports.engine.JRException; 36 import net.sf.jasperreports.engine.JRExporterParameter; 37 import net.sf.jasperreports.engine.JasperPrint; 38 import net.sf.jasperreports.engine.export.JRCsvExporter; 39 import net.sf.jasperreports.view.JRSaveContributor; 40 41 /** 42 * @author Teodor Danciu (teodord@users.sourceforge.net) 43 * @version $Id: JRCsvSaveContributor.java 1229 2006-04-19 13:27:35 +0300 (Wed, 19 Apr 2006) teodord $ 44 */ 45 public class JRCsvSaveContributor extends JRSaveContributor 46 { 47 48 /** 49 * 50 */ 51 private static final String EXTENSION_CSV = ".csv"; 52 public static final JRCsvSaveContributor INSTANCE = new JRCsvSaveContributor(); 53 54 /** 55 * 56 */ 57 public static JRCsvSaveContributor getInstance() 58 { 59 return INSTANCE; 60 } 61 62 /** 63 * 64 */ 65 public boolean accept(File file) 66 { 67 if (file.isDirectory()) 68 { 69 return true; 70 } 71 return file.getName().toLowerCase().endsWith(EXTENSION_CSV); 72 } 73 74 /** 75 * 76 */ 77 public String getDescription() 78 { 79 return "CSV (*.csv)"; 80 } 81 82 /** 83 * 84 */ 85 public void save(JasperPrint jasperPrint, File file) throws JRException 86 { 87 if (!file.getName().endsWith(EXTENSION_CSV)) 88 { 89 file = new File (file.getAbsolutePath() + EXTENSION_CSV); 90 } 91 92 if ( 93 !file.exists() || 94 JOptionPane.OK_OPTION == 95 JOptionPane.showConfirmDialog( 96 null, 97 MessageFormat.format( 98 java.util.ResourceBundle.getBundle("net/sf/jasperreports/view/viewer").getString("file.exists"), 99 new Object []{file.getName()} 100 ), 101 java.util.ResourceBundle.getBundle("net/sf/jasperreports/view/viewer").getString("save"), 102 JOptionPane.OK_CANCEL_OPTION 103 ) 104 ) 105 { 106 JRCsvExporter exporter = new JRCsvExporter(); 107 exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); 108 exporter.setParameter(JRExporterParameter.OUTPUT_FILE, file); 109 exporter.exportReport(); 110 } 111 } 112 113 } 仔细看下,其实问题很简单,他EXPORT时没有传字符编码这个参数,当然他也不知道传什么. public void exportReport() throws JRException 94 { 95 progressMonitor = (JRExportProgressMonitor)parameters.get(JRExporterParameter.PROGRESS_MONITOR); 96 97 /* */ 98 setOffset(); 99 100 /* */ 101 setInput(); 102 103 /* */ 104 if (!isModeBatch) 105 { 106 setPageRange(); 107 } 108 109 String encoding = (String )parameters.get(JRExporterParameter.CHARACTER_ENCODING); 110 if (encoding == null) 111 { 112 encoding = "ISO-8859-1"; 113 } 继承一个类来解决: package octopus_aes; import java.io.File; import java.text.MessageFormat; import java.util.Locale; import java.util.ResourceBundle; import javax.swing.JOptionPane; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRExporterParameter; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.export.JRCsvExporter; import net.sf.jasperreports.view.save.JRCsvSaveContributor; public class JMyCsvExport extends JRCsvSaveContributor { private static final String EXTENSION_CSV = ".csv"; public JMyCsvExport(Locale arg0, ResourceBundle arg1) { super(arg0, arg1); // TODO Auto-generated constructor stub } public void save(JasperPrint jasperPrint, File file) throws JRException { if (!file.getName().endsWith(EXTENSION_CSV)) { file = new File (file.getAbsolutePath() + EXTENSION_CSV); } if ( !file.exists() || JOptionPane.OK_OPTION == JOptionPane.showConfirmDialog( null, MessageFormat.format( java.util.ResourceBundle.getBundle("net/sf/jasperreports/view/viewer").getString("file.exists"), new Object []{file.getName()} ), java.util.ResourceBundle.getBundle("net/sf/jasperreports/view/viewer").getString("save"), JOptionPane.OK_CANCEL_OPTION ) ) { JRCsvExporter exporter = new JRCsvExporter(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_FILE, file); exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING,"BIG5"); exporter.exportReport(); PublicDefine.ShowMessage("導出文件成功!"); } } } 下面是处理保存对话框的代码: package octopus_aes; import java.lang.reflect.Constructor; import java.util.Locale; import java.util.ResourceBundle; import net.sf.jasperreports.engine.util.JRClassLoader; import net.sf.jasperreports.view.JRSaveContributor; import net.sf.jasperreports.view.JRViewer; public class iReportUtil { /** * User Defined JR Exportformats * * @param JRViewer * @return JRViewer */ public static JRViewer limitJRViewerFormats(JRViewer viewer) { // 保存對話框,去掉所有保存類型 JRSaveContributor[] save = viewer.getSaveContributors(); for (int i=0; i<save.length; i++) { viewer.removeSaveContributor(save[i]); } // Allow these SaveContributor final String[] DEFAULT_CONTRIBUTORS = { /*"net.sf.jasperreports.view.save.JRPrintSaveContributor",*/ "net.sf.jasperreports.view.save.JRPdfSaveContributor", // "net.sf.jasperreports.view.save.JROdtSaveContributor", // "net.sf.jasperreports.view.save.JRRtfSaveContributor", // "net.sf.jasperreports.view.save.JRHtmlSaveContributor", // "net.sf.jasperreports.view.save.JRSingleSheetXlsSaveContributor", // "net.sf.jasperreports.view.save.JRMultipleSheetsXlsSaveContributor", "net.sf.jasperreports.view.save.JRCsvSaveContributor", //"myJRCsvSaveContributor.JRCsvSaveContributor", // "net.sf.jasperreports.view.save.JRXmlSaveContributor", // "net.sf.jasperreports.view.save.JREmbeddedImagesXmlSaveContributor" }; //net.sf.jasperreports.view.JRSaveContributor. for(int i = 0; i < DEFAULT_CONTRIBUTORS.length; i++) { try { // System.out.println("DEFULT 是:"+DEFAULT_CONTRIBUTORS[i]); Class<?> saveContribClass = JRClassLoader.loadClassForName(DEFAULT_CONTRIBUTORS[i]); ResourceBundle jrViewerResBundel = ResourceBundle.getBundle("net/sf/jasperreports/view/viewer", viewer.getLocale() ); // System.out.println(jrViewerResBundel.toString()); Constructor constructor = saveContribClass.getConstructor(new Class[]{Locale.class, ResourceBundle.class}); JRSaveContributor saveContrib = null; if (i ==1) { saveContrib = new JMyCsvExport(viewer.getLocale(), jrViewerResBundel); }else{ saveContrib = (JRSaveContributor)constructor.newInstance(new Object[]{viewer.getLocale(), jrViewerResBundel }); }; viewer.addSaveContributor(saveContrib); } catch (Exception e) {} } return viewer; } }