导出excel功能,较通用的一种实现
来源:互联网 发布:官方软件 编辑:程序博客网 时间:2024/06/06 03:19
作用:通过jxl包生成excel文件。示例请看main方法
特点:
1、通过java的反射特性,将jxl生成excel的逻辑,和业务数据解耦。在LinkedHashMap参数中定义每一列的标题以及对应的javabean属性,生成excel时,就会根据map插入的先后顺序,依次在excel中添加列,每列的标题为map的value值,内容为对应的javabean属性。
2、通过一个map,可以很方便地配置excel中每列的内容和顺序
特点:
1、通过java的反射特性,将jxl生成excel的逻辑,和业务数据解耦。在LinkedHashMap参数中定义每一列的标题以及对应的javabean属性,生成excel时,就会根据map插入的先后顺序,依次在excel中添加列,每列的标题为map的value值,内容为对应的javabean属性。
2、通过一个map,可以很方便地配置excel中每列的内容和顺序
3、优化显示。数字用千分位格式,且右对齐;时间类型的值,转成标准的yyyy-MM-dd HH:mm:ss形式;其他表格内容居中显示;标题粗体;表格根据宽度自适应显示
package mqq.sdet.rdm.common.util;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.OutputStream;import java.lang.reflect.Field;import java.sql.Timestamp;import java.text.DecimalFormat;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.Iterator;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;import jxl.CellView;import jxl.Workbook;import jxl.format.Alignment;import jxl.format.Border;import jxl.format.BorderLineStyle;import jxl.format.VerticalAlignment;import jxl.write.Label;import jxl.write.WritableCellFormat;import jxl.write.WritableFont;import jxl.write.WritableSheet;import jxl.write.WritableWorkbook;public class ExportExcelUtil{public static final int RESULT_SUCC = 0;public static final int RESULT_FAIL = -1;public static final String TYPE_YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";/** * 将数据转成成excel。 特性: 1、将时间类型的值转成yyyy-MM-dd HH:mm:ss 2、将数字类型的值转成带千分符的形式,并右对齐 * 3、除数字类型外,其他类型的值居中显示 * * @param keyMap * 定义标题及每一列对应的JavaBean属性。标题的先后顺序,对应keyMap的插入顺序; * map中的key值为JavaBean属性,value为标题 * @param listContent * 表格内容,List中的每一个元素,对应到excel的每一行 * @param os * 结果输出流 * @return */public final int export(LinkedHashMap<String, String> keyMap, List<Object> listContent, OutputStream os){int rs = RESULT_SUCC;try{// 创建工作簿WritableWorkbook workbook = Workbook.createWorkbook(os);// 创建名为sheet1的工作表WritableSheet sheet = workbook.createSheet("Sheet1", 0);// 设置字体WritableFont NormalFont = new WritableFont(WritableFont.ARIAL, 12);WritableFont BoldFont = new WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD);// 标题居中WritableCellFormat titleFormat = new WritableCellFormat(BoldFont);titleFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条titleFormat.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐titleFormat.setAlignment(Alignment.CENTRE); // 文字水平对齐titleFormat.setWrap(false); // 文字是否换行// 正文居中WritableCellFormat contentCenterFormat = new WritableCellFormat(NormalFont);contentCenterFormat.setBorder(Border.ALL, BorderLineStyle.THIN);contentCenterFormat.setVerticalAlignment(VerticalAlignment.CENTRE);contentCenterFormat.setAlignment(Alignment.CENTRE);contentCenterFormat.setWrap(false);// 正文右对齐WritableCellFormat contentRightFormat = new WritableCellFormat(NormalFont);contentRightFormat.setBorder(Border.ALL, BorderLineStyle.THIN);contentRightFormat.setVerticalAlignment(VerticalAlignment.CENTRE);contentRightFormat.setAlignment(Alignment.RIGHT);contentRightFormat.setWrap(false);// 设置标题,标题内容为keyMap中的value值,标题居中粗体显示Iterator titleIter = keyMap.entrySet().iterator();int titleIndex = 0;while (titleIter.hasNext()){Map.Entry<String, String> entry = (Map.Entry<String, String>) titleIter.next();sheet.addCell(new Label(titleIndex++, 0, entry.getValue(), titleFormat));}// 设置正文内容for (int i = 0; i < listContent.size(); i++){Iterator contentIter = keyMap.entrySet().iterator();int colIndex = 0;int listIndex = 0;while (contentIter.hasNext()){Map.Entry<String, String> entry = (Map.Entry<String, String>) contentIter.next();Object key = entry.getKey();Field field = listContent.get(i).getClass().getDeclaredField(key.toString());field.setAccessible(true);Object content = field.get(listContent.get(i));String contentStr = null != content ? content.toString() : "";WritableCellFormat cellFormat = contentCenterFormat;// 将数字转变成千分位格式String numberStr = getNumbericValue(contentStr);// numberStr不为空,说明是数字类型。if (null != numberStr && !numberStr.trim().equals("")){contentStr = numberStr;// 数字要右对齐cellFormat = contentRightFormat;}else{// 如果是时间类型。要格式化成标准时间格式String timeStr = getTimeFormatValue(field, content);// timeStr不为空,说明是时间类型if (null != timeStr && !timeStr.trim().equals("")){contentStr = timeStr;}}sheet.addCell(new Label(colIndex++, i + 1, contentStr, cellFormat));}}// 宽度自适应。能够根据内容增加宽度,但对中文的支持不好,如果内容中包含中文,会有部分内容被遮盖for (int i = 0; i < keyMap.size(); i++){CellView cell = sheet.getColumnView(i);cell.setAutosize(true);sheet.setColumnView(i, cell);}workbook.write();workbook.close();}catch (Exception e){rs = RESULT_FAIL;e.printStackTrace();}return rs;};/** * 获取格式化后的时间串 * * @param field * @param content * @return */private String getTimeFormatValue(Field field, Object content){String timeFormatVal = "";if (field.getType().getName().equals(java.sql.Timestamp.class.getName())){Timestamp time = (Timestamp) content;timeFormatVal = longTimeTypeToStr(time.getTime(), TYPE_YYYY_MM_DD_HH_MM_SS);}else if (field.getType().getName().equals(java.util.Date.class.getName())){Date time = (Date) content;timeFormatVal = longTimeTypeToStr(time.getTime(), TYPE_YYYY_MM_DD_HH_MM_SS);}return timeFormatVal;}/** * 获取千分位数字 * * @param str * @return */private String getNumbericValue(String str){String numbericVal = "";try{Double doubleVal = Double.valueOf(str);numbericVal = DecimalFormat.getNumberInstance().format(doubleVal);}catch (NumberFormatException e){// if exception, not format}return numbericVal;}/** * 格式化时间 * * @param time * @param formatType * @return */public String longTimeTypeToStr(long time, String formatType){String strTime = "";if (time >= 0){SimpleDateFormat sDateFormat = new SimpleDateFormat(formatType);strTime = sDateFormat.format(new Date(time));}return strTime;}public static class TestBean{private String strTest;private int intTest;private Timestamp timeTest;public String getStrTest(){return strTest;}public void setStrTest(String strTest){this.strTest = strTest;}public int getIntTest(){return intTest;}public void setIntTest(int intTest){this.intTest = intTest;}public Timestamp getTimeTest(){return timeTest;}public void setTimeTest(Timestamp timeTest){this.timeTest = timeTest;}}public static void main(String[] args){long start = System.currentTimeMillis();List<Object> li = new ArrayList<Object>();TestBean testBean = new TestBean();testBean.setIntTest(8888);testBean.setStrTest("88888.888");testBean.setTimeTest(new Timestamp(System.currentTimeMillis()));for (int i = 0; i < 1000; i++){li.add(testBean);}LinkedHashMap<String, String> keyMap = new LinkedHashMap<String, String>();keyMap.put("timeTest", "time类型");keyMap.put("intTest", "int类型");keyMap.put("strTest", "string类型");OutputStream out;try{ExportExcelUtil util = new ExportExcelUtil();out = new FileOutputStream("d:/exportExcel/test28.xls");util.export(keyMap, li, out);}catch (FileNotFoundException e){e.printStackTrace();}long end = System.currentTimeMillis();System.out.println(end - start);}}
0 0
- 导出excel功能,较通用的一种实现
- 一种简单方法实现页面导出(Excel)功能
- 一种简单方法实现页面导出(Excel)功能 选择自 xieyun1977 的 Blog
- 使用反射机制的通用导入导出excel功能demo
- Java 的Excel 导出功能的实现
- Excel的导入导出功能实现
- Excel的导入和导出功能实现
- javaEE实现简单的导出excel功能
- 结合struts2实现的通用导出excel实现详细介绍
- 使用反射实现通用的POI导出Excel
- poi实现超简单的通用excel导出
- javaEE excel导出功能实现
- EXCEL导出功能实现参考
- Java 实现导出Excel功能
- java实现导出excel功能
- 能实现一对多关联的通用EXCEL导入功能
- 通过注解实现通用导出Excel
- 通过注解实现通用导出Excel
- android进行网络连接时出现服务器拒绝访问的可能解决法
- unity3D中常用的几种系统自调用的重要方法
- Chromium开源项目的代码统计
- cf404D Minesweeper 1D 状态转移dp
- dex relate files
- 导出excel功能,较通用的一种实现
- 黑马程序员 Java基础之IO流<一>File类及递归
- 重温数据结构:哈希表,MyHashMap与MyHashSet的Java实现
- UI 血条批次优化
- session 与 cookie
- AAM与ASM的区别
- NGUI--怎么控制Input中的输入的字符长度和类型
- PL/SQL触发器3(使用DML触发器)
- Android的七巧板Activity之二 Activity的加载模式