博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
displaytag 导出
阅读量:4639 次
发布时间:2019-06-09

本文共 11997 字,大约阅读时间需要 39 分钟。

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

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

1           CSV |

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 row46             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 block102             e.printStackTrace();103         } catch (IOException e) {104             // TODO Auto-generated catch block105             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

你可能感兴趣的文章
JAE京东云引擎Git上传管理代码教程和京东云数据库导入导出管理
查看>>
教你如何迅速秒杀掉:99%的海量数据处理面试题
查看>>
高血压吃什么好?
查看>>
Java for LeetCode 047 Permutations II
查看>>
React工作原理
查看>>
JS 获取当前时间
查看>>
bzoj3238 [Ahoi2013]差异
查看>>
ASP.NET常见面试题及答案(130题)
查看>>
初学CDQ分治-NEU1702
查看>>
React组件的生命周期
查看>>
java笔记--使用SwingWoker类完成耗时操作
查看>>
Android应用程序后台加载数据
查看>>
2016北京集训测试赛(九)Problem C: 狂飙突进的幻想乡
查看>>
CentOS6.5手动升级gcc4.8.2
查看>>
3.9 java基础总结集合①LIst②Set③Map④泛型⑤Collections
查看>>
Unix和Linux下C语言学习指南
查看>>
linux指令
查看>>
linux下面升级 Python版本并修改yum属性信息
查看>>
局域网内通讯APP
查看>>
Unity Shader 图片流光效果实现(纯计算方式)
查看>>