下面是报表导出工具类reportExportUtils 需要导出以上格式的报表 只需要调用本工具类的exportmain 方法即可。
1 package com.bzhinfo; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.lang.reflect.Field; 9 import java.util.Collection; 10 import java.util.HashMap; 11 import java.util.List; 12 import java.util.Map; 13 import javax.servlet.ServletOutputStream; 14 import javax.servlet.http.HttpServletRequest; 15 import javax.servlet.http.HttpServletResponse; 16 import net.sf.jasperreports.engine.JRDataSource; 17 import net.sf.jasperreports.engine.JRException; 18 import net.sf.jasperreports.engine.JRExporter; 19 import net.sf.jasperreports.engine.JRExporterParameter; 20 import net.sf.jasperreports.engine.JasperExportManager; 21 import net.sf.jasperreports.engine.JasperFillManager; 22 import net.sf.jasperreports.engine.JasperPrint; 23 import net.sf.jasperreports.engine.JasperReport; 24 import net.sf.jasperreports.engine.base.JRBaseReport; 25 import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; 26 import net.sf.jasperreports.engine.export.JRHtmlExporter; 27 import net.sf.jasperreports.engine.export.JRHtmlExporterParameter; 28 import net.sf.jasperreports.engine.export.JRRtfExporter; 29 import net.sf.jasperreports.engine.export.JRXlsExporter; 30 import net.sf.jasperreports.engine.export.JRXlsExporterParameter; 31 import net.sf.jasperreports.engine.util.JRLoader; 32 import org.apache.commons.lang.StringUtils; 33 import org.apache.log4j.Logger; 34 import org.apache.struts2.ServletActionContext; 35 import com.opensymphony.xwork2.ActionContext; 36 37 @SuppressWarnings("unchecked") 38 public class JasperUtils { 39 40 private static Logger logger = Logger.getLogger(JasperUtils.class); 41 public static final String PRINT_TYPE = "print"; 42 public static final String PDF_TYPE = "pdf"; 43 public static final String EXCEL_TYPE = "excel"; 44 public static final String HTML_TYPE = "html"; 45 public static final String WORD_TYPE = "word"; 46 47 /** 48 * 如果导出的是excel,则需要去掉周围的margin 49 * 50 * @param jasperReport 51 * @param type 52 */ 53 public static void prepareReport(JasperReport jasperReport, String type) { 54 logger 55 .debug("The method======= prepareReport() start......................."); 56 if ("excel".equals(type)) 57 try { 58 Field margin = JRBaseReport.class 59 .getDeclaredField("leftMargin"); 60 margin.setAccessible(true); 61 margin.setInt(jasperReport, 0); 62 margin = JRBaseReport.class.getDeclaredField("topMargin"); 63 margin.setAccessible(true); 64 margin.setInt(jasperReport, 0); 65 margin = JRBaseReport.class.getDeclaredField("bottomMargin"); 66 margin.setAccessible(true); 67 margin.setInt(jasperReport, 0); 68 Field pageHeight = JRBaseReport.class 69 .getDeclaredField("pageHeight"); 70 pageHeight.setAccessible(true); 71 pageHeight.setInt(jasperReport, 2147483647); 72 } catch (Exception exception) { 73 74 } 75 76 } 77 78 /** 79 * 导出Excel 80 * 81 * @param jasperPrint 82 * @param defaultFilename 83 * @param request 84 * @param response 85 * @throws IOException 86 * @throws JRException 87 */ 88 public static void exportExcel(JasperPrint jasperPrint, 89 String defaultFilename, HttpServletRequest request, 90 HttpServletResponse response) throws IOException, JRException { 91 logger 92 .debug("执行导出excel The method======= exportExcel() start......................."); 93 response.setContentType("application/vnd.ms-excel"); // 设置头文件信息 94 String defaultname = null; 95 if (defaultFilename.trim() != null && defaultFilename != null) { 96 defaultname = defaultFilename + ".xls"; 97 } else { 98 defaultname = "export.xls"; 99 } 100 String fileName = new String(defaultname.getBytes("gbk"), "utf-8"); 101 response.setHeader("Content-disposition", "attachment; filename=" 102 + fileName); 103 ServletOutputStream ouputStream = response.getOutputStream(); 104 JRXlsExporter exporter = new JRXlsExporter(); 105 exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); 106 exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream); 107 exporter.setParameter( 108 JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, 109 Boolean.TRUE); 110 exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, 111 Boolean.FALSE); 112 exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, 113 Boolean.FALSE); 114 exporter.exportReport(); 115 ouputStream.flush(); 116 ouputStream.close(); 117 } 118 119 /** 120 * 导出pdf,注意此处中文问题, 这里应该详细说:主要在ireport里变下就行了。看图 121 * 1)在ireport的classpath中加入iTextAsian.jar 2)在ireport画jrxml时,看ireport最左边有个属性栏。 122 * 下边的设置就在点字段的属性后出现。 pdf font name :STSong-Light ,pdf encoding :UniGB-UCS2-H 123 */ 124 private static void exportPdf(JasperPrint jasperPrint, 125 String defaultFilename, HttpServletRequest request, 126 HttpServletResponse response) throws IOException, JRException { 127 response.setContentType("application/pdf"); 128 String defaultname = null; 129 if (defaultFilename.trim() != null && defaultFilename != null) { 130 defaultname = defaultFilename + ".pdf"; 131 } else { 132 defaultname = "export.pdf"; 133 } 134 String fileName = new String(defaultname.getBytes("GBK"), "utf-8"); 135 response.setHeader("Content-disposition", "attachment; filename=" 136 + fileName); 137 ServletOutputStream ouputStream = response.getOutputStream(); 138 JasperExportManager.exportReportToPdfStream(jasperPrint, ouputStream); 139 ouputStream.flush(); 140 ouputStream.close(); 141 } 142 143 /** 144 * 导出html 145 * 146 * @param pageIndexStr 147 */ 148 149 private static void exportHtml(JasperPrint jasperPrint, 150 String defaultFilename, HttpServletRequest request, 151 HttpServletResponse response, String pageIndexStr) 152 throws IOException, JRException { 153 response.setContentType("text/html"); 154 ServletOutputStream ouputStream = response.getOutputStream(); 155 JRHtmlExporter exporter = new JRHtmlExporter(); 156 Integer pageIndex = getPageIndex(jasperPrint, request, pageIndexStr); // 得到当前页码 157 if (pageIndex != null) { // 如果页码不为空 则设置分页页码 158 exporter.setParameter(JRExporterParameter.PAGE_INDEX, pageIndex); 159 } 160 exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, 161 Boolean.FALSE); 162 exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); 163 exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8"); 164 exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream); 165 exporter.exportReport(); 166 ouputStream.flush(); 167 ouputStream.close(); 168 169 } 170 171 /** 172 * description:通过传进来的pageIndexStr 得到当前页码 Date 2013-1-18 上午10:49:38 173 * 174 * @param @param jasperPrint 175 * @param @param request 176 * @param @param pageIndexStr 177 * @param @return 178 * @return Integer 179 */ 180 private static Integer getPageIndex(JasperPrint jasperPrint, 181 HttpServletRequest request, String pageIndexStr) { 182 if (pageIndexStr == null || StringUtils.isBlank(pageIndexStr)) { // 如果pageIndexStr为空或空字符串则返回null 183 return null; 184 } 185 Integer pageIndex = 0; 186 int lastPageIndex = 0; 187 if (jasperPrint.getPages() != null) { // 得到最后一页的 页码 188 lastPageIndex = jasperPrint.getPages().size() - 1; 189 } 190 if ("lastPage".equals(pageIndexStr)) { // 如果字符串==lastPage 191 // 则反lastPageIndex的值赋给pageIndex 192 // 并返回pageIndex 193 pageIndex = lastPageIndex; 194 return pageIndex; 195 } 196 try { 197 pageIndex = Integer.parseInt(pageIndexStr); 198 if (pageIndex > 0) { // 从ireport 199 // 传来的PageIndex是从1开始,而JRExporterParameter.PAGE_INDEX是从0开始的 200 pageIndex = pageIndex - 1; 201 } 202 } catch (Exception e) { 203 e.printStackTrace(); 204 } 205 if (pageIndex < 0) { 206 pageIndex = 0; 207 } 208 if (pageIndex > lastPageIndex) { 209 pageIndex = lastPageIndex; 210 } 211 return pageIndex; 212 } 213 214 /** 215 * 导出word 216 */ 217 218 private static void exportWord(JasperPrint jasperPrint, 219 String defaultFilename, HttpServletRequest request, 220 HttpServletResponse response) throws JRException, IOException { 221 response.setContentType("application/msword;charset=utf-8"); 222 String defaultname = null; 223 if (defaultFilename.trim() != null && defaultFilename != null) { 224 defaultname = defaultFilename + ".doc"; 225 } else { 226 defaultname = "export.doc"; 227 } 228 String fileName = new String(defaultname.getBytes("GBK"), "utf-8"); 229 response.setHeader("Content-disposition", "attachment; filename=" 230 + fileName); 231 JRExporter exporter = new JRRtfExporter(); 232 exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); 233 exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, response 234 .getOutputStream()); 235 exporter.exportReport(); 236 } 237 238 /** 239 * 按照类型导出不同格式文件 240 * 241 * @param datas 242 * 数据 243 * @param type 244 * 文件类型 245 * @param is 246 * jasper文件的来源 247 * @param request 248 * @param response 249 * @param defaultFilename默认的导出文件的名称 250 */ 251 252 private static void export(Collection datas, String type, 253 String defaultFilename, InputStream is, HttpServletRequest request, 254 HttpServletResponse response, String pageIndexStr) { 255 logger 256 .debug("导出判断 The method======= export() start......................."); 257 try { 258 logger.info("is==" + is); 259 JasperReport jasperReport = (JasperReport) JRLoader.loadObject(is); 260 prepareReport(jasperReport, type); 261 JRDataSource ds = new JRBeanCollectionDataSource(datas, false); 262 Map parameters = new HashMap(); 263 JasperPrint jasperPrint = JasperFillManager.fillReport( 264 jasperReport, parameters, ds); 265 if (EXCEL_TYPE.equals(type)) { 266 exportExcel(jasperPrint, defaultFilename, request, response); 267 } else if (PDF_TYPE.equals(type)) { 268 exportPdf(jasperPrint, defaultFilename, request, response); 269 } else if (HTML_TYPE.equals(type)) { 270 exportHtml(jasperPrint, defaultFilename, request, response, 271 pageIndexStr); 272 } else if (WORD_TYPE.equals(type)) { 273 exportWord(jasperPrint, defaultFilename, request, response); 274 } 275 } catch (Exception e) { 276 e.printStackTrace(); 277 } 278 } 279 280 /** 281 * 导出入口 (导出所有的数据 ) 282 * 283 * @param exportType 284 * 导出文件的类型 285 * @param jaspername 286 * jasper文件的名字 如: xx.jasper 287 * @param lists 288 * 导出的数据 289 * @param request 290 * @param response 291 * @param defaultFilename默认的导出文件的名称 292 */ 293 public static void exportmain(String exportType, String jaspername, 294 List lists, String defaultFilename) { 295 exportmain(exportType, jaspername, lists, defaultFilename, null); 296 } 297 298 /** 299 * 导出入口 (分页显示 导出传入的pageIndex 页的数据) 300 * 301 * @param exportType 302 * 导出文件的类型 303 * @param jaspername 304 * jasper文件的名字 如: xx.jasper 305 * @param lists 306 * 导出的数据 307 * @param request 308 * @param response 309 * @param defaultFilename默认的导出文件的名称 310 * @param pageIndex 311 * 需要导出数据的页码 当pageIndex = null时导出所有数据 312 */ 313 314 @SuppressWarnings("deprecation") 315 public static void exportmain(String exportType, String jaspername, 316 List lists, String defaultFilename, String pageIndexStr) { 317 logger 318 .debug("进入导出 The method======= exportmain() start......................."); 319 ActionContext ct = ActionContext.getContext(); 320 HttpServletRequest request = (HttpServletRequest) ct 321 .get(ServletActionContext.HTTP_REQUEST); 322 HttpServletResponse response = ServletActionContext.getResponse(); 323 String filenurl = request.getRealPath("/view/situation/jasper/" 324 + jaspername); 325 File file = new File(filenurl); 326 InputStream is = null; 327 try { 328 is = new FileInputStream(file); 329 } catch (FileNotFoundException e) { 330 e.printStackTrace(); 331 } 332 export(lists, exportType, defaultFilename, is, request, response, 333 pageIndexStr); 334 } 335 336 }