Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类

==============================

©Copyright 蕃薯耀 2017年9月13日

http://www.cnblogs.com/fanshuyao/

直接上代码:

  1. import java.io.IOException;
  2. import java.lang.reflect.InvocationTargetException;
  3. import java.lang.reflect.Method;
  4. import java.math.BigDecimal;
  5. import java.text.SimpleDateFormat;
  6. import java.util.Date;
  7. import java.util.List;
  8. import java.util.regex.Matcher;
  9. import java.util.regex.Pattern;
  10.  
  11. import javax.servlet.ServletOutputStream;
  12.  
  13. import org.apache.commons.lang.StringUtils;
  14.  
  15. public class ExportUtil {
  16.  
  17. /**
  18. * 只导出包含在includeFieldNames中的属性
  19. * @param sheetName 表格左下角的名称
  20. * @param firstRowTitle 第一行需要设置的title,为空则不设置
  21. * @param list 需要显示的数据集合
  22. * @param headers 表格属性列名数组
  23. * @param includeFieldNames 包含的实体属性
  24. * @param widths 列的宽度,不设置(为Null)则默认,设置则根据对应的列宽设置(可以是一个,可以是对应的数量,整形数字,如200)
  25. * @param outputStream 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
  26. * @param datetimePattern 时间形式,当为空(Null或空字符串)时默认为yyyy-MM-dd HH:mm:ss
  27. * @throws Exception
  28. */
  29. @SuppressWarnings({ "unchecked", "rawtypes" })
  30. public <T> void exportExcel(String sheetName, String firstRowTitle, List<T> list, String[] headers, String[] includeFieldNames, Integer[] widths,
  31. ServletOutputStream outputStream, String datetimePattern) throws Exception {
  32.  
  33. // 默认输出格式
  34. if (StringUtils.isBlank(datetimePattern)) {
  35. datetimePattern = "yyyy-MM-dd HH:mm:ss";
  36. }
  37.  
  38. // 创建一个excel应用文件
  39. StringBuffer sb = new StringBuffer();
  40. sb.append("<?xml version=\"1.0\"?>");
  41. sb.append("\n");
  42. sb.append("<?mso-application progid=\"Excel.Sheet\"?>");
  43. sb.append("\n");
  44. sb.append("<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"");
  45. sb.append("\n");
  46. sb.append(" xmlns:o=\"urn:schemas-microsoft-com:office:office\"");
  47. sb.append("\n");
  48. sb.append(" xmlns:x=\"urn:schemas-microsoft-com:office:excel\"");
  49. sb.append("\n");
  50. sb.append(" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"");
  51. sb.append("\n");
  52. sb.append(" xmlns:html=\"http://www.w3.org/TR/REC-html40\">");
  53. sb.append("\n");
  54.  
  55. sb.append("<Styles>\n");
  56.  
  57. /*设置列头样式*/
  58. sb.append("<Style ss:ID=\"header\" ss:Name=\"header\">\n");//ss:ID=“header”对应下面的Row ss:StyleID=“header”
  59. sb.append("<Interior ss:Color=\"#c4d79b\" ss:Pattern=\"Solid\"/>\n");// 设置背景颜色
  60. sb.append("<Font ss:FontName=\"微软雅黑\" x:CharSet=\"134\" ss:Bold=\"Bolder\" ss:Size=\"12\"/>\n");//设置字体
  61. sb.append("</Style>\n");
  62.  
  63. /*其它默认样式设置*/
  64. sb.append("<Style ss:ID=\"Default\" ss:Name=\"Normal\">\n");
  65. //sb.append("<Alignment ss:Vertical=\"Center\"/>\n");
  66. sb.append("<Alignment ss:Horizontal=\"Center\" ss:Vertical=\"Center\" ss:WrapText=\"1\"/>\n");// 左中右设置,一个是水平,一个是垂直
  67. sb.append("<Borders>\n");
  68. sb.append("<Border ss:Position=\"Left\" ss:LineStyle=\"Continuous\" ss:Color=\"#666\" ss:Weight=\"1\"/>\n");//左边框设置
  69. sb.append("<Border ss:Position=\"Right\" ss:LineStyle=\"Continuous\" ss:Color=\"#666\" ss:Weight=\"1\"/>\n");//右边框设置
  70. sb.append("<Border ss:Position=\"Bottom\" ss:LineStyle=\"Continuous\" ss:Color=\"#666\" ss:Weight=\"1\"/>\n");//下边框设置
  71. sb.append("<Border ss:Position=\"Top\" ss:LineStyle=\"Continuous\" ss:Color=\"#666\" ss:Weight=\"1\"/>\n");//上边框设置
  72. sb.append("</Borders>\n");
  73. sb.append("<Font ss:FontName=\"宋体\" x:CharSet=\"134\" ss:Size=\"12\"/>\n");
  74. sb.append("<Interior/>\n");
  75. sb.append("<NumberFormat/>\n");
  76. sb.append("<Protection/>\n");
  77. sb.append("</Style>\n");
  78.  
  79. sb.append("</Styles>\n");
  80.  
  81. try {
  82.  
  83. // 生成表格
  84. int headersLength = headers.length;
  85.  
  86. sb.append("<Worksheet ss:Name=\"" + sheetName + "\">");
  87. sb.append("\n");
  88. sb.append("<Table ss:ExpandedColumnCount=\"" + headersLength
  89. + "\" ss:ExpandedRowCount=\"1000000\" x:FullColumns=\"1\" x:FullRows=\"1\">");
  90. sb.append("\n");
  91.  
  92. if(!StrUtils.isEmptyArray(widths)){
  93. if(widths.length > 1){
  94. for (int i = 0; i < headersLength; i++) {
  95. sb.append("<Column ss:AutoFitWidth=\"0\" ss:Width=\""+widths[i]+"\"/>");
  96. }
  97. }else{
  98. for (int i = 0; i < headersLength; i++) {
  99. sb.append("<Column ss:AutoFitWidth=\"0\" ss:Width=\""+widths[0]+"\"/>");
  100. }
  101. }
  102. }
  103.  
  104. // 输出第一行的标题
  105. if(!StrUtils.isBlank(firstRowTitle)){
  106. //ss:StyleID可以加row或者Cell,加在Row,整行(包括空的Cell)都有,加上Cell,只有Cell才有。
  107. sb.append("<Row ss:Height=\"30\">");
  108. sb.append("<Cell ss:StyleID=\"header\" ss:MergeAcross=\""+ (headersLength - 1)+"\"><Data ss:Type=\"String\">" + firstRowTitle + "</Data></Cell>");
  109. sb.append("</Row>");
  110. }
  111.  
  112. // 输出列头
  113. sb.append("<Row>");
  114. for (int i = 0; i < headersLength; i++) {
  115. sb.append("<Cell ss:StyleID=\"header\"><Data ss:Type=\"String\">" + headers[i] + "</Data></Cell>");
  116. }
  117. sb.append("</Row>");
  118.  
  119. // 构建表体数据
  120. for (int j = 0; j < list.size(); j++) {
  121.  
  122. sb.append("<Row>");
  123.  
  124. T t = (T) list.get(j);
  125.  
  126. for (int i = 0; i < includeFieldNames.length; i++) {
  127.  
  128. // 获取属性名称
  129. String fieldName = includeFieldNames[i];
  130.  
  131. String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
  132.  
  133. // 获取class对象
  134. Class tCls = t.getClass();
  135.  
  136. // 获取属性值
  137. Object value = null;
  138.  
  139. try {
  140. // 获取class方法
  141. Method getMethod = tCls.getMethod(getMethodName, new Class[] {});
  142.  
  143. // 获取属性值
  144. value = getMethod.invoke(t, new Object[] {});
  145.  
  146. } catch (NoSuchMethodException e) {
  147. // 继续循环
  148. continue;
  149. }
  150.  
  151. // 判断值的类型后进行强制类型转换
  152. String textValue = "";
  153. if (value instanceof Integer) {
  154. // int value = ((Integer) value).intValue();
  155. textValue = value.toString();
  156. } else if (value instanceof String) {
  157. // String s = (String) value;
  158. textValue = value.toString();
  159. } else if (value instanceof Double) {
  160. // double d = ((Double) value).doubleValue();
  161. textValue = String.format("%.2f", value);
  162. } else if (value instanceof Float) {
  163. // float f = ((Float) value).floatValue();
  164. textValue = value.toString();
  165. } else if (value instanceof Long) {
  166. // long l = ((Long) value).longValue();
  167. textValue = value.toString();
  168. } else if (value instanceof Boolean) {
  169. // boolean b = ((Boolean) value).booleanValue();
  170. textValue = value.toString();
  171. } else if (value instanceof Date) {
  172. Date date = (Date) value;
  173. SimpleDateFormat sdf = new SimpleDateFormat(datetimePattern);
  174. textValue = sdf.format(date);
  175. } else if ((value instanceof BigDecimal)) {
  176. textValue = value.toString();
  177. } else {
  178. if (value != null) {
  179. continue;
  180. }
  181. }
  182.  
  183. sb.append("<Cell><Data ss:Type=\"String\">");
  184.  
  185. // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
  186. if (StringUtils.isNotBlank(textValue)) {
  187.  
  188. Pattern p = Pattern.compile("^//d+(//.//d+)?$");
  189. Matcher matcher = p.matcher(textValue);
  190. if (matcher.matches()) {
  191. // 是数字当作double处理
  192. sb.append(Double.parseDouble(textValue));
  193. } else {
  194. sb.append(textValue);
  195. }
  196.  
  197. }
  198.  
  199. sb.append("</Data></Cell>");
  200.  
  201. }
  202.  
  203. sb.append("</Row>");
  204. sb.append("\n");
  205.  
  206. }
  207.  
  208. sb.append("</Table>");
  209. sb.append("<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">");
  210. sb.append("\n");
  211. sb.append("<ProtectObjects>False</ProtectObjects>");
  212. sb.append("\n");
  213. sb.append("<ProtectScenarios>False</ProtectScenarios>");
  214. sb.append("\n");
  215. sb.append("</WorksheetOptions>");
  216. sb.append("\n");
  217. sb.append("</Worksheet>");
  218. sb.append("</Workbook>");
  219. sb.append("\n");
  220.  
  221. } catch (SecurityException e) {
  222. e.printStackTrace();
  223. } catch (IllegalArgumentException e) {
  224. e.printStackTrace();
  225. } catch (IllegalAccessException e) {
  226. e.printStackTrace();
  227. } catch (InvocationTargetException e) {
  228. e.printStackTrace();
  229. }
  230.  
  231. try {
  232. outputStream.write(sb.toString().getBytes());
  233. outputStream.flush();
  234. outputStream.close();
  235. sb = null;
  236. } catch (IOException e) {
  237. e.printStackTrace();
  238. } finally {
  239. try {
  240. outputStream.close();
  241. } catch (IOException e) {
  242. e.printStackTrace();
  243. }
  244. }
  245. }
  246.  
  247. }

  

使用方式:

 注意:不能直接通过Ajax请求,需要通过表单提交。

xml方式转Excel用到的属性:

补充一个:

ss:MergeAcross 表示跨列合并,如下:

注意是否需要减1,因为表示是跨多少列,那就是合并其它的几列,不包括自己,所以需要减 1

万能方法:

如果突然需要增加某些未知的属性,可以自己先创建一个Excel文件,做一个模板出来,然后另存为Xml文件,注意是Xml文件,保存后打开Xml文件查看自己创建的模板的某些属性应该怎么设置。但打开的xml文件比较乱,所以通过搜索找到自己对应的那个格子。

源码下载见:http://fanshuyao.iteye.com/blog/2393131

(如果你觉得文章对你有帮助,欢迎捐赠,^_^,谢谢!)

=============================

©Copyright 蕃薯耀 2017年9月13日

http://www.cnblogs.com/fanshuyao/

Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类的更多相关文章

  1. JAVA原始的导出excel文件,快捷通用 方便 还能够导出word文档哦

    如今导出excel基本上都是用poi了,当报表格式非常负责的时候 开发难度会加大 假设报表有格式有变化 那就更复杂了,先发现一个非常老的技术.能够解决格式复杂的报表. 实例代码例如以下: <%@ ...

  2. Java中常用到的文件操作那些事(二)——使用POI解析Excel的两种常用方式对比

    最近生产环境有个老项目一直内存报警,不时的还出现内存泄漏,导致需要重启服务器,已经严重影响正常服务了.获取生成dump文件后,使用MAT工具进行分析,发现是其中有个Excel文件上传功能时,经常会导致 ...

  3. 如何将一个Excel文件中的sheet移动到另外一个Excel?

    背景 工作中往往会有多个excel维护的情况,随着业务的变化, 将一个Excel合并到另外一个Excel,成为必须. 如何移动sheet,对于不会的人,这是一个好问题, 也许你经过多次尝试都没有成功. ...

  4. 基于Java使用Flink读取CSV文件,针对批处理,多表联合两种方式Table类和Join方法的实现数据处理,再入CSV文件

    Maven依赖 源头 <dependencies> <dependency> <groupId>org.projectlombok</groupId> ...

  5. JXL包大解析;Java程序生成excel文件和解析excel文件内容

    最近需求变化,需要把excel导入 我以前没有做过,所以我查了一些资料 和参考别人的代码 以下是多种方式: import java.io.File; import java.io.FileInputS ...

  6. 【Java】使用Apache POI生成和解析Excel文件

    概述 Excel是我们平时工作中比较常用的用于存储二维表数据的,JAVA也可以直接对Excel进行操作,分别有jxl和poi,2种方式. HSSF is the POI Project's pure ...

  7. Java 解析Excel文件为JSON

    Excel转Json的需求 反正我对SSM基本不会的情况下来到现在这家公司,都是90后,感觉很好.第二天就给我开发任务,就是把用户上传的Excel文件转成JSON返回给前台用于大屏的数据展示. 解决方 ...

  8. Java文件操作系列[2]——使用JXL操作Excel文件

    由于java流无法实现对Excel文件的读写操作,因此在项目中经常利用第三方开源的组件来实现.支持Excel文件操作的第三方开源组件主要有Apache的POI和开源社区的JXL. 总体来说,二者的区别 ...

  9. Java读写Excel文件,利用POI

    直接看工具类代码吧, package com.example.demo.util; import com.example.demo.entity.ExcelDataVO; import org.apa ...

  10. PHP导出excel文件

    现在教教你如何导入excel文件: 在我的文件储存里面有一个com文件夹的,将其解压放在ThinkPHP/Library/文件夹里面,然后就是写控制器啦!去调用这个插件: <?php names ...

随机推荐

  1. 深入理解cookie和session

    cookie和session在java web开发中扮演了十分重要的作用,本篇文章对其中的重要知识点做一些探究和总结. 1.cookie存在于浏览器 随意打开一个网址,用火狐的调试工具,随意选取一个链 ...

  2. Python 接口自动化(预)

    1. HTTP协议:HTTP是接口测试的基础: 2. Fiddler工具:Fiddler所有界面布局及主要布局

  3. WinForm响应式布局设计实践

    引言 创建响应式WinForm应用程序并不那么简单. 响应式布局,在此我指的是应用程序在不同屏幕分辨率下的可用性. 对于WinForm应用程序,我们需要明确地根据分辨率来调整控件的大小和重新定位. 虽 ...

  4. JSP中的“小饼干”Cookie,用来存储数组的方式(下方已String类型的数组为例:)

    1.Cookie常用方法中,存储数据的方式: Cookie cookie = new Cookie("key","Value"); response.addCo ...

  5. ReSharper 全教程

    Resharper系列 更多关于Resharper的介绍 参考我之前的文章: Resharper 详细教程 提升ReSharper和Visual Studio的性能 Visual Studio中使用R ...

  6. C#学习笔记-工厂模式

    题目:计算器 解析:工厂方法(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类. 定义运算类: class Operation { ; ; public doubl ...

  7. \(?0\d{2}[) -]?\d{8}正则表达式的解释

    正则表达式30分钟出现了这样一个正则表达式:(?0\d{2}[) -]?\d{8} "("和")"也是元字符,所以需要转义. ?匹配零或一次 (? 表示 出现( ...

  8. top命令参数解析

    PID 进程ID USER 进程所有者的用户名 PR 任务优先级 NI nice值.数值越小表示优先级越高,数值越大表示优先越低. VIRT 进程使用的虚拟内存总量,单位kb.VIRT=SWAP+RE ...

  9. 牛客网linux试题-错误整理-20171013

    创建对象时,对象的内存和指向对象的指针分别分配在:堆区,栈区 堆内存用来存放由new创建的对象和数组,在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在 ...

  10. Nginx常用配置实例(4)

    Nginx作为一个HTTP服务器,在功能实现方面和性能方面都表现得非常卓越,完全可以与Apache相媲美,几乎可以实现Apache的所有功能,下面就介绍一些Nginx常用的配置实例,具体包含虚拟主机配 ...