只使用displaytag的导出功能,表单展示用jqgrid实现。只需要后台修改一部分代码,其他的表单都能使用这个功能导出。导出四种文件格式:csv,excel,xml,pdf。

思路:在过滤器中处理,过滤器类中获取查询的数据,生成文件流传给前台。表单是分页显示的,导出需要全部内容,将rows的值设成-1,page设成1即可;请求中传入显示的字段和对应的名称,用逗号隔开;加上表单查询条件;

1           <ahref='<c:urlvalue="/bus/home/page?6578706f7274=1&rows=-1&page=1">
2                     <c:paramname="filename"value="用户信息TIME.csv"></c:param>
3                     <c:paramname="fields"value="name;age;sex"></c:param>
4                     <c:paramname="titles"value="姓名;年龄;性别"></c:param>
5                 </c:url>'><spanclass="export csv">CSV </span></a>|

displaytag通过判断请求的参数中是否包含6578706f7274来判断是否为导出,我把这个保留下来并修改下:6578706f7274=1导出csv,6578706f7274=2导出excel,6578706f7274=3导出xml,6578706f7274=4导出pdf。

1   public voiddoFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)2         throwsIOException, ServletException3 {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 = newBufferedResponseWrapper13Impl((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 voidwriteExport(HttpServletResponse response,2 ServletRequest request, BufferedResponseWrapper wrapper)3             throwsIOException {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 staticString formatContentCsv(JSONArray array, String[] titles, String[] fields) {35         StringBuffer res = newStringBuffer();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         returnres.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 voidwriteExport(HttpServletResponse response,2 ServletRequest request, BufferedResponseWrapper wrapper)3             throwsIOException {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) throwsJspException  {36         try
37 {38             HSSFWorkbook wb = newHSSFWorkbook();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 staticTable tablePDF;2     private staticFont smallFont;3     private staticBaseFont bfChinese;4     public static voidwriteExport(HttpServletResponse response,5 ServletRequest request, BufferedResponseWrapper wrapper)6             throwsIOException {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) throwsJspException  {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) throwsBadElementException83 {84         Cell cell = new Cell(newChunk(StringUtils.trimToEmpty(value), smallFont));85 cell.setVerticalAlignment(Element.ALIGN_TOP);86         cell.setLeading(8);87         returncell;88 }89     private static void initTable(int colNums) throwsBadElementException90 {91         tablePDF = newTable(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     }

由于本人对一些原理上的理解还有些不足,所以解释的不是很多,不过基本所有代码都以贴上,功能已经实现。

转载于:https://www.cnblogs.com/yunp07/p/4250865.html

displaytag 导出相关推荐

  1. displaytag用法总结

    DisplayTag是一个非常好用的表格显示标签,适合MVC模式,其主页在http://displaytag.sourceforge.net 一.最简单的情况,未使用<display:colum ...

  2. displaytag的使用

    今天研究起displaytag标签来 分享下感想 这个东西吧功能倒是很强大 但是有很多不足 就本人使用来看 首先网上有很多例子关于配置的在这里我也转载一份 下面得部分是转载的 但有一点需要注意 就是包 ...

  3. displaytag标签相关知识(多篇文章)

    DisplayTag应用指南 [摘 要]本文详细介绍Web开发设计中的:DisplayTag应用指南,DisplayTag是一个非常好用的表格显示标签,适合MVC模式,其主页在http://displ ...

  4. displaytag的Excel导出实践

    本文转自 http://lingceng.iteye.com/blog/1820081/ Displaytag官网有1.0, 1.1, 1.2等,注意找到对应的版本.源码和API可以在Maven库中找 ...

  5. SSH集成之导入导出代码示例-页面部分(1)

    为什么80%的码农都做不了架构师?>>>    <%@ page language="java" pageEncoding="UTF-8" ...

  6. Displaytag 使用简介

    一 简介 Display Tag Lib是一个标签库,用来处理jsp网页上的Table,功能非常强,可以对的Table进行分页.数据导出.分组.对列排序等等. 二 安装使用 1.在displaytag ...

  7. displayTag使用总结

    写点儿东西真不容易,暂时写了这么些,先贴于此. [b]DisplayTag Tutorial by DarrenWang[/b]                    CopyRight June,2 ...

  8. DisplayTag应用总结

    我们目前开发的java Web项目中用到了DisplayTag,使用时参考了下面这篇网上找到的总结文档,感觉总结的很好,贴出来,供需求者参考. DisplayTag是一个非常好用的表格显示标签,适合M ...

  9. displaytag 中文问题 探索日志 注释

    重新上路: displayTagSupport库中: itext-1.3.jar commons-lang-2.6.jar standard.jar commons-beanutils-1.8.3.j ...

最新文章

  1. 网站优化工作关键——稳定排名!
  2. EntityFramework之摸索EF底层(八)
  3. Visual Studio 2013开发 mini-filter driver step by step (2) - 编译,部署,运行
  4. 2019年我建议你做好三件事情
  5. SQLite介绍、学习笔记、性能测试
  6. linux阻塞原语,Linux中的内存原语是什么?
  7. Shell学习之结合正则表达式与通配符的使用(五)
  8. 静态导入 java面试_Java面试系列【静态导入】-静态导入,基础篇
  9. Eslint常用命令
  10. 车载多传感器融合定位方案:GPS +IMU+MM
  11. Win9X、2000、XP、2003所有注册表设置
  12. CMYK convert RGB
  13. 7-2 求交错序列前N项和 (10 分)
  14. android 360度环拍,Android 4.2系统360度全景图拍摄试玩
  15. 360浏览器如何拦截java_安全卫士安装了JAVA,但是还是被浏览器拦截。
  16. Python实战 | 送亲戚,送长辈,“ 月饼 ”可视化大屏来帮忙。
  17. Android-PickerView系列之源码解析篇(二)
  18. C#实现串口通信的上位机开发
  19. js计算出来的文件md5值跟java计算出来的不一致
  20. Android开发的UI设计——Material Design

热门文章

  1. 伦理困境:人工智能浪潮与“AI威胁论”之争
  2. 2022-2028年中国碘矿行业竞争格局分析及市场需求前景报告
  3. 2022-2028年中国塑料导爆管行业市场调查研究及前瞻分析报告
  4. c语言函数传参时候的类型强制装换
  5. mybatis配置文件解析
  6. docfetcher,filelocator使用
  7. SQLALchemy之Python连接MySQL
  8. 一个隐马尔科夫模型的应用实例:中文分词
  9. NSight Compute 用户手册(下)
  10. 增强型固态硬盘支持人工智能工作负载