1. import java.io.BufferedInputStream;
  2. import java.io.BufferedOutputStream;
  3. import java.io.ByteArrayInputStream;
  4. import java.io.ByteArrayOutputStream;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.OutputStream;
  9. import java.text.SimpleDateFormat;
  10. import java.util.ArrayList;
  11. import java.util.Date;
  12. import java.util.Iterator;
  13. import java.util.LinkedHashMap;
  14. import java.util.List;
  15. import java.util.Map;
  16.  
  17. import javax.servlet.ServletOutputStream;
  18. import javax.servlet.http.HttpServletResponse;
  19.  
  20. import org.apache.poi.hpsf.SummaryInformation;
  21. import org.apache.poi.hssf.usermodel.HSSFCell;
  22. import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  23. import org.apache.poi.hssf.usermodel.HSSFFont;
  24. import org.apache.poi.hssf.usermodel.HSSFRow;
  25. import org.apache.poi.hssf.usermodel.HSSFSheet;
  26. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  27. import org.apache.poi.ss.util.CellRangeAddress;
  28.  
  29. import com.alibaba.fastjson.JSON;
  30. import com.alibaba.fastjson.JSONArray;
  31. import com.alibaba.fastjson.JSONObject;
  32. import com.alibaba.fastjson.TypeReference;
  33.  
  34. public class ExcelUtil {
  35. public static String NO_DEFINE = "no_define";// 未定义的字段
  36. public static String DEFAULT_DATE_PATTERN = "yyyy年MM月dd日 HH:mm:ss";// 默认日期格式
  37. public static int DEFAULT_COLOUMN_WIDTH = 20;
  38.  
  39. /**
  40. * 导出Excel 97(.xls)格式
  41. *
  42. * @param title-标题行
  43. * @param list-要输出的表单
  44. * @param datePattern-日期格式,null则用默认日期格式
  45. * @param colWidth-列宽,默认至少17个字节
  46. * @param out-输出流
  47. */
  48. public static void exportExcel(String title, List<FormExcelObject> list, String datePattern, int colWidth,
  49. OutputStream out) {
  50. if (datePattern == null)
  51. datePattern = DEFAULT_DATE_PATTERN;
  52. // 声明一个工作薄
  53. HSSFWorkbook workbook = new HSSFWorkbook();
  54. workbook.createInformationProperties();
  55. workbook.getDocumentSummaryInformation().setCompany("********公司");
  56. SummaryInformation si = workbook.getSummaryInformation();
  57. si.setAuthor("LAY"); // 填加xls文件作者信息
  58. si.setApplicationName("**系统导出程序"); // 填加xls文件创建程序信息
  59. si.setComments("LAY is a programmer!"); // 填加xls文件作者信息
  60. si.setTitle(title + "数据"); // 填加xls文件标题信息
  61. si.setSubject(title + "数据导出Excel");// 填加文件主题信息
  62. si.setCreateDateTime(new Date());
  63. // 表头样式
  64. HSSFCellStyle titleStyle = workbook.createCellStyle();
  65. titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  66. HSSFFont titleFont = workbook.createFont();
  67. titleFont.setFontHeightInPoints((short) 20);
  68. titleFont.setBoldweight((short) 700);
  69. titleStyle.setFont(titleFont);
  70. // 列头样式
  71. HSSFCellStyle headerStyle = workbook.createCellStyle();
  72. headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  73. headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  74. headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
  75. headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
  76. headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  77. HSSFFont headerFont = workbook.createFont();
  78. headerFont.setFontHeightInPoints((short) 12);
  79. headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
  80. headerStyle.setFont(headerFont);
  81. // 单元格样式
  82. HSSFCellStyle cellStyle = workbook.createCellStyle();
  83. cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  84. cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  85. cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
  86. cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
  87. cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  88. cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
  89. HSSFFont cellFont = workbook.createFont();
  90. cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
  91. cellStyle.setFont(cellFont);
  92.  
  93. for (int j = 0; j < list.size(); j++) {
  94. FormExcelObject formExcelObject = list.get(j);
  95. Map<String, String> headMap = formExcelObject.getHeadMap();
  96. JSONArray jsonArray = formExcelObject.getJsonArray();
  97. String _title = formExcelObject.getTitle();
  98.  
  99. int k = 1;
  100. // 生成一个(带标题)表格
  101. HSSFSheet sheet = workbook.createSheet(_title + "-" + k);
  102. // 设置列宽
  103. int minBytes = colWidth < DEFAULT_COLOUMN_WIDTH ? DEFAULT_COLOUMN_WIDTH : colWidth;// 至少字节数
  104. int[] arrColWidth = new int[headMap.size()];
  105. // 产生表格标题行,以及设置列宽
  106. String[] properties = new String[headMap.size()];
  107. String[] headers = new String[headMap.size()];
  108. int ii = 0;
  109. for (Iterator<String> iter = headMap.keySet().iterator(); iter.hasNext();) {
  110. String fieldName = iter.next();
  111.  
  112. properties[ii] = fieldName;
  113. headers[ii] = fieldName;
  114.  
  115. int bytes = fieldName.getBytes().length;
  116. arrColWidth[ii] = bytes < minBytes ? minBytes : bytes;
  117. sheet.setColumnWidth(ii, arrColWidth[ii] * 256);
  118. ii++;
  119. }
  120. // 遍历集合数据,产生数据行
  121. int rowIndex = 0;
  122. for (Object obj : jsonArray) {
  123. if (rowIndex == 65535 || rowIndex == 0) {
  124. if (rowIndex != 0) {
  125. sheet = workbook.createSheet(_title + "-" + (++k));
  126. for (int i = 0; i < headers.length; i++) {
  127. sheet.setColumnWidth(i, arrColWidth[i] * 256);
  128. }
  129. }
  130.  
  131. HSSFRow titleRow = sheet.createRow(0);// 表头 rowIndex=0
  132. titleRow.createCell(0).setCellValue(_title);
  133. titleRow.getCell(0).setCellStyle(titleStyle);
  134. sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headMap.size() - 1));
  135.  
  136. HSSFRow headerRow = sheet.createRow(1); // 列头 rowIndex =1
  137. for (int i = 0; i < headers.length; i++) {
  138. headerRow.createCell(i).setCellValue(headMap.get(headers[i]));
  139. headerRow.getCell(i).setCellStyle(headerStyle);
  140.  
  141. }
  142. rowIndex = 2;// 数据内容从 rowIndex=2开始
  143. }
  144. JSONObject jo = (JSONObject) JSONObject.toJSON(obj);
  145. HSSFRow dataRow = sheet.createRow(rowIndex);
  146. for (int i = 0; i < properties.length; i++) {
  147. HSSFCell newCell = dataRow.createCell(i);
  148.  
  149. Object o = jo.get(properties[i]);
  150. String cellValue = "";
  151. if (o == null)
  152. cellValue = "";
  153. else if (o instanceof Date)
  154. cellValue = new SimpleDateFormat(datePattern).format(o);
  155. else
  156. cellValue = o.toString();
  157.  
  158. newCell.setCellValue(cellValue);
  159. newCell.setCellStyle(cellStyle);
  160. }
  161. rowIndex++;
  162. }
  163.  
  164. }
  165.  
  166. try {
  167. workbook.write(out);
  168. workbook.close();
  169. } catch (IOException e) {
  170. e.printStackTrace();
  171. }
  172. }
  173.  
  174. /**
  175. * 通过向response中写入数据实现web下载
  176. *
  177. * @param title-文件名
  178. * @param formExcelObjectList-表单数据
  179. * @param response-要写入数据的响应
  180. */
  181. public static void downloadExcelFile(String title, List<FormExcelObject> formExcelObjectList,
  182. HttpServletResponse response) {
  183. try {
  184. ByteArrayOutputStream os = new ByteArrayOutputStream();
  185. ExcelUtil.exportExcel(title, formExcelObjectList, null, 0, os);
  186. byte[] content = os.toByteArray();
  187. InputStream is = new ByteArrayInputStream(content);
  188. // 设置response参数,可以打开下载页面
  189. response.reset();
  190.  
  191. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
  192. response.setHeader("Content-Disposition",
  193. "attachment;filename=" + new String((title + ".xls").getBytes(), "iso-8859-1"));
  194. response.setContentLength(content.length);
  195. ServletOutputStream outputStream = response.getOutputStream();
  196. BufferedInputStream bis = new BufferedInputStream(is);
  197. BufferedOutputStream bos = new BufferedOutputStream(outputStream);
  198. byte[] buff = new byte[8192];
  199. int bytesRead;
  200. while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
  201. bos.write(buff, 0, bytesRead);
  202. }
  203. bis.close();
  204. bos.close();
  205. outputStream.flush();
  206. outputStream.close();
  207. } catch (Exception e) {
  208. e.printStackTrace();
  209. }
  210. }
  211.  
  212. public static class FormExcelObject {
  213. private String title;
  214. private Map<String, String> headMap;
  215. private JSONArray jsonArray;
  216.  
  217. public String getTitle() {
  218. return title;
  219. }
  220.  
  221. public void setTitle(String title) {
  222. this.title = title;
  223. }
  224.  
  225. public Map<String, String> getHeadMap() {
  226. return headMap;
  227. }
  228.  
  229. public void setHeadMap(Map<String, String> headMap) {
  230. this.headMap = headMap;
  231. }
  232.  
  233. public JSONArray getJsonArray() {
  234. return jsonArray;
  235. }
  236.  
  237. public void setJsonArray(JSONArray jsonArray) {
  238. this.jsonArray = jsonArray;
  239. }
  240.  
  241. }
  242.  
  243. public static void main(String[] args) throws IOException {
  244. System.out.println("正在生成数据....");
  245. int count = 100000;
  246. JSONArray ja = new JSONArray();
  247. for (int i = 0; i < 100000; i++) {
  248. Student s = new Student();
  249. s.setName("POI" + i);
  250. s.setAge(i);
  251. s.setBirthday(new Date());
  252. s.setHeight(i);
  253. s.setWeight(i);
  254. s.setSex(i / 2 == 0 ? false : true);
  255. ja.add(s);
  256. }
  257. String jsonString = "{\"name\":\"姓名\",\"age\":\"年龄\",\"birthday\":\"生日\",\"height\":\"身高\",\"weight\":\"体重\",\"sex\":\"性别\"}";
  258. LinkedHashMap<String, String> headMap = JSON.parseObject(jsonString,
  259. new TypeReference<LinkedHashMap<String, String>>() {
  260. });
  261. String title = "测试";
  262. OutputStream outXlsx = new FileOutputStream("D://b.xls");
  263. System.out.println("正在导出xls....");
  264. Date d2 = new Date();
  265. FormExcelObject feo = new FormExcelObject();
  266. feo.setTitle("测试title");
  267. feo.setHeadMap(headMap);
  268. feo.setJsonArray(ja);
  269. List<FormExcelObject> list = new ArrayList<FormExcelObject>();
  270. list.add(feo);
  271. ExcelUtil.exportExcel(title, list, null, 0, outXlsx);
  272. System.out.println("共" + count + "条数据,执行耗时" + (new Date().getTime() - d2.getTime()) + "ms");
  273. outXlsx.close();
  274. }
  275.  
  276. public static class Student {
  277. private String name;
  278. private int age;
  279. private Date birthday;
  280. private float height;
  281. private double weight;
  282. private boolean sex;
  283.  
  284. public String getName() {
  285. return name;
  286. }
  287.  
  288. public void setName(String name) {
  289. this.name = name;
  290. }
  291.  
  292. public Integer getAge() {
  293. return age;
  294. }
  295.  
  296. public Date getBirthday() {
  297. return birthday;
  298. }
  299.  
  300. public void setBirthday(Date birthday) {
  301. this.birthday = birthday;
  302. }
  303.  
  304. public float getHeight() {
  305. return height;
  306. }
  307.  
  308. public void setHeight(float height) {
  309. this.height = height;
  310. }
  311.  
  312. public double getWeight() {
  313. return weight;
  314. }
  315.  
  316. public void setWeight(double weight) {
  317. this.weight = weight;
  318. }
  319.  
  320. public boolean isSex() {
  321. return sex;
  322. }
  323.  
  324. public void setSex(boolean sex) {
  325. this.sex = sex;
  326. }
  327.  
  328. public void setAge(Integer age) {
  329. this.age = age;
  330. }
  331. }
  332. }

