通过使用poi技术生成Excel,使用反射技术实现自动映射列表的数据。

ExportTableUtil.java

  1. public class ExportTableUtil {
  2.  
  3. /**
  4. *
  5. * @Description: 获取csv格式的字符串
  6. * @param @param 表格头
  7. * @param @param fieldNameList 对应的属性名 按照先后与表头对应而且值与数据类型的属性名对应
  8. * @param @param params 数据
  9. * @param @return
  10. * @param @throws IllegalArgumentException
  11. * @param @throws IllegalAccessException
  12. * @param @throws NoSuchFieldException
  13. * @param @throws SecurityException 设定文件
  14. * @return String 返回类型
  15. */
  16. public static String csv(String[] headList, String[] fieldNameList, List<?> params) throws IllegalArgumentException, IllegalAccessException,
  17. NoSuchFieldException, SecurityException {
  18. StringBuilder stringBuilder = new StringBuilder();
  19. // add head on first
  20. for (int i = 0; null != headList && i < headList.length; i++) {
  21. stringBuilder.append(headList[i]);
  22. if (i < headList.length - 1) {
  23. stringBuilder.append(",");
  24. } else {
  25. stringBuilder.append("\r\n");
  26. }
  27. }
  28. // add data from second line to ---
  29. for (int i = 0; null != params && i < params.size(); i++) {
  30. Class<? extends Object> clazz = params.get(i).getClass();
  31. for (int j = 0; null != fieldNameList && j < fieldNameList.length; j++) {
  32. String fieldName = fieldNameList[j];
  33. if (!fieldName.contains(".")) {
  34. Field field = clazz.getDeclaredField(fieldName);
  35. if (null != field) {
  36. field.setAccessible(true);
  37. Object obj = field.get(params.get(i));
  38. if (null != obj) {
  39. stringBuilder.append(obj.toString());
  40. }
  41. } else {
  42. stringBuilder.append("");
  43. }
  44. if (j < fieldNameList.length - 1) {
  45. stringBuilder.append(",");
  46. }
  47. }else{
  48. Object param = params.get(i);
  49. Object valObj = vectorObj(clazz, fieldName, param);
  50. if(null!=valObj){
  51. stringBuilder.append(valObj.toString());
  52. }else {
  53. stringBuilder.append("");
  54. }
  55. if (j < fieldNameList.length - 1) {
  56. stringBuilder.append(",");
  57. }
  58. }
  59. }
  60. stringBuilder.append("\r\n");
  61. }
  62.  
  63. return stringBuilder.toString();
  64. }
  65.  
  66. /**
  67. *
  68. * @Description: 通过response下载文档
  69. * @param @param response
  70. * @param @param fileName
  71. * @param @param headList
  72. * @param @param fieldNameList
  73. * @param @param params 设定文件
  74. * @return void 返回类型
  75. */
  76. public static void httpExportCSV(HttpServletRequest request, HttpServletResponse response, String fileName, String[] headList,
  77. String[] fieldNameList, List<?> params) {
  78. Map<String, Object> map = new HashMap<String, Object>();
  79. try {
  80. response.setCharacterEncoding("UTF-8");
  81. response.setContentType("application/x-download");
  82. final String userAgent = request.getHeader("USER-AGENT");
  83. String csvContent = csv(headList, fieldNameList, params);
  84. String finalFileName = null;
  85. if (StringUtils.contains(userAgent, "MSIE")) {// IE浏览器
  86. finalFileName = URLEncoder.encode(fileName, "UTF8");
  87. } else if (StringUtils.contains(userAgent, "Mozilla")) {// google,火狐浏览器
  88. finalFileName = new String(fileName.getBytes(), "ISO8859-1");
  89. } else {
  90. finalFileName = URLEncoder.encode(fileName, "UTF8");// 其他浏览器
  91. }
  92.  
  93. response.setHeader("Content-Disposition", "attachment; filename=\"" + finalFileName + "\"");
  94. response.getOutputStream().write(csvContent.getBytes());
  95. } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException | IOException e) {
  96.  
  97. e.printStackTrace();
  98. map.put("state", "202");
  99. map.put("message", "数据转换异常");
  100. try {
  101. response.getOutputStream().write(JSONUtils.toJSONString(map).getBytes());
  102. } catch (IOException e1) {
  103. // TODO Auto-generated catch block
  104. e1.printStackTrace();
  105. }
  106. }
  107.  
  108. }
  109.  
  110. /**
  111. *
  112. * @Description: 得到excel表的二进制流
  113. * @param @param headList 表头
  114. * @param @param fieldNameList 属性名按照表头先后顺序对应而且必须在数据类型中存在属性名与之对应
  115. * @param @param params
  116. * @param @return
  117. * @param @throws IllegalArgumentException
  118. * @param @throws IllegalAccessException
  119. * @param @throws NoSuchFieldException
  120. * @param @throws SecurityException
  121. * @param @throws IOException 设定文件
  122. * @return byte[] 返回类型
  123. */
  124. public static byte[] xls(String[] headList, String[] fieldNameList, List<?> params) throws IllegalArgumentException, IllegalAccessException,
  125. NoSuchFieldException, SecurityException, IOException {
  126. Workbook work = new HSSFWorkbook();
  127. Sheet sheet = work.createSheet();
  128. Row rowOne = sheet.createRow(0);
  129. for (int i = 0; null != headList && i < headList.length; i++) {// 表头
  130. Cell cellOne = rowOne.createCell(i);
  131. cellOne.setCellValue(headList[i]);// 填充值
  132. }
  133.  
  134. // 数据填充
  135. for (int i = 0; null != params && i < params.size(); i++) {
  136. Class<? extends Object> clazz = params.get(i).getClass();
  137. Row dataRow = sheet.createRow(i + 1);
  138. for (int j = 0; null != fieldNameList && j < fieldNameList.length; j++) {
  139. String fieldName = fieldNameList[j];
  140. Cell cell = dataRow.createCell(j);
  141. if (!fieldName.contains(".")) {
  142. Field field = clazz.getDeclaredField(fieldName);
  143. field.setAccessible(true);
  144. Object obj = field.get(params.get(i));
  145. if (null != obj) {
  146.  
  147. if (obj instanceof String) {
  148. cell.setCellValue(obj.toString());
  149. } else if (obj instanceof Double) {
  150. cell.setCellValue((double) obj);
  151. } else if (obj instanceof Boolean) {
  152. cell.setCellValue((boolean) obj);
  153. } else if (obj instanceof Date) {
  154. cell.setCellValue((Date) obj);
  155. } else {
  156. cell.setCellValue(obj.toString());
  157. }
  158. }
  159. } else if (fieldName.contains(".")) {
  160. Object param = params.get(i);
  161. Object valObj = vectorObj(clazz, fieldName, param);
  162.  
  163. cell.setCellValue(null == valObj ? null : valObj.toString());
  164. }
  165.  
  166. }
  167.  
  168. }
  169. ByteOutputStream bos = new ByteOutputStream();
  170. work.write(bos);
  171. work.close();
  172. return bos.getBytes();
  173. }
  174.  
  175. private static Object vectorObj(Class<? extends Object> clazz, String fieldName, Object obj) throws NoSuchFieldException, SecurityException,
  176. IllegalArgumentException, IllegalAccessException {
  177. if (!fieldName.contains(".")) {
  178. Field field = clazz.getDeclaredField(fieldName);
  179. field.setAccessible(true);
  180. return field.get(obj);
  181. } else {
  182. String fieldChildName = fieldName.substring(0, fieldName.indexOf("."));
  183. Object newObj = null;
  184. if (null != fieldChildName) {
  185.  
  186. Field field = clazz.getDeclaredField(fieldChildName);
  187. field.setAccessible(true);
  188. newObj = field.get(obj);
  189. if (newObj == null) {
  190. return null;
  191.  
  192. } else {
  193. Class<? extends Object> clazz2 = newObj.getClass();
  194. String fieldOtherChildName = fieldName.substring(fieldName.indexOf(".") + 1);
  195. return vectorObj(clazz2, fieldOtherChildName, newObj);
  196. }
  197.  
  198. }
  199. return null;
  200. }
  201.  
  202. }
  203.  
  204. /**
  205. *
  206. * @Description: 导出xls表-------------从第一列开始
  207. * @param @param request
  208. * @param @param response
  209. * @param @param fileName 文件名
  210. * @param @param headList 表头
  211. * @param @param fieldNameList 属性名 和按照表头先后顺序对应,值和数据列表中对象类型的属性名相同
  212. * @param @param params 设定文件
  213. * @return void 返回类型
  214. */
  215. public static void httpExportXLS(HttpServletRequest request, HttpServletResponse response, String fileName, String[] headList,
  216. String[] fieldNameList, List<?> params) {
  217. Map<String, Object> map = new HashMap<String, Object>();
  218. try {
  219. response.setCharacterEncoding("UTF-8");
  220. response.setContentType("application/x-download");
  221. final String userAgent = request.getHeader("USER-AGENT");
  222. byte[] xlsContent = xls(headList, fieldNameList, params);
  223. String finalFileName = null;
  224. if (StringUtils.contains(userAgent, "MSIE")) {// IE浏览器
  225. finalFileName = URLEncoder.encode(fileName, "UTF8");
  226. } else if (StringUtils.contains(userAgent, "Mozilla")) {// google,火狐浏览器
  227. finalFileName = new String(fileName.getBytes(), "ISO8859-1");
  228. } else {
  229. finalFileName = URLEncoder.encode(fileName, "UTF8");// 其他浏览器
  230. }
  231.  
  232. response.setHeader("Content-Disposition", "attachment; filename=\"" + finalFileName + "\"");
  233. response.getOutputStream().write(xlsContent);
  234. } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException | IOException e) {
  235.  
  236. e.printStackTrace();
  237. map.put("state", "202");
  238. map.put("message", "数据转换异常");
  239. try {
  240. response.getOutputStream().write(JSONUtils.toJSONString(map).getBytes());
  241. } catch (IOException e1) {
  242. // TODO Auto-generated catch block
  243. e1.printStackTrace();
  244. }
  245. }
  246. }
  247.  
  248. /**
  249. *
  250. * @Description: 根据路径的后缀名导出对应的文件
  251. * @param @param request
  252. * @param @param response
  253. * @param @param fileName------------文件名(格式*.xls,*.csv)
  254. * @param @param headList--------------表格头部内容
  255. * @param @param fieldNameList----------属性名和数据列表中类型的属性名相同,通过先后循序和表头对应。
  256. * @param @param params--------------数据
  257. * @param @throws Exception ----文件名不合法
  258. * @return void 返回类型
  259. */
  260. public static void httpExport(HttpServletRequest request, HttpServletResponse response, String fileName, String[] headList,
  261. String[] fieldNameList, List<?> params) throws Exception {
  262. if (null == fileName || StringUtils.isEmpty(fileName)) {
  263. throw new NullPointerException("文件名不可以为空");
  264. } else {
  265. String suffix = fileName.substring(fileName.indexOf(".") + 1);
  266. if (null != suffix) {
  267. System.out.println(suffix);
  268. switch (suffix) {
  269. case "csv":
  270. httpExportCSV(request, response, fileName, headList, fieldNameList, params);
  271. break;
  272. case "xls":
  273. httpExportXLS(request, response, fileName, headList, fieldNameList, params);
  274. break;
  275. case "xlsx":
  276. httpExportXLS(request, response, fileName, headList, fieldNameList, params);
  277. break;
  278. case "doc":
  279. break;
  280. case "docx":
  281. break;
  282. case "pdf":
  283. break;
  284. }
  285. } else {
  286. throw new Exception("文件名的格式不合法");
  287. }
  288. }
  289. }
  290. }

  

