Web应用中难免会遇到需要将数据导出并生成excel文件的需求。同样,对于本博客中的总结,也是建立在为了完成这样的一个需求,才开始去了解其实现形式,并且顺利完成需求的开发,先将实现过程总结于此。本博文是本人的劳动成果所得,在博客园总结分享,欢迎转载。在没有作者的书面说明的情况下,必须保留本段声明。作者:itRed  邮箱:it_red@sina.com  博客链接:http://www.cnblogs.com/itred  GitHub链接:http://github.com/itred

根据自己的梳理,完成这样的需求在自己的技术范围之内比较认可的有两种方式,其一是利用第三方插件JXL实现excel文件的生成,另一种方式则是不需要第三方的插件,直接通过jsp页面的设置和action层的response跳转完成excel文件的生成。综合来讲,采用第三方插件不仅能够满足功能性需求,而且还提供函数、字体、颜色及其他方面的接口,如果直接采用jsp跳转形式,则样式会略显低调,但是其实现形式很容易理解,无需了解更多的技术层面的东西。现将两种具体的实现方式列出:

Demo 1:

首先来个简单易懂的。直接在action中将数据放到session服务器缓存中,然后再跳转到指定的jsp页面,在指定的jsp页面中设置其ContentType,这个会牵扯到http协议的response.ContentType 。不同的ContentType会影响到客户端看到的具体效果,默认的ContentType为text/html,也就是最为常见的网页格式。

新建web项目,加入struts2的相关jar包, 在默认的index.jsp页面加入一个form表单,本案例仅仅完成功能,数据在后台已经封装好,无前端交互,直接input一个提交按钮,转向action。index.jsp的源码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%String path = request.getContextPath();String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>导出</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"></head><body><form action="getXls_excel" method="post"><input type="submit" value="提交" /></form></body>
</html>

然后新建action名为ExcelAction,源码如下:

package com.red.action;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;/*** jsp形式导出excel* @author Red*/
public class ExcelAction extends ActionSupport {private static final long serialVersionUID = -3673769122296267756L;protected HttpServletRequest request = ServletActionContext.getRequest();protected HttpServletResponse response = ServletActionContext.getResponse();public void getXls() throws IOException {StringBuffer sb = new StringBuffer();sb.append("<table><tr><td>用户名称</td><td>邮箱地址</td></tr>");Map<String, String> map = new HashMap<String, String>();map.put("red1", "it_red@sina.com");map.put("red2", "it_red@sohu.com");map.put("red3", "it_red@163.com");for (String key : map.keySet()) {sb.append("<tr><td>").append(key).append("</td><td>").append(map.get(key)).append("</td></tr>");}request.getSession().setAttribute("excel", sb.toString());response.sendRedirect(request.getContextPath() + "/export.jsp");}
}

然后新建一个跳转后的jsp页面,也即是处理excel文件的工具。源码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page contentType="application/msexcel"%>
<%response.setContentType("application/msexcel;charset=UTF-8");response.setHeader("Content-disposition", "attachment; filename=test.xls");
%>
<html><head><title>Excel</title></head><body><%String str = new String(session.getAttribute("excel").toString());out.print(str);%></body>
</html>

在这里导出的文档编码是根据本地电脑的编码形式进行编码的,所以,如果本地是中文则需要修改response.setContentType("application/msexcel;charset=UTF-8");中的编码,将其改为GBK或者GB18030,只要支持中文就行。

功能实现,基本效果如下:

      

Demo2:

第二种方式是直接通过流的形式响应客户端浏览器,通过浏览器来提供下载。只是在这个地方,将ContentType设置在了action中,而并非是在jsp页面上。

加入JXL的jar包,Action源码:

package com.red.action;import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import jxl.Workbook;
import jxl.format.UnderlineStyle;
import jxl.write.Colour;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;/*** 第三方插件导出Excel* @author Red*/
public class WriteExcelAction extends ActionSupport {HttpServletRequest request = ServletActionContext.getRequest();HttpServletResponse response = ServletActionContext.getResponse();public void writeExcel() throws RowsExceededException, WriteException, IOException {OutputStream os = response.getOutputStream();// 取得输出流response.reset();// 清空输出流response.setHeader("Content-disposition", "attachment; filename=testRed.xls");// 设定输出文件头response.setContentType("application/msexcel");// 定义输出类型WritableWorkbook wbook = Workbook.createWorkbook(os); // 建立excel文件String tmptitle = "测试数据"; // 标题WritableSheet wsheet = wbook.createSheet(tmptitle, 0); // sheet名称// 设置excel标题WritableFont wfont = new WritableFont(WritableFont.ARIAL, 16, WritableFont.BOLD, false,UnderlineStyle.NO_UNDERLINE, Colour.BLACK);WritableCellFormat wcfFC = new WritableCellFormat(wfont);wcfFC.setBackground(Colour.AQUA);wsheet.addCell(new Label(1, 0, tmptitle, wcfFC));wfont = new jxl.write.WritableFont(WritableFont.ARIAL, 14, WritableFont.BOLD, false,UnderlineStyle.NO_UNDERLINE, Colour.BLACK);wcfFC = new WritableCellFormat(wfont);// 开始生成主体内容wsheet.addCell(new Label(0, 2, "姓名"));wsheet.addCell(new Label(1, 2, "邮箱"));// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Map<String, String> map = new HashMap<String, String>();map.put("Red1", "it_red@sina.com");map.put("Red2", "it_red@sohu.com");map.put("Red3", "it_red@163.com");int count = 0;for (String key : map.keySet()) {wsheet.addCell(new Label(0, count + 3, key));wsheet.addCell(new Label(1, count + 3, map.get(key)));count++;}// 主体内容生成结束wbook.write(); // 写入文件wbook.close();os.close(); // 关闭流}
}

实现效果如下:

      

在完成以上两个Demo之后,打开其生成的excel文件,很容易看到两者的差别。其实对于究竟选择哪种形式来生成excel文件,还是需要根据实际的开发情况及应用本身来决定的。各有其特点和好处以及缺点。l另外,当你能理解以上代码时,以上代码便不仅仅只能生成excel文件了,自然而然就可以生成一些其他文件。

