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

来源:互联网 发布:红叶知弦小说 编辑:程序博客网 时间:2024/05/17 03:05

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

 

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

©Copyright 蕃薯耀 2017年9月13日

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

 

直接上代码:

import java.io.IOException;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.math.BigDecimal;import java.text.SimpleDateFormat;import java.util.Date;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern;import javax.servlet.ServletOutputStream;import org.apache.commons.lang.StringUtils;public class ExportUtil {/** * 只导出包含在includeFieldNames中的属性 * @param sheetName 表格左下角的名称 * @param firstRowTitle 第一行需要设置的title,为空则不设置 * @param list 需要显示的数据集合 * @param headers 表格属性列名数组 * @param includeFieldNames 包含的实体属性 * @param widths 列的宽度,不设置(为Null)则默认,设置则根据对应的列宽设置(可以是一个,可以是对应的数量,整形数字,如200) * @param outputStream 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中 * @param datetimePattern 时间形式,当为空(Null或空字符串)时默认为yyyy-MM-dd HH:mm:ss * @throws Exception */@SuppressWarnings({ "unchecked", "rawtypes" })public <T> void exportExcel(String sheetName, String firstRowTitle, List<T> list, String[] headers, String[] includeFieldNames, Integer[] widths,ServletOutputStream outputStream, String datetimePattern) throws Exception {// 默认输出格式if (StringUtils.isBlank(datetimePattern)) {datetimePattern = "yyyy-MM-dd HH:mm:ss";}// 创建一个excel应用文件StringBuffer sb = new StringBuffer();sb.append("<?xml version=\"1.0\"?>");sb.append("\n");sb.append("<?mso-application progid=\"Excel.Sheet\"?>");sb.append("\n");sb.append("<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"");sb.append("\n");sb.append(" xmlns:o=\"urn:schemas-microsoft-com:office:office\"");sb.append("\n");sb.append(" xmlns:x=\"urn:schemas-microsoft-com:office:excel\"");sb.append("\n");sb.append(" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"");sb.append("\n");sb.append(" xmlns:html=\"http://www.w3.org/TR/REC-html40\">");sb.append("\n");sb.append("<Styles>\n");/*设置列头样式*/sb.append("<Style ss:ID=\"header\" ss:Name=\"header\">\n");//ss:ID=“header”对应下面的Row ss:StyleID=“header”sb.append("<Interior ss:Color=\"#c4d79b\" ss:Pattern=\"Solid\"/>\n");// 设置背景颜色sb.append("<Font ss:FontName=\"微软雅黑\" x:CharSet=\"134\" ss:Bold=\"Bolder\" ss:Size=\"12\"/>\n");//设置字体sb.append("</Style>\n");/*其它默认样式设置*/sb.append("<Style ss:ID=\"Default\" ss:Name=\"Normal\">\n");//sb.append("<Alignment ss:Vertical=\"Center\"/>\n");sb.append("<Alignment ss:Horizontal=\"Center\" ss:Vertical=\"Center\" ss:WrapText=\"1\"/>\n");// 左中右设置,一个是水平,一个是垂直sb.append("<Borders>\n");sb.append("<Border ss:Position=\"Left\" ss:LineStyle=\"Continuous\" ss:Color=\"#666\" ss:Weight=\"1\"/>\n");//左边框设置sb.append("<Border ss:Position=\"Right\" ss:LineStyle=\"Continuous\" ss:Color=\"#666\" ss:Weight=\"1\"/>\n");//右边框设置sb.append("<Border ss:Position=\"Bottom\" ss:LineStyle=\"Continuous\" ss:Color=\"#666\" ss:Weight=\"1\"/>\n");//下边框设置sb.append("<Border ss:Position=\"Top\" ss:LineStyle=\"Continuous\" ss:Color=\"#666\" ss:Weight=\"1\"/>\n");//上边框设置sb.append("</Borders>\n");sb.append("<Font ss:FontName=\"宋体\" x:CharSet=\"134\" ss:Size=\"12\"/>\n");sb.append("<Interior/>\n");sb.append("<NumberFormat/>\n");sb.append("<Protection/>\n");sb.append("</Style>\n");sb.append("</Styles>\n");try {// 生成表格int headersLength = headers.length;sb.append("<Worksheet ss:Name=\"" + sheetName + "\">");sb.append("\n");sb.append("<Table ss:ExpandedColumnCount=\"" + headersLength+ "\" ss:ExpandedRowCount=\"1000000\" x:FullColumns=\"1\" x:FullRows=\"1\">");sb.append("\n");if(!StrUtils.isEmptyArray(widths)){if(widths.length > 1){for (int i = 0; i < headersLength; i++) {sb.append("<Column ss:AutoFitWidth=\"0\" ss:Width=\""+widths[i]+"\"/>");}}else{for (int i = 0; i < headersLength; i++) {sb.append("<Column ss:AutoFitWidth=\"0\" ss:Width=\""+widths[0]+"\"/>");}}}// 输出第一行的标题if(!StrUtils.isBlank(firstRowTitle)){//ss:StyleID可以加row或者Cell,加在Row,整行(包括空的Cell)都有,加上Cell,只有Cell才有。sb.append("<Row  ss:Height=\"30\">");sb.append("<Cell ss:StyleID=\"header\" ss:MergeAcross=\""+ (headersLength - 1)+"\"><Data ss:Type=\"String\">" + firstRowTitle + "</Data></Cell>");sb.append("</Row>");}// 输出列头sb.append("<Row>");for (int i = 0; i < headersLength; i++) {sb.append("<Cell ss:StyleID=\"header\"><Data ss:Type=\"String\">" + headers[i] + "</Data></Cell>");}sb.append("</Row>");// 构建表体数据for (int j = 0; j < list.size(); j++) {sb.append("<Row>");T t = (T) list.get(j);for (int i = 0; i < includeFieldNames.length; i++) {// 获取属性名称String fieldName = includeFieldNames[i];String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);// 获取class对象Class tCls = t.getClass();// 获取属性值Object value = null;try {// 获取class方法Method getMethod = tCls.getMethod(getMethodName, new Class[] {});// 获取属性值value = getMethod.invoke(t, new Object[] {});} catch (NoSuchMethodException e) {// 继续循环continue;}// 判断值的类型后进行强制类型转换String textValue = "";if (value instanceof Integer) {// int value = ((Integer) value).intValue();textValue = value.toString();} else if (value instanceof String) {// String s = (String) value;textValue = value.toString();} else if (value instanceof Double) {// double d = ((Double) value).doubleValue();textValue = String.format("%.2f", value);} else if (value instanceof Float) {// float f = ((Float) value).floatValue();textValue = value.toString();} else if (value instanceof Long) {// long l = ((Long) value).longValue();textValue = value.toString();} else if (value instanceof Boolean) {// boolean b = ((Boolean) value).booleanValue();textValue = value.toString();} else if (value instanceof Date) {Date date = (Date) value;SimpleDateFormat sdf = new SimpleDateFormat(datetimePattern);textValue = sdf.format(date);} else if ((value instanceof BigDecimal)) {textValue = value.toString();} else {if (value != null) {continue;}}sb.append("<Cell><Data ss:Type=\"String\">");// 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成if (StringUtils.isNotBlank(textValue)) {Pattern p = Pattern.compile("^//d+(//.//d+)?$");Matcher matcher = p.matcher(textValue);if (matcher.matches()) {// 是数字当作double处理sb.append(Double.parseDouble(textValue));} else {sb.append(textValue);}}sb.append("</Data></Cell>");}sb.append("</Row>");sb.append("\n");}sb.append("</Table>");sb.append("<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">");sb.append("\n");sb.append("<ProtectObjects>False</ProtectObjects>");sb.append("\n");sb.append("<ProtectScenarios>False</ProtectScenarios>");sb.append("\n");sb.append("</WorksheetOptions>");sb.append("\n");sb.append("</Worksheet>");sb.append("</Workbook>");sb.append("\n");} catch (SecurityException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}try {outputStream.write(sb.toString().getBytes());outputStream.flush();outputStream.close();sb = null;} catch (IOException e) {e.printStackTrace();} finally {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}}}

  

 

使用方式:

@RequestMapping("/exportMsCard")public void exportMsCard(HttpServletRequest req, HttpServletResponse res, Integer pageIndex, Integer pageSize, String cardNo, String mobile, String cinemaBaseName, Date startDate, Date endDate) {try {if(endDate != null){endDate = DateUtils.dateAdd(endDate, 1, false);}List<MsCard> msCards = msCardService.list(pageIndex, pageSize, cardNo, mobile, cinemaBaseName, startDate, endDate);String[] headers = { "会员卡号", "会员昵称", "手机号码", "影院名称", "创建时间"};String[] includeFieldNames = { "cardNo", "nickname", "mobile", "cinemaBaseName", "createTime"};// 设置文件后缀并编码String fileName = new String("运营平台-会员卡包-会员卡列表.xls".getBytes("UTF-8"), "iso8859-1");// 设置响应的编码方式;res.setCharacterEncoding("gb2312");res.setHeader("Content-disposition", "attachment; filename=" + fileName);res.setContentType("application/msexcel;charset=UTF-8");// 导出订单ExcelExportUtil exportUtil = new ExportUtil();exportUtil.exportExcel("sheet", "", msCards, headers, includeFieldNames, new Integer[]{200}, res.getOutputStream(), null);} catch (Exception e) {e.printStackTrace();}}

  

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

 

xml方式转Excel用到的属性:



 

补充一个:

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

// 输出第一行的标题if(!StrUtils.isBlank(firstRowTitle)){//ss:StyleID可以加row或者Cell,加在Row,整行(包括空的Cell)都有,加上Cell,只有Cell才有。sb.append("<Row  ss:Height=\"30\">");sb.append("<Cell ss:StyleID=\"header\" ss:MergeAcross=\""+ (headersLength - 1)+"\"><Data ss:Type=\"String\">" + firstRowTitle + "</Data></Cell>");sb.append("</Row>");}

  

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

 

万能方法:

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

 

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

 

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

©Copyright 蕃薯耀 2017年9月13日

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 劳动法规定身体有疾病的怎么办 铁路对职工醉驾怎么办 入职体检高血糖怎么办 睾丸捏一下很疼怎么办 小孩睾丸受外力红肿该怎么办 睾丸炎症怎么办啊会不会不育呢 腰疼连着睾丸疼怎么办 为什么结石会睾丸疼怎么办 感觉自己睾丸变小了怎么办 宝宝小丁丁肿了怎么办 两岁宝宝高低肩怎么办 参军体检视力不过关怎么办 验兵视力不过关怎么办 军检了感冒了怎么办 双侧附睾头囊肿怎么办 睾丸上面长疙瘩很痒都抓烂了怎么办 睾丸小引起精子数量少怎么办 睾丸发育不完全精子存活率低怎么办 踢到睾丸很痛怎么办 兔子的睾丸烂了怎么办 梗阻性无精穿刺取得精子不好怎么办 甲状腺做完穿刺后是恶性怎么办 硬了之后睾丸痛怎么办 腋下胯间颜色深怎么办 当兵前上班有社保怎么办 别人背后害我我怎么办 左侧胸明显大于右侧胸怎么办 婴儿拉大便次数多怎么办 公鸽子不会踩蛋怎么办 生殖器套东西取不下来怎么办 婴儿成蛋蛋的皮好长怎么办 丈夫总要害自己该怎么办 脚背踢肿了怎么办很疼 踢沙袋脚背伤了怎么办 脚y子烂了怎么办 掐喉咙那会痒会咳嗽怎么办 掐到婴儿脖子了怎么办 孩子胳膊不小心烫破皮了怎么办 孩子嘴角磕破了怎么办 电话不小心拒接了怎么办 手机微信不小心碰到语言英文怎么办