maven项目需要在pom文件中加入以下

<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi</artifactId>
  <version>3.13</version>
</dependency>

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.7</version>
</dependency>

非maven项目中加入jar

fastjson-1.2.7.jar

poi-3.13.jar

注:HttpServletResponse相关类为tomcat中带有的jar,此处不予列出

POI生成Excel工具类的更多相关文章

  1. 自己封装的poi操作Excel工具类

    自己封装的poi操作Excel工具类 在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完 ...

  2. java里poi操作Excel工具类【我改】

    参考原文: https://www.cnblogs.com/yizhang/p/7244917.html 我改: package test; import java.io.File; import j ...

  3. POI读取excel工具类 返回实体bean集合(xls,xlsx通用)

    本文举个简单的实例 读取上图的 excel文件到 List<User>集合 首先 导入POi 相关 jar包 在pom.xml 加入 <!-- poi --> <depe ...

  4. 使用回调方式写POI导入excel工具类

    场景是这样的:为了做一个excel导入的功能,为了尽可能的写一个通用的工具类,将与poi有关的东西都封装起来,以便以其他人员只用关心自己的业务,不用和poi打交道. 写到最后,现在还是会有poi的东西 ...

  5. 使用POI导出EXCEL工具类并解决导出数据量大的问题

    POI导出工具类 工作中常常会遇到一些图表需要导出的功能,在这里自己写了一个工具类方便以后使用(使用POI实现). 项目依赖 <dependency> <groupId>org ...

  6. POI读取excel工具类(xls,xlsx通用)

    package com.boot.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotF ...

  7. poi读取excel工具类

    package com.manage.utils; import ch.qos.logback.core.net.SyslogOutputStream; import com.google.gson. ...

  8. Java 利用poi生成excel表格

    所需jar包,如下所示 写一个excel工具类 ExcelUtils .java import java.lang.reflect.Field; import java.util.Iterator; ...

  9. java操作excel 工具类

    java操作excel 可参考https://blog.csdn.net/xunwei0303/article/details/53213130 直接上代码: 一.java生成excel文件: pac ...

