只使用displaytag的导出功能,表单展示用jqgrid实现。只需要后台修改一部分代码,其他的表单都能使用这个功能导出。导出四种文件格式:csv,excel,xml,pdf。
思路:在过滤器中处理,过滤器类中获取查询的数据,生成文件流传给前台。表单是分页显示的,导出需要全部内容,将rows的值设成-1,page设成1即可;请求中传入显示的字段和对应的名称,用逗号隔开;加上表单查询条件;
1 <a href='<c:url value="/bus/home/page?6578706f7274=1&rows=-1&page=1"> 2 <c:param name="filename" value="用户信息TIME.csv"></c:param> 3 <c:param name="fields" value="name;age;sex"></c:param> 4 <c:param name="titles" value="姓名;年龄;性别"></c:param> 5 </c:url>'><span class="export csv">CSV </span></a>|
displaytag通过判断请求的参数中是否包含6578706f7274来判断是否为导出,我把这个保留下来并修改下:6578706f7274=1导出csv,6578706f7274=2导出excel,6578706f7274=3导出xml,6578706f7274=4导出pdf。
1 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 2 throws IOException, ServletException 3 { 4 5 if (servletRequest.getParameter(TableTagParameters.PARAMETER_EXPORTING) == null) 6 { 7 filterChain.doFilter(servletRequest, servletResponse); 8 return; 9 } 10 int exportType = Integer.valueOf(servletRequest.getParameter(TableTagParameters.PARAMETER_EXPORTING)); 11 HttpServletRequest request = (HttpServletRequest) servletRequest; 12 13 BufferedResponseWrapper wrapper = new BufferedResponseWrapper13Impl((HttpServletResponse) servletResponse); 14 15 filterChain.doFilter(request, wrapper); 16 17 switch (exportType) { 18 case 1: 19 ExportCsv.writeExport((HttpServletResponse) servletResponse, servletRequest, wrapper); 20 break; 21 case 2: 22 ExportExcel.writeExport((HttpServletResponse) servletResponse, servletRequest, wrapper); 23 break; 24 case 3: 25 ExportXml.writeExport((HttpServletResponse) servletResponse, servletRequest, wrapper); 26 break; 27 case 4: 28 ExportPdf.writeExport((HttpServletResponse) servletResponse, servletRequest, wrapper); 29 break; 30 31 default: break; 32 } 33 34 }
导出csv文件:
displaytag导出cvs文件的实现:把数据放到字符串中,字符串需要按照cvs内容格式拼接好:每行的数据用逗号(,)分开,每行最后加上换行即可,然后把数据字符串放入响应的流中传到前台产生csv文件。
1 public static void writeExport(HttpServletResponse response, 2 ServletRequest request, BufferedResponseWrapper wrapper) 3 throws IOException { 4 5 if(request.getParameter("fields") == null){ 6 return; 7 } 8 if(request.getParameter("titles") == null){ 9 return; 10 } 11 if(request.getParameter("filename") == null){ 12 return; 13 } 14 15 String filename = request.getParameter("filename").replace("TIME", DateUtils.dateToString(new Date(), "yyyyMMddHHmmss")); 16 String[] fields = request.getParameter("fields").split(";"); 17 String[] titles = new String( request.getParameter("titles").getBytes("ISO8859-1"),"UTF-8").split(";"); 18 String contentType = "text/csv; charset=GB2312"; 19 response.setHeader("Content-Disposition", "attachment; filename=\"" 20 + filename + "\""); 21 22 response.setContentType(contentType); 23 String strCon = wrapper.getContentAsString(); 24 JSONObject object = JSONObject.fromObject(strCon); 25 JSONArray array = object.getJSONArray("rows"); 26 String cons = formatContentCsv(array, titles, fields); 27 response.setContentLength(cons.getBytes("GB2312").length); 28 PrintWriter out = response.getWriter(); 29 out.write(cons); 30 out.flush(); 31 32 } 33 34 private static String formatContentCsv(JSONArray array, String[] titles, String[] fields) { 35 StringBuffer res = new StringBuffer(); 36 Iterator iterator = array.iterator(); 37 for (String s : titles) { 38 res.append(s + ","); 39 } 40 res.append("\r"); 41 while (iterator.hasNext()) { 42 JSONObject jsonObj = (JSONObject) iterator.next(); 43 44 for (String s : fields) { 45 res.append(jsonObj.getString(s)+","); 46 } 47 res.append("\r"); 48 } 49 return res.toString(); 50 51 }
导出xml文件:
导出xml文件基本和导出csv文件相同,都是把数据以字符串形式放入流中传到前台。区别就是字符串拼接成xml内容格式和response.setContentType("text/xml; charset=UTF-8");
代码略。
导出excel文件:
displaytag导出excel文件也是使用POI提供的导出功能。创建HSSFWorkbook wb = new HSSFWorkbook();然后将数据遍历放入wb中,然后将wb写入字节流中传入前台。
1 public static void writeExport(HttpServletResponse response, 2 ServletRequest request, BufferedResponseWrapper wrapper) 3 throws IOException { 4 if(request.getParameter("fields") == null){ 5 return; 6 } 7 if(request.getParameter("titles") == null){ 8 return; 9 } 10 if(request.getParameter("filename") == null){ 11 return; 12 } 13 14 String filename = request.getParameter("filename").replace("TIME", DateUtils.dateToString(new Date(), "yyyyMMddHHmmss")); 15 String[] fields = request.getParameter("fields").split(";"); 16 String[] titles = new String( request.getParameter("titles").getBytes("ISO8859-1"),"UTF-8").split(";"); 17 String contentType = "application/vnd.ms-excel; charset=utf-8"; 18 response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); 19 20 response.setContentType(contentType); 21 String strCon = wrapper.getContentAsString(); 22 JSONObject object = JSONObject.fromObject(strCon); 23 JSONArray array = object.getJSONArray("rows"); 24 OutputStream out = response.getOutputStream(); 25 try { 26 createExcel(out, array, titles, fields); 27 } catch (JspException e) { 28 e.printStackTrace(); 29 } 30 out.flush(); 31 out.close(); 32 33 } 34 35 public static void createExcel(OutputStream out, JSONArray array, String[] titles, String[] fields) throws JspException { 36 try 37 { 38 HSSFWorkbook wb = new HSSFWorkbook(); 39 HSSFSheet sheet; 40 sheet = wb.createSheet("-"); 41 42 int rowNum = 0; 43 int colNum = 0; 44 45 // Create an header row 46 HSSFRow xlsTitleRow = sheet.createRow(rowNum++); 47 48 HSSFCellStyle headerStyle = wb.createCellStyle(); 49 HSSFFont bold = wb.createFont(); 50 bold.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 51 headerStyle.setFont(bold); 52 53 for(String s: titles){ 54 HSSFCell cell = xlsTitleRow.createCell((short) colNum); 55 cell.setCellValue(s); 56 cell.setCellStyle(headerStyle); 57 sheet.setColumnWidth(colNum, 33*180); 58 colNum++; 59 } 60 Iterator ite = array.iterator(); 61 while (ite.hasNext()) 62 { 63 HSSFRow xlsRow = sheet.createRow(rowNum++); 64 colNum = 0; 65 JSONObject jsonObj = (JSONObject)ite.next(); 66 for(String s: fields){ 67 int index = colNum; 68 HSSFCell cell = xlsRow.createCell((short) colNum++); 69 cell.setCellValue(jsonObj.getString(s)); 70 } 71 72 } 73 wb.write(out); 74 } 75 catch (Exception e) 76 { 77 e.printStackTrace();78 } 79 } 80
导出pdf文件:
displaytag导出pdf文件需要导入itext包,如果有中文,不要使用FontFactory.getFont()设置字体,否则中文不显示(我用BaseFont.createFont可以正确显示中文)。
1 private static Table tablePDF; 2 private static Font smallFont; 3 private static BaseFont bfChinese; 4 public static void writeExport(HttpServletResponse response, 5 ServletRequest request, BufferedResponseWrapper wrapper) 6 throws IOException { 7 8 if(request.getParameter("fields") == null){ 9 return; 10 } 11 if(request.getParameter("titles") == null){ 12 return; 13 } 14 if(request.getParameter("filename") == null){ 15 return; 16 } 17 18 String filename = request.getParameter("filename").replace("TIME", DateUtils.dateToString(new Date(), "yyyyMMddHHmmss")); 19 String[] fields = request.getParameter("fields").split(";"); 20 String[] titles = new String( request.getParameter("titles").getBytes("ISO8859-1"),"UTF-8").split(";"); 21 String contentType = "application/pdf; charset=utf-8"; 22 response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); 23 24 response.setContentType(contentType); 25 String strCon = wrapper.getContentAsString(); 26 JSONObject object = JSONObject.fromObject(strCon); 27 JSONArray array = object.getJSONArray("rows"); 28 OutputStream out = response.getOutputStream(); 29 try { 30 createPdf(out, array, titles, fields); 31 } catch (JspException e) { 32 e.printStackTrace(); 33 } 34 out.flush(); 35 out.close(); 36 37 } 38 39 public static void createPdf(OutputStream out, JSONArray array, String[] titles, String[] fields) throws JspException { 40 try 41 { 42 initTable(titles.length); 43 // Initialize the Document and register it with PdfWriter listener and the OutputStream 44 Document document = new Document(PageSize.A4.rotate(), 60, 60, 40, 40); 45 document.addCreationDate(); 46 47 HeaderFooter footer = new HeaderFooter(new Phrase(TagConstants.EMPTY_STRING, smallFont), true); 48 footer.setBorder(Rectangle.NO_BORDER); 49 footer.setAlignment(Element.ALIGN_CENTER); 50 51 PdfWriter.getInstance(document, out); 52 53 // Fill the virtual PDF table with the necessary data 54 55 56 for(String s: titles){ 57 Cell hdrCell = getCell(s); 58 hdrCell.setGrayFill(0.9f); 59 hdrCell.setHeader(true); 60 tablePDF.addCell(hdrCell); 61 } 62 Iterator ite = array.iterator(); 63 while (ite.hasNext()) 64 { 65 JSONObject jsonObj = (JSONObject)ite.next(); 66 for(String s: fields){ 67 Cell cell = getCell(jsonObj.getString(s)); 68 tablePDF.addCell(cell); 69 } 70 71 } 72 document.open(); 73 document.setFooter(footer); 74 document.add(tablePDF); 75 document.close(); 76 } 77 catch (Exception e) 78 { 79 e.printStackTrace(); 80 } 81 } 82 private static Cell getCell(String value) throws BadElementException 83 { 84 Cell cell = new Cell(new Chunk(StringUtils.trimToEmpty(value), smallFont)); 85 cell.setVerticalAlignment(Element.ALIGN_TOP); 86 cell.setLeading(8); 87 return cell; 88 } 89 private static void initTable(int colNums) throws BadElementException 90 { 91 tablePDF = new Table(colNums); 92 tablePDF.setDefaultVerticalAlignment(Element.ALIGN_TOP); 93 tablePDF.setCellsFitPage(true); 94 tablePDF.setWidth(100); 95 96 tablePDF.setPadding(2); 97 tablePDF.setSpacing(0); 98 try { 99 bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); 100 } catch (DocumentException e) { 101 // TODO Auto-generated catch block 102 e.printStackTrace(); 103 } catch (IOException e) { 104 // TODO Auto-generated catch block 105 e.printStackTrace(); 106 } 107 // smallFont = FontFactory.getFont(FontFactory.HELVETICA, 7, Font.NORMAL, new Color(0, 0, 0)); 108 smallFont = new Font(bfChinese, 7, Font.NORMAL); 109 110 }
由于本人对一些原理上的理解还有些不足,所以解释的不是很多,不过基本所有代码都以贴上,功能已经实现。