  另附本博文中所涉及到的案例源码请点击链接

作者:itRed博客:http://itred.cnblogs.comGitHub:https://github.com/itRed
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段说明,      且在文章明显位置给出原文链接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/rzh1991/p/10614018.html

两种方式实现java生成Excel相关推荐

  1. java excel生成_两种方式实现java生成Excel

    Web应用中难免会遇到需要将数据导出并生成excel文件的需求.同样,对于本博客中的总结,也是建立在为了完成这样的一个需求,才开始去了解其实现形式,并且顺利完成需求的开发,先将实现过程总结于此.本博文 ...

  2. pdf转图片的两种方式(java)

        最近在工作中遇到业务需要把pdf转成图片供前台预览,在网上查了一些方法,有的能用,有的缺东西,时间又比较急,没时间去看.在这里我整理了两种亲测可行的方式,节省大家时间带备忘: 1.pdf按页数 ...

  3. SpringBoot中使用AMQ的两种方式(Java配置、注解方式)

    Java配置方式使用AMQ 1. 引入依赖(pom.xml) <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns ...

  4. python网络通信的几种方式_两种方式,java=python,使用py4j进行通信

    我使用py4j实现python和java之间的通信,能够从java端调用python方法.但从python我不能发送任何对象或调用java方法.这是我试过的密码.在 我的java代码:public i ...

  5. Java代码实现MD5加密的两种方式

    MD5的全称是Message-Digest Algorithm 5 (信息-摘要算法),在90年代初,由MIT Laboratory for Computer Scientce 和RSA Data S ...

  6. java 产生随机数的两种方式,Java产生随机数的两种方式

    Java产生随机数的两种方式 Java产生随机数的两种方式 在java中,我们可以通过两种方式来获取随机数(generating a random number)一种是大家熟悉的java.lang.M ...

  7. java中byte数组与int类型的转换(两种方式)

    java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形 ...

  8. Python调用Jar包的两种方式

    概览 因工作场景,需要在python代码里调用Jar包来实现一些功能,调研下来主要有两种方式: java -jar xx.jar JPype 环境配置 因为要在公司内网操作,所以需要通过离线方式进行安 ...

  9. jar包运行的两种方式

    运行jar包的两种方式 :java -jar 和 java -cp 区别 运行jar包的两种方式 1. java -jar Test.jar 2. java -cp com.test.Test Tes ...

  10. java操作Excel有两种方式 方式1:jxl操作Excel jxl的API

    java操作Excel有两种方式 方式1:jxl操作Excel 方式2:poi操作Excel 下面介绍jxl API: 使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用 ...

最新文章

  1. 【网络流24题】I、 方格取数问题(二分图的最大独立集/最小割)
  2. SoapRpcMethodAttribute.OneWay属性
  3. Qt/E中的键盘设备管理
  4. activiti bpmn 安装不上_小猿圈之Eclipse安装Activiti插件(流程设计器)
  5. 前端用Sass实现星级评定效果,简单快捷实现星级切换。
  6. 含有运算符的STRING得到计算结果,类似JS的EVAL
  7. @NotBlank注解使用不生效的解决办法
  8. iphone7测试软件,iPhone7如何测试网速 ping命令测试网速方法介绍
  9. 在SqlMapConfig.xml 中typeAliases与properties的关系
  10. android屏幕适配无效_Android 屏幕适配终结者
  11. C++ for_each函数
  12. Captcha Cracker
  13. 如何html5将文字插入图片,如何在文字中加入图片?
  14. N皇后问题 - 构造法原理与证明: 时间复杂度O(1)
  15. RPG Maker的引擎分析(一)
  16. 如何将控制台程序发布为服务
  17. 详解c语言编程库题,详解C语言编程
  18. 浅谈K8S的容器管理
  19. java bdd 框架_常见的BDD框架
  20. 北京楼市:一个打死都不说的秘密

热门文章

  1. poj 2387 Til the Cows Come Home spfa基础题,入门,我的第一个
  2. 如何在 AirPods Pro 上安装 Apple 的 Beta 版固件?
  3. 推荐:MacBook如何快速添加指纹!
  4. js基础——function类型
  5. 百度面试题:Median of Two Sorted Arrays(java实现)
  6. 面向对象的思考过程 (马特·魏斯费尔德 著)
  7. JS DOM节点的增删改查
  8. Windows Server 2003 来配置网络地址转换 (NAT
  9. MVC中的service controller 有状态,无状态Bean线程安全
  10. 解决问题--Maven,IDEA项目External Libraries下只有jdk没有maven依赖