java使用poi实现excel表格生成的更多相关文章

  1. java用poi读取Excel表格中的数据

    Java读写Excel的包是Apache POI(项目地址:http://poi.apache.org/),因此需要先获取POI的jar包,本实验使用的是POI 3.9稳定版.Apache POI 代 ...

  2. Java使用POI解析Excel表格

    概述 Excel表格是常用的数据存储工具,项目中经常会遇到导入Excel和导出Excel的功能. 常见的Excel格式有xls和xlsx.07版本以后主要以基于XML的压缩格式作为默认文件格式xlsx ...

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

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

  4. JAVA使用POI获取Excel的列数与行数

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能. 下面这篇文章给大家介 ...

  5. Java之POI导出Excel(一):单sheet

    相信在大部分的web项目中都会有导出导入Excel的需求,今天我们就来看看如何用Java代码去实现 用POI导出Excel表格. 一.pom引用 pom文件中,添加以下依赖 查看代码  <!-- ...

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

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

  7. java通过poi编写excel文件

    public String writeExcel(List<MedicalWhiteList> MedicalWhiteList) { if(MedicalWhiteList == nul ...

  8. java使用POI实现excel文件的读取,兼容后缀名xls和xlsx

    需要用的jar包如下: 如果是maven管理的项目,添加依赖如下: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --&g ...

  9. Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决

    Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决 引言: 在Java中 ...

随机推荐

  1. Delphi APP 開發入門(二)Android/iOS設定,Hello World

    Delphi APP 開發入門(二)Android/iOS設定,Hello World 分享: Share on facebookShare on twitterShare on google_plu ...

  2. phpcms发布到服务器修改

    请进行以下步骤的修改: 1.修改/caches/configs/system.php里面所有和域名有关的,把以前的老域名修改为新域名就可以了. 2.进行后台设置->站点管理 对相应的站点的域名进 ...

  3. $python collections库

    collections库是python内置的集合库,本文主要讲解以下5种数据结构的用法: namedtuple 命名元组,是tuple的子类 deque 双向列表 defaultdict 有默认值的字 ...

  4. netty9---使用编码解码器

    客户端: package com.client; import java.net.InetSocketAddress; import java.util.Scanner; import java.ut ...

  5. eclipse中Web Deployment Assembly与build path作用

    java Build path是编译路径设置,主要用来设置源代码的编译路径默认是default output folder Web Deployment Assembly是eclipse中的发布路径设 ...

  6. SQL.Mysql中Cast()函数的用法

    比起orcale,MySQL相比之下就简单得多了,只需要一个Cast()函数就能搞定.其语法为:Cast(字段名 as 转换的类型 ),其中类型可以为: CHAR[(N)] 字符型  DATE  日期 ...

  7. 安装vmware虚拟机和linux(centos)

    打开 WMware Workstation 8,然后选择新建虚拟机 2 新建虚拟机向导 选择 自定义(高级)(C)然后点击[下一步]按钮 3 选择虚拟机硬件兼容性 选择 workstation 8.0 ...

  8. jdbctemplate中的queryForInt方法

    今天才发现,原来spring 3.2.2之后,jdbctemplate中的queryForInt已经被取消了! 看下代码: 原来是这样写的: String sql = "SELECT cou ...

  9. 重新想,重新看——CSS3变形,过渡与动画②

    本篇文章主要用来归纳总结CSS3变形属性. CSS3变形属性大致可以分为以下三个部分: 变形控制属性 2D变形函数 3D变形函数 下面将对其一一进行分析: 1.变形控制属性 所谓的变形控制属性主要指“ ...

  10. swoole 异步队列简明教程

    安装步骤如下(推荐把安装文件下载到 /usr/local/src 目录下): step 1: wget --no-check-certificate https://github.com/swoole ...