当前位置: 首页 > 编程日记 > 正文

displaytag 导出

只使用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     }

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

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

相关文章:

两个下拉框相关联ajax,触发第二个下拉框以显示基于从第一个下拉框中选择的值的值ajax...

我有两个引导程序下拉框。当我们点击另一个下拉菜单时&#xff0c;其中一个会根据用户选择的国家显示来自数据库的所有国家名称&#xff0c;另一个下拉菜单应该选择状态。 当我点击一个下拉菜单时&#xff0c;我做了一个ajax请求来显示国家名称。如何根据国家选择触发其他下拉菜…

使用apache服务器配置虚拟目录

安装好了apachephpmysql之后就像在自己电脑上安装wordpress玩玩&#xff0c;因为安装好之后根目录在D盘&#xff0c; 所以就想自己配置一个虚拟目录指向路径为D:\wordpress的wordpress 在httpd.conf中添加虚拟目录之后去访问localhost:88/myblog却出现了403错误&#xff0c;提示…

YARN的HA

拓展&#xff1a;线程与进程的区别 进程是由一个以上的的线程组成的 ps -ef 能出现的就是进程。 YARN HA hadoop001&#xff1a;zk rm(zkfc) nmhadoop002&#xff1a;zk rm(zkfc) nmhadoop003&#xff1a;zk nm ZKFC: 线程 只作为RM进程的一个线程而非独立的进程存在 RMStateSt…

一个复杂的存储过程

首先说明一下我这个存储过程的功能&#xff1a; 根据不同的查询条件组合进行查询数据&#xff0c;数据库中有项目信息表Project 有项目区域表ProjectArea 项目信息表Project和项目区域表的关联是通过ProjectArea和AreaID进行一对一关联&#xff0c;项目区域信息中的信息有所属关…

Go 分布式学习利器(13)-- Go语言的多态

文章目录1. 基本的多态实现2. 空接口与断言3. Go接口的最佳实践1. 基本的多态实现 我们知道C中实现多态是通过虚函数表 和 继承来 实现的。 类似如下代码&#xff1a; class Programmar{ public:virtual void write_hello_world() 0; }class GoProgrammar: public Programma…

服务器搭建虚拟win云服务,云服务器创建win10虚拟机

