目的:访问url(http://localhost:8080/POIOutputExcel/outputexcel.do)实现excel导出,效果图如下:

文件目录(配置文件就不多说了,跟前面的随笔一样一样的)

  

User.java

public class User {
private Integer id;
private String name;
private Double cash;
//此处省略getter/setter方法
}

Datalist.java

public class Datalist {
//这里不走数据库,直接模拟数据库查询结果
public List<User> getUsers(int n){
List<User> list = new ArrayList<User>();
for (int i = 0; i < n; i++) {
User user = new User();
user.setId(i);
user.setName("xiaoming"+i);
user.setCash(1000.0+i);
list.add(user);
}
return list;
} }

BeanToMap.java

public class BeanToMap<T> {

    public Map<String,Object> getMap(T entity){
Field[] fields = entity.getClass().getDeclaredFields();
Map<String,Object> map = new HashMap<String,Object>();
for (int i = 0; i < fields.length; i++) {
String methodName = getMethodName(fields[i].getName());
try {
Method method = entity.getClass().getMethod(methodName);
map.put(fields[i].getName(),method.invoke(entity));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return map;
} public String getMethodName(String fieldName){
byte[] buffer = fieldName.getBytes();
buffer[0] = (byte)(buffer[0]-32);
String name = new String(buffer);
return "get"+name;
}
}

PoiExcelExport.java

public class PoiExcelExport<T> {
// excle导出名称
private String fileName;
// excel 表头
private String[] heads;
// excel 列
private String[] cols;
// 设置数值型的列 从0开始计数
private int[] numerics;
//list集合
private List<T> list;
// 输出流
private OutputStream out;
// 构造函数
public PoiExcelExport(String fileName, String[] heads, String[] cols, List<T> list, OutputStream out) {
this.fileName = fileName;
this.heads = heads;
this.cols = cols;
this.list = list;
this.out = out;
} // 构造函数 带数字类型
public PoiExcelExport(String fileName, String[] heads, String[] cols, List<T> list, int[] numerics, OutputStream out) {
this.fileName = fileName;
this.heads = heads;
this.cols = cols;
this.list = list;
this.numerics = numerics;
this.out = out;
} public void exportExcel() {
HSSFWorkbook hssfworkbook = new HSSFWorkbook(); // 创建一个excel对象
for (int i = 0; i <= (list.size() / 65535); i++) {
HSSFSheet hssfsheet = hssfworkbook.createSheet(); // 工作表
// 工作表名称
hssfworkbook.setSheetName(i, fileName.replace(".xls", "") + "(第" + (i + 1) + "页)");
int beginRows = 65535 * i;
int endRows = (list.size() > 65535 * (i + 1)) ? 65535 * (i + 1) - 1 : list.size() - 1;
HSSFRow hssfrowHead = hssfsheet.createRow(0);
// 输出excel 表头
if (heads != null && heads.length > 0) {
for (int h = 0; h < heads.length; h++) {
HSSFCell hssfcell = hssfrowHead.createCell(h,Cell.CELL_TYPE_STRING);
hssfcell.setCellValue(heads[h]);
}
}
// 要设置数值型 列表
HSSFCellStyle cellstyle = hssfworkbook.createCellStyle();
cellstyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("##0"));
// 是否是数值型
boolean isnum = false;
// 输出excel 数据
for (int curRow = beginRows; curRow <= endRows; curRow++) {
// 获取数据
BeanToMap<T> btm = new BeanToMap<T>();
Map<String,Object> hm = btm.getMap(list.get(curRow));
// 创建excel行 表头1行 导致数据行数 延后一行
HSSFRow hssfrow = hssfsheet.createRow(curRow % 65535 + 1);
// 读取数据值
for (int k = 0; k < cols.length; k++) {
HSSFCell hssfcell = hssfrow.createCell(k);
// hssfcell.setCellValue(hm.get(cols[k])==null?"":hm.get(cols[k]).toString());
isnum = false;
for (int z = 0; z < numerics.length; z++) {
if (numerics[z] == k) {
isnum = true;
break;
}
} if (isnum) {
if (hm.get(cols[k]) == null || hm.get(cols[k]).equals("")) { } else {
hssfcell.setCellStyle(cellstyle);
hssfcell.setCellValue(Double.parseDouble(
hm.get(cols[k]) == null ? "" : hm.get(cols[k]).toString().replace(",", "")));
}
} else {
hssfcell.setCellValue(hm.get(cols[k]) == null ? "" : hm.get(cols[k]).toString());
}
}
} }
// excel生成完毕,写到输出流
try {
hssfworkbook.write(out);
out.flush();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }

ServletUtil.java

public class ServletUtil {
private String fileName;
private HttpServletRequest req;
private HttpServletResponse resp;
public OutputStream getOut(){
try {
return resp.getOutputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
public ServletUtil(HttpServletResponse resp){
this.resp = resp;
}
public ServletUtil(String fileName,
HttpServletRequest req,
HttpServletResponse resp){
this.fileName = fileName;
this.req = req;
this.resp = resp;
}
public void poiExcelServlet(){
resp.setContentType("application/vnd.ms-excel");
String contentDisposition = "";
try {
if (req.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) {
contentDisposition = "attachment; filename=\"" + new String(fileName.getBytes("UTF-8"), "ISO8859-1")
+ "\"";// firefox浏览器
} else {
contentDisposition = "attachment; filename=\"" + URLEncoder.encode(fileName, "UTF-8") + "\"";// IE浏览器
}
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
resp.setHeader("Content-Disposition", contentDisposition);
resp.setCharacterEncoding("UTF-8");
}
}

UserController.java

@Controller
public class UserController { @RequestMapping(value = "/outputexcel.do")
public void showImgCode(HttpServletRequest req,
HttpServletResponse resp) {
String fileName = "springMVC导出excel小练习"; ServletUtil su = new ServletUtil(fileName, req, resp);
su.poiExcelServlet(); String[] heads = {"id号","姓名","身价(元)"};
String[] cols = {"id","name","cash"};
int[] numerics = {2};
List<User> list = new Datalist().getUsers(70000);//获取1000条样例数据 ServletUtil suresp = new ServletUtil(resp);
PoiExcelExport<User> pee = new PoiExcelExport<User>(fileName, heads, cols, list, numerics, suresp.getOut());
pee.exportExcel();
} }

springMVC框架+POI组件导出Excel的更多相关文章

  1. SpringMvc 使用poi导入导出Excel

    Util类 package com.common.util; public class ExportUtil { private XSSFWorkbook wb = null; private XSS ...

  2. 使用SpringMvc调用POI jar导出excel的源码

    @RequestMapping(value = "/result/export") public String export(ResultIn in,HttpServletRequ ...

  3. Apache POI组件操作Excel,制作报表(四)

    Apache POI组件操作Excel,制作报表(四) 博客分类: 探索实践 ExcelApacheSpringMVCServlet      上一篇我们介绍了如何制作复杂报表的分析和设计,本篇结合S ...

  4. Java利用POI导入导出Excel中的数据

         首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...

  5. Apache POI组件操作Excel,制作报表(三)

    Apache POI组件操作Excel,制作报表(三) 博客分类: 探索实践 ExcelApache算法Office单元测试      上一篇介绍了POI组件操作Excel时如何对单元格和行进行设置, ...

  6. springMVC中使用POI方式导出excel至客户端、服务器实例

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 这里的方法支持导出excel至项目所在服务器,或导 ...

  7. POI通用导出Excel数据(包括样式设计)

    前言 前一段时间我写过通用的导入Excel,前几天也写了导出pdf格式的,还有我之前搞得导出Word,我在之前的博客也都介绍了导出和导入是一个道理,无非是一个获取一个是赋值.昨天有一位同仁看了我的Ex ...

  8. Java POI导入导出Excel

    1.异常java.lang.NoClassDefFoundError: org/apache/poi/UnsupportedFileFormatException 解决方法: 使用的poi的相关jar ...

  9. java中使用poi导入导出excel文件_并自定义日期格式

    Apache POI项目的使命是创造和保持java API操纵各种文件格式基于Office Open XML标准(OOXML)和微软的OLE复合文档格式(OLE2)2.总之,你可以读写Excel文件使 ...

随机推荐

  1. Java中的a++和++a的区别

    1.a++和++a的区别 a++表示先将a放在表达式中运算,然后再加1: ++a表示先将a加1,然后再放在表达式中运算 2.实例 (1)Java代码 /** * @Title:JiaJia.java ...

  2. Srtuts2实现登录界面(不连接数据库)报错(二)

    二月 28, 2014 11:37:29 下午 org.apache.catalina.core.AprLifecycleListener init 严重: An incompatible versi ...

  3. OpenStack_I版 1.准备过程

    openstack是一个开源云平台,python开发   此次部署为实验环境, 采用扁平化简单的网络架构部署                       优点:低耦合的,模块化            ...

  4. meta的各种参数

    <!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --> <html lang="zh-cmn-Hans"&g ...

  5. 2016-2017 CT S03E06: Codeforces Trainings Season 3 Episode 6 The Baguette Master

    比赛看不懂 之后不确定题意去瞄了题解,需要分类讨论?囧 之后按照队友已经ac的题意 就是求外面一圈周长,直接可以求得 #include<bits/stdc++.h> using names ...

  6. poj3268(置换矩阵思想)

    题意:一群牛分别从1~n号农场赶往x号农场参加聚会,农场与农场之间的路时单向的,在n个农场之间有m条路,给出 a ,b , t表示从a号农场到b号农场需要t时间. 每头牛都会选择最短的路,问来回路上( ...

  7. 举例MyBatis的常用的API及方法

    在使用MyBatis框架是,主要涉及以下几个API: 1.SqlSessionFactoryBuilder该对象根据MyBatis配置文件SqlMapConfig.xml构建SQLSessionFac ...

  8. 【BZOJ2004】公交线路(动态规划,状态压缩,矩阵快速幂)

    [BZOJ2004]公交线路(动态规划,状态压缩,矩阵快速幂) 题面 BZOJ 题解 看到\(k,p\)这么小 不难想到状态压缩 看到\(n\)这么大,不难想到矩阵快速幂 那么,我们来考虑朴素的\(d ...

  9. 【BZOJ1975】【SDOI2010】魔法猪学院(搜索,A*,贪心)

    我已经沉迷于粘贴题目地址了... 题解 很显然的贪心呀, 就是一定是最短的若干条路径的长度 所以,不断拓展k短路就可以了 至于怎么用A* 评估函数f(x)=dis[x]+g[x] 其中,dis是到N号 ...

  10. python 时间模块time,datetime详细介绍

    模块(module)是 Python 中非常重要的东西,你可以把它理解为 Python 的扩展工具.换言之,Python 默认情况下提供了一些可用的东西,但是这些默认情况下提供的还远远不能满足编程实践 ...