随机推荐

  1. 【NoSql】Redis实践篇-简单demo实现(一)

    Redis是一个key-value存储系统. Redis的出现,非常大程度补偿了memcached这类key/value存储的不足,在部分场合能够对关系数据库起到非常好的补充作用 Redis是一个ke ...

  2. 车牌识别--OMAP4430处理器上測试

    OMAP4430(ME865) arm-linux-gcc 4.5.1(FriendlyARM) 软浮点执行结果: root@lj:/workspace/carid# arm-linux-gcc ca ...

  3. 使用Caffe完成图像目标检测 和 caffe 全卷积网络

    一.[用Python学习Caffe]2. 使用Caffe完成图像目标检测 标签: pythoncaffe深度学习目标检测ssd 2017-06-22 22:08 207人阅读 评论(0) 收藏 举报 ...

  4. vue 表单输入与绑定 v-model

    vue使用 v-model 指令在表单 <input>.<textarea> 及 <select> 元素上创建双向数据绑定.下面我们通过示例先了解下基本用法: &l ...

  5. Zabbix 3.0安装

    Server 1. rpm安装zabbix 3.0最新的epel源 rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-re ...

  6. CIDR(无类域间路由)(转载)

    来源:百度百科 CIDR(无类型域间选路,Classless Inter-Domain Routing)是一个在Internet上创建附加地址的方法,这些地址提供给服务提供商(ISP),再由ISP分配 ...

  7. Tabs in Non-RootViewController Scenarios

    新建空工程如图 添加一个MainStoryboard如图 设置启动项为MainStoryboard 重写AppDelegate的Window方法 public override UIWindow Wi ...

  8. Linux 如何搭建Lamp的服务环境

    在介绍虚拟机的安装使用之前,我们先认识一下LINUX中LAMP是什么的缩写 L--Linux   A--Apache   M--Mysql  P--PHP 虚拟机的安装百度有详细的介绍,非常简单的,这 ...

  9. EasyPlayer实现视频播放局部缩放、广角平移功能(类似水滴直播,快手视频)

    本文转自:http://blog.csdn.net/jyt0551/article/details/56063869 视频播放局部缩放.广角平移功能 在预览图片的时候,利用手势控制图片的缩放.平移,已 ...

  10. 阿里妈妈-RAP项目的实践(1)

    在同事的推荐下,去了解了一下http://thx.github.io/RAP/study.html#,它是发现在前后端分离开发的神器 下面我们来简单上一组代码,来简单了解一下rap <!DOCT ...