云服务器创建win10虚拟机 内容精选换一换弹性云服务器(Elastic Cloud Server&#xff0c;以下简称ECS)是由CPU、内存、镜像、云硬盘组成的一种可随时获取、弹性可扩展的计算服务器&#xff0c;同时它结合VPC、虚拟防火墙、数据多副本保存等能力&#xff0c;为您打造一个高效、可…

预编译 ASP.NET 网站以进行部署

预编译 ASP.NET 网站以进行部署和更新 打开一个命令窗口并定位到包含 .NET Framework 的文件夹。 .NET Framework 将安装在以下位置。 %windir%\Microsoft.NET\Framework\version运行 aspnet_compiler 命令&#xff0c;在命令提示符下键入以下内容&#xff0c;同时指定源&…

Go 分布式学习利器(14)-- Go语言的错误处理

1. Go 的错误机制 Go 语言的错误机制中与其他语言的主要差异如下&#xff1a; 没有异常机制error 类型实现了 error接口type error interface {Error() string }可以通过errors.New来快速创建错误实例errors.New(" num is not in range[0,100]")如下测试代码演示基…

30 个 php 操作 redis 常用方法代码例子

这篇文章主要介绍了 30 个 php 操作 redis 常用方法代码例子 , 本文其实不止 30 个方法 , 可以操作 string 类型、 list 类型和 set 类型的数据 , 需要的朋友可以参考下redis 的操作很多的,以前看到一个比较全的博客,但是现在找不到了。查个东西搜半天,下面整理一下php 处理 re…

电脑机时,电脑死机时,为啥会忍不住扇它一巴掌?

我们为什么会把自己的愤怒发泄在机器人呢&#xff1f;对于人们为何会打机器这个问题&#xff0c;国外媒体Hopes&Fears请教了很多专家&#xff0c;包括精神治疗医师、机械工程师、愤怒管理专家以及流行文化专家。有一场非常重要的会议就要召开了&#xff0c;你必须在五分钟时…

Android所有系统版本USB调试模式打开方法

参考 Android所有系统版本USB调试模式打开方法

docker(4)docker的网络,自定义网桥

Docker 的网络 运行 ifconfig 找到 docker0 : 虚拟网卡默认网卡名称为docker0 查看docker 的网桥&#xff1a; 我这里默认们没有进行安装 网桥管理设备&#xff1a;进行安装一下&#xff1b; yum install bridge-utils 命令&#xff1a;查看网桥crctl show: 注意上图中的i…

Go 分布式学习利器(15) -- Go 实现 深搜和广搜

强化语法&#xff0c;回顾算法。 通过Go语言实现 深度优先搜索 和 广度优先搜索&#xff0c;来查找社交网络中的三度好友关系&#xff08;三度指的是一个节点到 其相邻节点 到 其相邻节点的节点 &#xff0c;图递增三层好友关系&#xff09;。 涉及到的Go语言语法&#xff1a…

css背景属性

CSS背景&#xff1a; 属性 描述 background 简写属性&#xff0c;作用是将背景属性设置在一个声明中。 background-attachment 背景图像是否固定或者随着页面的其余部分滚动。 background-color 设置元素的背景颜色。 background-image 把图像设置为背景。 backgroun…

scp服务器复制命令跳过已有的文件夹,Linux scp命令复制文件到其它服务器上

例如&#xff1a;我想将59.64.30.101中的文件复制到59.64.28.78服务器。步骤如下&#xff1a;1.59.64.30.101终端执行如下命令#ssh-keygen -t rsa2.密钥生成后会在/root/.ssh/文件夹下产生两个文件id_rsa id_rsa.pub将id_rsa.pub文件复制到59.64.28.78执行如下命令scp id_rsa.p…

Win2008学习(二),群集的仲裁配置

当群集中的节点发生故障时&#xff0c;会有其它节点继续提供服务。不过&#xff0c;当节点之间的通信有问题或太多故障节点时&#xff0c;群集服务就会停止&#xff0c;可是群集可以容纳多少个节点故障呢&#xff1f;这要由仲裁配置&#xff08;Quorum Configuration&#xff0…

前端token刷新并发处理

添加中间件&#xff0c;处理多个前端来的请求时&#xff0c;如果token需要刷新&#xff0c;先查看缓存&#xff0c;如果没有就在redis中做个标志位进行短期缓存&#xff0c;其他的请求发现缓存中的token&#xff0c;就不再刷新token了。这样就避免了重复刷新token的问题。 中间…

Rocksdb 的一些参数调优策略

文章目录写性能优化CF write buffer sizeDB write buffer size读性能优化block cachebloom filterCompression 压缩Compaction优化通用workload的配置本文在rocksdb 整个读写链路基础上给出一些简单的调优策略&#xff0c;主要是通过调整一些 参数来满足我们大多数workload的性…

Java项目:酒店管理系统(java+SSM+jsp+mysql+maven)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 主要技术:java springmvc mybatis mysql tomcat js jauery jsp log4j等一些常见基本技术适用于Java毕设和学习使用 主要实现&#xff1a; 前台&#xff1a;登录、注册、酒店信息浏览、搜索酒店信息…

设计模式之装饰模式(Java实现)

“怎么了&#xff0c;鱼哥&#xff1f;” “唉&#xff0c;别提了&#xff0c;网购了一件衣服&#xff0c;结果发现和商家描述的差太多了&#xff0c;有色差就算了&#xff0c;质量还不好&#xff0c;质量不好就算了&#xff0c;竟然大小也不行&#xff0c;说好的3个X&#xff…

ueditor与七牛云存储结合

2019独角兽企业重金招聘Python工程师标准>>> 摘要&#xff1a; ueditor与七牛云存储结合&#xff0c;主要是表单api. ueditor上传图片到七牛云存储 ueditor结合七牛传图片 传统上&#xff0c;图片是存在自己的服务器上(图片->自己服务器)&#xff0c;如果使用…

微服务网关从零搭建——(七)更改存储方式为oracle

资源准备&#xff1a; 下载开源项目 新建oracle表&#xff1a; -- ---------------------------- -- Table structure for OcelotGlobalConfiguration -- ----------------------------CREATE TABLE OcelotGlobalConfiguration (Id NUMBER(11) NOT NULL ,GatewayName NVARCHAR2…

Rocksdb 的优秀代码(一) -- 工业级分桶算法实现分位数p50,p99,p9999

文章目录基本概念普通的分位数计算Rocksdb中的应用rocksdb中的分桶算法结果展示rocksdb 分桶算法实现一些总结 和 相关论文我们知道一个完整的监控系统必须存在p99/p999等分位数指标&#xff0c;作为系统可用性的评判标准之一。而像开源监控系统中做的很不错的grafana和prometh…

Java项目:前后端分离疫情防疫平台设计和实现(java+springmvc+VUE+node.js+mybatis+mysql+springboot+redis+jsp)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 主要技术&#xff1a;Java、springmvc、VUE、node.js、mybatis、mysql、tomcat、jquery、layui、bootstarp、JavaScript、html、css、jsp、log4j等一些常见的基本技术。 主要模块功能有&#xff1a; 管理员…

js里的匿名函数 数组排序

// 匿名函数&#xff1a;其实就是函数的简写形式 var method function(){ alert("123"); } method(); // 匿名函数可以用于事件的处理 function func(){ alert("456"); } window.οnlοadfunc; window.οnlοadfunction(){ alert("加载完成&#xff0…

oracle监听器动态注册于静态注册的区别

2019独角兽企业重金招聘Python工程师标准>>> 1, oracle 10g 用netca方式建立的都默认为动态注册方式 2&#xff0c;如果想改为静态注册的方式则在listener.ora 中加入如下内容即可 SID_LIST_LISTENER (SID_LIST (SID_DESC (SID_NAME PLSExtProc) (ORACLE_HOME …

什么是Singleton?

Singleton&#xff1a;在Java中即指单例设计模式&#xff0c;它是软件开发中最常用的设计模式之一。 单&#xff1a;指唯一 例&#xff1a;指实例 单例设计模式&#xff0c;即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式。 要点&#xff1a; 一、单例类只能…

磁盘I:O 性能指标 以及 如何通过 fio 对nvme ssd,optane ssd, pmem 性能摸底

文章目录1. 磁盘I/O性能指标1.1 性能指标1.2 I/O 观测1.2.1 磁盘I/O 观测1.2.2 进程I/O观测2. Fio 性能测试2.1 环境准备2.2 测试维度选择2.3 测试2.3.1 optane ssd和nvme ssd性能测试2.3.2 aep性能测试(intel persistent memory)真正测试之前 我们需要清楚 评判磁盘I/O性能 是…

Java项目:旅游网站管理系统设计和实现(java+springboot+jsp+mysql+spring)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 运行环境: java jdk 1.8 IDE环境&#xff1a; IDEA tomcat环境&#xff1a; Tomcat 7.x,8.x,9.x版本均可 主要功能说明&#xff1a; 管理员角色包含以下功能&#xff1a;管理员登录,用户管理,旅游路线管理,…

稀疏矩阵十字链表表示

类型定义 #include<stdio.h> #include<malloc.h> #include<stdlib.h> #define MAX 100 /*稀疏矩阵的十字链表表示&#xff1a;非零元素节点与表头节点公用一种类型 */ typedef struct matrixnode {int row,col;struct matrixnode *right,*down;union{int val…