POI小demo
使用poi需要先下载相关jar包(http://download.csdn.net/detail/wangkunisok/9454545)
poi-3.14-20160307.jar
poi-ooxml-3.14-20160307.jar
poi-ooxml-schemas-3.14-20160307.jar
xmlbeans-2.6.0.jar
PoiUtil.java
package com.zto.branchaging.web.controller; import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List; import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; /**
*
*
* @author leno
* @version v1.0
* @param <T>
* 应用泛型,代表任意一个符合javabean风格的类
* 注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx()
* byte[]表jpg格式的图片数据
*/
public class PoiUtil<T> { public void exportExcel(Collection<T> dataset, OutputStream out) {
exportExcel("POI导出EXCEL文档", null, dataset, out, "yyyy-MM-dd");
} public void exportExcel(String[] headers, Collection<T> dataset,
OutputStream out) {
exportExcel("POI导出EXCEL文档", headers, dataset, out, "yyyy-MM-dd");
} public void exportExcel(String[] headers, Collection<T> dataset,
OutputStream out, String pattern) {
exportExcel("POI导出EXCEL文档", headers, dataset, out, pattern);
} /**
* 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
*
* @param title
* 表格标题名
* @param headers
* 表格属性列名数组
* @param dataset
* 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
* javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
* @param out
* 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
* @param pattern
* 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
*/
@SuppressWarnings("unchecked")
public void exportExcel(String title, String[] headers,
Collection<T> dataset, OutputStream out, String pattern) { List result = new ArrayList();
List paramterList = Arrays.asList(dataset.toArray());
// 声明一个工作薄
HSSFWorkbook workbook = new HSSFWorkbook(); //设定每个sheet存储的数据量为五万,不能超过六万五
int pageCount = (int)Math.ceil(dataset.size()/50000)+1;//需要创建的sheet个数
if(dataset.size()<=50000){
result = paramterList.subList(0, dataset.size());
} // 生成一个样式
HSSFCellStyle style = workbook.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中 for(int j=0;j<pageCount;j++){
int startIndex = j*50000;
int endIndex = startIndex+50000;
if(pageCount-j==1){
endIndex = dataset.size();
}
result = paramterList.subList(startIndex, endIndex);
// 生成一个表格
HSSFSheet sheet = workbook.createSheet(title+"-"+String.valueOf(j+1));
// 设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth((short) 15);
sheet.setColumnWidth(1, 24*256); //设置列宽,第二列24个字符宽
// 产生表格标题行
HSSFRow row = sheet.createRow(0);
for (short i = 0; i < headers.length; i++) {
HSSFCell cell = row.createCell(i);
cell.setCellStyle(style);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
}
// 遍历集合数据,产生数据行
Iterator<T> it = result.iterator();
int index = 0;
while (it.hasNext()) {
index++;
row = sheet.createRow(index);
T t = (T) it.next();
// 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
Field[] fields = t.getClass().getDeclaredFields();
for (short i = 0; i < fields.length; i++) {
HSSFCell cell = row.createCell(i);
cell.setCellStyle(style);
Field field = fields[i];
String fieldName = field.getName();
String getMethodName = "get"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
try {
Class tCls = t.getClass();
Method getMethod = tCls.getMethod(getMethodName,
new Class[] {});
Object value = getMethod.invoke(t, new Object[] {}); // 数据类型都当作字符串简单处理
String textValue = String.valueOf(null==value?"":value); if (textValue != null) {
cell.setCellValue(textValue);
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 清理资源
}
} } }
try {
workbook.write(out);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }
POIController.java
package com.branchaging.web.controller;
@Controller
@RequestMapping("/singleAmount")
public class POIController{ @Autowired
private IQuantityStatisBiz quantityStatisBiz; @RequestMapping("/doExclExport")
@ResponseBody
public String doExclExportt(NewLine line,HttpServletRequest req,HttpServletResponse res) { String realFilename = "..."+fileNameTime+".xls";
res.setContentType("application/vnd.ms-excel; charset=utf-8");
try {
res.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(realFilename,"UTF-8"));
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
res.setCharacterEncoding("utf-8"); PoiUtil<TimeLineAmountExport> ex = new PoiUtil<TimeLineAmountExport>();
String[] headers = { "排名", "线路名称", "运输类型", "","",""... }; try {
OutputStream out=res.getOutputStream();
//OutputStream out = new FileOutputStream("E://singleAmount.xls");
ex.exportExcel(headers, listResult, out);
out.flush();
out.close();
System.out.println("excel导出成功!");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
前台访问:(这种方式是在当前窗口下弹出下载提示,其他两种注释的方式,效果不好)
function doExclExport() {
var result = doCheck();
if("back"==result){
return;
}
if($("#endTime").val()==getEndDate()){
return;
}
location.href="/singleAmount/doExclExport?" + 'time=' + $("#endTime").val() + '&type='
+ $("#mySelect").val() + "&ationType=" + $("#typeAtion").val()
+ "&startSite=" + $("#startSite").val() + "&endSite="
+ $("#endSite").val();
// window.open("/singleAmount/doExclExport?" + 'time=' + $("#endTime").val() + '&type='
// + $("#mySelect").val() + "&ationType=" + $("#typeAtion").val()
// + "&startSite=" + $("#startSite").val() + "&endSite="
// + $("#endSite").val());
// var form=$("<form action='/singleAmount/doExclExport' target='_blank' ></form>");
// form.append('<input type="text" name="time" value="'+$("#endTime").val()+'"/>');
// form.append('<input type="text" name="type" value="'+$("#mySelect").val()+'"/>');
// form.append('<input type="text" name="ationType" value="'+$("#typeAtion").val()+'"/>');
// form.append('<input type="text" name="startSite" value="'+$("#startSite").val()+'"/>');
// form.append('<input type="text" name="endSite" value="'+$("#endSite").val()+'"/>');
// form.submit();
}
POI小demo的更多相关文章
- 新手 gulp+ seajs 小demo
首先,不说废话,它的介绍和作者就不在多说了,网上一百度一大堆: 我在这里只是来写写我这2天抽空对seajs的了解并爬过的坑,和实现的一个小demo(纯属为了实现,高手请绕道); 一.环境工具及安装 1 ...
- Nancy之基于Nancy.Hosting.Self的小Demo
继昨天的Nancy之基于Nancy.Hosting.Aspnet的小Demo后, 今天来做个基于Nancy.Hosting.Self的小Demo. 关于Self Hosting Nancy,官方文档的 ...
- Nancy之基于Nancy.Owin的小Demo
前面做了基于Nancy.Hosting.Aspnet和Nancy.Hosting.Self的小Demo 今天我们来做个基于Nancy.Owin的小Demo 开始之前我们来说说什么是Owin和Katan ...
- Nancy之基于Self Hosting的补充小Demo
前面把Hosting Nancy with ASP.NET.Self Hosting Nancy和Hosting Nancy with OWIN 以demo的形式简单描述了一下. 这篇是为Self H ...
- [Unity3D]做个小Demo学习Input.touches
[Unity3D]做个小Demo学习Input.touches 学不如做,下面用一个简单的Demo展示的Input.touches各项字段,有图有真相. 本项目已发布到Github,地址在(https ...
- Android -- 自定义View小Demo,动态画圆(一)
1,转载:(http://blog.csdn.NET/lmj623565791/article/details/24500107),现在如下图的效果: 由上面的效果图可以看到其实是一个在一个圆上换不同 ...
- Win10 FaceAPI小demo开发问题汇总
Win10 FaceAPI小demo开发问题汇总 最近使用微软牛津计划做一个小demo,使用FaceAPI做一个小应用,实现刷脸的功能.开发的过程中用到几个问题,具体如下: Stream 与IRand ...
- 模仿京东顶部搜索条效果制作的一个小demo
最近模仿京东顶部搜索条效果制作的一个小demo,特贴到这里,今后如果有用到可以参考一下,代码如下 #define kScreenWidth [UIScreen mainScreen].bounds.s ...
- Android学习小Demo一个显示行线的自定义EditText
今天在处理一个EditText的时候,想着把EditText做成像一本作业本上的纸一样,每一行都可以由线条隔开,具体效果如下: 1)最开始的思路 一开始的想法是很简单的,找出每一行的高度,然后一行一行 ...
随机推荐
- 3DMAX卸载/完美解决安装失败/如何彻底卸载清除干净3DMAX各种残留注册表和文件的方法
在卸载3dmax重装3dmax时发现安装失败,提示是已安装3dmax或安装失败.这是因为上一次卸载3dmax没有清理干净,系统会误认为已经安装3dmax了.有的同学是新装的系统也会出现3dmax安装失 ...
- python3的数据类型转换问题
问题描述:在自我学习的过程中,写了个登陆,在input处,希望能够对数据类型进行判断,但是因为python3的输入的数据会被系统默认为字符串,也就是1,1.2,a.都会被系统默认为字符串,这个心塞啊, ...
- [BZOJ 3144][HNOI 2013] 切糕
题目大意 切糕是 (p times q times r) 的长方体,每个点有一个违和感 (v_{x, y, z}).先要水平切开切糕(即对于每个纵轴,切面与其有且只有一个交点),要求水平上相邻两点的切 ...
- Java Random函数
Java中存在着两种Random函数: 1.java.lang.Math.Random: 调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范 ...
- 后端开发中,可以在Cache-Control设置的常用指令
max-age 该指令指定从当前请求开始,允许获取的响应被重用的最长时间(单位为秒.例如:Cache-Control:max-age=60表示响应可以再缓存和重用 60 秒.需要注意的是,在max-a ...
- 机器学习算法的基本知识(使用Python和R代码)
本篇文章是原文的译文,然后自己对其中做了一些修改和添加内容(随机森林和降维算法).文章简洁地介绍了机器学习的主要算法和一些伪代码,对于初学者有很大帮助,是一篇不错的总结文章,后期可以通过文中提到的算法 ...
- OpenStack官方镜像无法ssh登陆
0x00 序 当前主流的Linux系统都有提供可以在OpenStack中直接使用cloud镜像,但当使用从官方网站下载的镜像创建云主机时,你会发现Linux下经常使用的ssh竟然无法登陆新创建好的云主 ...
- 有关PHP的可变函数
事情的起因是这样子的,最近看到一道题,问的是 <?php $_POST['a']($_POST['b']);?> 这句代码有什么问题,答案很明显因为PHP的可变函数这个特性,导致了任意代码 ...
- 安卓权威编程指南 -笔记(19章 使用SoundPool播放音频)
针对BeatBox应用,可以使用SoundPool这个特别定制的实用工具. SoundPool能加载一批声音资源到内存中,并支持同时播放多个音频文件.因此所以,就算用户兴奋起来,狂按按钮播放全部音频, ...
- sed 分组替换
将文件以help开头的句子前加# [root@localhost]# cat a.txthelp b helphelp1helphelp2help c help[root@localhost]# se ...