下面代码实现所需jar包:

  tomcat-embed-core-8.5.11.jar;

  commons-lang3-3.0.1.jar;

  commons-io-2.5.jar;

  poi-3.9.jar

  (下载地址:https://files.cnblogs.com/files/Big-Boss/Java%E5%AF%BC%E5%87%BAExcel%E6%96%87%E4%BB%B6%E6%89%80%E9%9C%80jar%E5%8C%85.zip)

实现代码:

  1. import java.io.ByteArrayOutputStream;
  2. import java.lang.reflect.Field;
  3. import java.net.URLEncoder;
  4. import java.text.SimpleDateFormat;
  5. import java.util.ArrayList;
  6. import java.util.Date;
  7. import java.util.HashMap;
  8. import java.util.List;
  9. import java.util.Map;
  10.  
  11. import javax.servlet.http.HttpServletResponse;
  12.  
  13. import org.apache.commons.io.IOUtils;
  14. import org.apache.commons.lang3.StringUtils;
  15. import org.apache.poi.hssf.usermodel.HSSFCell;
  16. import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  17. import org.apache.poi.hssf.usermodel.HSSFRow;
  18. import org.apache.poi.hssf.usermodel.HSSFSheet;
  19. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  20. /**
  21. * 导出Excel文件
  22. * 注:考虑到文件兼容性,导出的文件为.xls格式
  23. * @author 【】
  24. *
  25. */
  26. public class ExportExcelUtil {
  27. /**
  28. * 利用Java反射机制以Excel形式导出数据
  29. * @param objLists 要导出的数据
  30. * @param tableName 要到处数据的实体类bean路径(实体类所在src下的路径)
  31. * @param fileName 要导出的Excel文件名
  32. * @param response
  33. * @throws Exception
  34. */
  35. public static void exportExcel(List<Object> objLists, String tableName, String fileName,
  36. HttpServletResponse response) throws Exception {
  37. // 利用JAVA反射通过实体类名获取其对应属性(需导出的字段)
  38. Map<String, String> map = getBeanComment(tableName);
  39. List<String> keyList = new ArrayList<>();
  40. keyList.addAll(map.keySet());
  41. // 创建Excel工作薄
  42. HSSFWorkbook wb = new HSSFWorkbook();
  43. // HSSFWorkbook每张Sheet表导出的行数最多为 65535 行
  44. // 当要导出数据大于这个数时就需要多个Sheet表
  45. int flag = 1;
  46. for (int i = 0; i < objLists.size(); i += 65000) {
  47. // 创建Sheet表
  48. HSSFSheet sheet = wb.createSheet("Sheet表名" + flag);
  49. List<Object> lists = new ArrayList<>();
  50. if (objLists.size() - i > 65000) {
  51. lists = objLists.subList(i, i + 10);
  52. } else {
  53. if (objLists.size() > i) {
  54. lists = objLists.subList(i, objLists.size());
  55. }
  56. }
  57. // 定义表头,创建行
  58. HSSFRow row = sheet.createRow(0);
  59. // 单元格样式
  60. HSSFCellStyle style= wb.createCellStyle();
  61. // 水平居中
  62. style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  63. // 创建单元格
  64. HSSFCell cell = null;
  65. int j = 0;
  66. for (String key : keyList) {
  67. cell = row.createCell(i);
  68. cell.setCellValue(map.get(key));
  69. cell.setCellStyle(style);
  70. j++;
  71. }
  72. for (int k = 0; k < lists.size(); k++) {
  73. // 利用java反射机制获取该类的所有字段信息
  74. Map<String, Field> fieldMap = getFieldMap(lists.get(k));
  75. row = sheet.createRow(k + 1);
  76. j = 0;
  77. for (String key : keyList) {
  78. /*// 字段Field的属性
  79. String name = fieldMap.get(key).getName();
  80. // 字段Field的属性类型
  81. String type = fieldMap.get(key).getType().getName();
  82. System.out.println("属性名:" + name + ",属性类型:" +type);*/
  83. cell = row.createCell(j);
  84. if (fieldMap.get(key).get(lists.get(k)) != null) {
  85. cell.setCellValue(fieldMap.get(key).get(lists.get(k)).toString());
  86. cell.setCellStyle(style);
  87. }
  88. j++;
  89. }
  90. }
  91. flag++;
  92. }
  93.  
  94. //设置文件名后缀
  95. SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
  96. //定义导出的表名
  97. String fName = URLEncoder.encode(fileName + sdf.format(new Date()).toString() + ".xls", "UTF-8");
  98. ByteArrayOutputStream os = new ByteArrayOutputStream();
  99. wb.write(os);
  100. if (os.size() > 0) {
  101. response.setContentType("application/octet-stream");
  102. response.addHeader("Content-Disposition", "attachment; filename=" + fName);
  103. response.addHeader("Content-Length", "" + os.size());
  104. IOUtils.write(os.toByteArray(), response.getOutputStream());
  105. response.getOutputStream().flush();
  106. }
  107. os.close();
  108. }
  109.  
  110. /*
  111. * 利用java反射机制获取该类及父类的所有字段信息
  112. */
  113. public static Map<String, Field> getFieldMap(Object obj) {
  114. Map<String, Field> map = new HashMap<>();
  115. // 所有字段信息
  116. Field[] fields = obj.getClass().getDeclaredFields();
  117. for (Field field : fields) {
  118. field.setAccessible(true);
  119. map.put(field.getName(), field);
  120. }
  121. //获取其父类所有属性(字段信息)
  122. Field[] superFields = obj.getClass().getSuperclass().getDeclaredFields();
  123. for (Field field : superFields) {
  124. field.setAccessible(true);
  125. map.put(field.getName(), field);
  126. }
  127. return map;
  128. }
  129.  
  130. /*
  131. * 利用JAVA反射通过实体类名获取其对应属性
  132. * @param 实体类所在bean路径(即实体类在src下的路径),例:entity.Student
  133. */
  134. public static Map<String, String> getBeanComment(String bean) {
  135. Map<String, String> map = new HashMap<>();
  136. try {
  137. Class<?> clz = Class.forName(bean);
  138. Field[] strsSub = clz.getDeclaredFields();
  139. Class<?> clzSuper = Class.forName(bean).getSuperclass();
  140. List<Field> strs = new ArrayList<>();
  141. for (Field filed : strsSub) {
  142. strs.add(filed);
  143. }
  144. if (null != clzSuper) {
  145. Field[] StrsSuper = clzSuper.getDeclaredFields();
  146. for (Field filed : StrsSuper) {
  147. strs.add(filed);
  148. }
  149. }
  150. for (Field field : strs) {
  151. Comment comment = field.getAnnotation(Comment.class);
  152. if (null == comment) {
  153. continue;
  154. }
  155. String name = field.getName();
  156. if ("id".equals(name)) {
  157. continue;
  158. }
  159. if (StringUtils.isNotBlank(comment.value())) {
  160. map.put(name, comment.value());
  161. }
  162. }
  163. return map;
  164. } catch (ClassNotFoundException e) {
  165. e.printStackTrace();
  166. return null;
  167. }
  168. }
  169.  
  170. /*public static void main(String[] args) throws Exception {
  171. Student stu = new Student();
  172. stu.setName("LOL");
  173. stu.setAge("10");
  174. stu.setSex("待确定");
  175. stu.setStuClass("黑铁班");
  176. Map<String, String> map = getBeanComment("Student");
  177. Set<String> keySet = map.keySet();
  178. Map<String, Field> fMap = getFieldMap(stu);
  179. for (String key : keySet) {
  180. String comValue = map.get(key);
  181. System.out.println(comValue);
  182. // 字段Field的属性
  183. String name = fMap.get(key).getName();
  184. System.out.println("属性名:" + name);
  185. // 字段Field的属性类型
  186. String type = fMap.get(key).getType().getName();
  187. System.out.println("属性类型:" +type);
  188. String value = fMap.get(key).get(stu).toString();
  189. System.out.println("属性值:" + value);
  190. System.out.println("---------------------");
  191. }
  192. }*/
  193. }

Java将数据以Excel文件形式导出后台代码实现的更多相关文章

  1. 将mysql数据库数据以Excel文件的形式导出

    最近在工作中,领导让从数据库中导出一些数据并存放到Excel表格中,网上有许多教程,下面是我总结的其中俩种方法. 从数据库管理工具中导出(navicat) 在navicat导出数据导Excel中还是比 ...

  2. 数据库数据以Excel的方式导出

    import java.io.Serializable; import java.util.List; import com.cfets.cwap.s.util.db.TableColumn; /** ...

  3. PHP中导出Excel,将数据以Excel形式导出

    现在,很多地方都需要导出数据,这里说一种简单的方法将数据以Excel的形式导出,方法如下: <?php date_default_timezone_set('PRC');//设置时区 /*设置h ...

  4. springMVC(4)---生成excel文件并导出

    springMVC(4)---生成excel文件并导出 在开发过程中,需要将数据库中的数据以excel表格的方式导出. 首先说明.我这里用的是Apache的POI项目,它是目前比较成熟的HSSF接口, ...

  5. Java生成和操作Excel文件(转载)

    Java生成和操作Excel文件   JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该A ...

  6. Java Struts2 POI创建Excel文件并实现文件下载

    Java Struts2 POI创建Excel文件并实现文件下载2013-09-04 18:53 6059人阅读 评论(1) 收藏 举报 分类: Java EE(49) Struts(6) 版权声明: ...

  7. ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 try.dot.net 的正确使用姿势 .Net NPOI 根据excel模板导出excel、直接生成excel .Net NPOI 上传excel文件、提交后台获取excel里的数据

    ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案   ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不 ...

  8. Excel导入导出工具(简单、好用且轻量级的海量Excel文件导入导出解决方案.)

    Excel导入导出工具(简单.好用且轻量级的海量Excel文件导入导出解决方案.) 置顶 2019-09-07 16:47:10 $9420 阅读数 261更多 分类专栏: java   版权声明:本 ...

  9. JAVA使用POI读取EXCEL文件的简单model

    一.JAVA使用POI读取EXCEL文件的简单model 1.所需要的jar commons-codec-1.10.jarcommons-logging-1.2.jarjunit-4.12.jarlo ...

随机推荐

  1. Golang - 处理json

    目录 Golang - 处理json 1. 编码json 2. 解码json Golang - 处理json 1. 编码json 使用json.Marshal()函数可以对一组数据进行JSON格式的编 ...

  2. sqlalchemy带条件查询相关应用

    sqlalchemy带条件查询 filter_by与filter filter_by 与filter的区别: 1. filter_by只能取值= filter可以==,!=,>=,<=等多 ...

  3. Spring 单例模式和多例模式

    1.Spring中的对象默认都是 单例模式. 2.使用 @Scope("prototype") 注解来使对象成为多例模式. 3.通过@Autowired 注入的Service 或者 ...

  4. 洛谷 P1494 BZOJ 2038 [2009国家集训队]小Z的袜子(hose)

    //洛谷题面字体.排版我向来喜欢,却还没收录这道如此有名的题,BZOJ的题面字体太那啥啦,清橙的题面有了缩进,小标题却和正文字体一致,找个好看的题面咋这么难呐………… //2019年3月23日23:0 ...

  5. find-median-from-data-stream & multiset priority queue 堆

    https://leetcode.com/problems/find-median-from-data-stream/ 这道题目实在是不错,所以单独拎出来. https://discuss.leetc ...

  6. Android多线程断点下载

    到华为后,信息管理特别严格,文件不能外发.所以好久都没写博客了,今天周日,老婆非要我学习.就闲来无事,写一篇博客,呵呵-- 前段时间,项目中提到了断点下载apk并静默安装的需求.本打算用应用市场成熟的 ...

  7. Online Object Tracking: A Benchmark 论文笔记

    Factors that affect the performance of a tracing algorithm 1 Illumination variation 2 Occlusion 3 Ba ...

  8. Android ADB 常用命令

    Android ADB 常用命令 泛原罪 2016.09.21 00:02* 字数 605 阅读 2912评论 0喜欢 1 [TOC] adb logcat 查看日志 详细内容可参见 ADB Usag ...

  9. Battle City

    Battle City Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7208   Accepted: 2427 Descr ...

  10. Node.js:安装配置

    ylbtech-Node.js:安装配置 1.返回顶部 1. ode.js 安装配置 本章节我们将向大家介绍在window和Linux上安装Node.js的方法. 本安装教程以Node.js v4.4 ...