jxl 导出excle整理

来源:互联网 发布:老人去世6年无人知 编辑:程序博客网 时间:2024/06/16 19:52

注意:ajax 返回类型没有excle 如使用ajax需要特殊处理或者有更好的方法希望大家教教我这个菜鸟

1.js代码

location.href ="waterExcle?selectVal="+selectVal+"&queryCondition="+areaInfo.queryCondition;

2.后台代码(个人的一个serverlet 可以参考)

public class WaterExcle extends HttpServlet implements javax.servlet.Servlet{/** * 序列号 */private static final long serialVersionUID = 1L;/** * 导出excle * @param req * @param resp * @throws ExcelException  */@SuppressWarnings("unchecked")protected void exportExcel(HttpServletRequest req, HttpServletResponse resp) throws ExcelException{String selectVal = req.getParameter("selectVal");String queryCondition = req.getParameter("queryCondition");String hql = "";if("day".equals(selectVal)){hql = "select new map(_t1.hid as hid,_t2.buildName as buildName,_t3.unitNO as unitNO,"+ "_t3.doorNO as doorNO,_t1.meterId as meterId,sum(_t1.waterFlow) as waterFlow,"+ "date_format(_t1.createDate,'%Y-%m-%d') as createDate,_t1.createUser as createUser) "+ "from TWaterTotal _t1,TBuild _t2,TRoom _t3 "+ "where _t1.buildId=_t2.hid and _t1.roomId=_t3.hid and " + queryCondition+ " group by _t1.buildId,_t1.createDate"+ " order by _t1.createDate";}if("month".equals(selectVal)){ hql = "select new map(_t1.hid as hid,_t2.buildName as buildName,_t3.unitNO as unitNO,"+ "_t3.doorNO as doorNO,_t1.meterId as meterId,sum(_t1.waterFlow) as waterFlow,"+ "date_format(_t1.createDate,'%Y-%m') as createDate,_t1.createUser as createUser) "+ "from TWaterTotal _t1,TBuild _t2,TRoom _t3 "+ "where _t1.buildId=_t2.hid and _t1.roomId=_t3.hid and " + queryCondition+ " group by _t1.buildId,date_format(_t1.createDate,'%Y-%m')"+ " order by _t1.createDate";}@SuppressWarnings("rawtypes")List list = findListForGroup(hql,req,resp);LinkedHashMap<String, String> fieldMap = new LinkedHashMap<String,String>();fieldMap.put("hid", "hid");fieldMap.put("buildName", "楼名");fieldMap.put("unitNO", "单元号");fieldMap.put("doorNO", "门牌号");fieldMap.put("meterId", "设备号");fieldMap.put("waterFlow", "用水量");fieldMap.put("createDate", "统计时间");fieldMap.put("createUser", "统计人");String sheetName = "每天用水量统计(按楼)";ExcelUtil.listToExcel(list, fieldMap, sheetName, resp);}@SuppressWarnings("rawtypes")private List findListForGroup(final String hql,HttpServletRequest req, HttpServletResponse resp){ServletContext sc = req.getSession().getServletContext();ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(sc);SessionFactory sessionFactory=(SessionFactory) ac.getBean("sessionFactory");HibernateTemplate hibernateTemplate=new HibernateTemplate(sessionFactory);List list = hibernateTemplate.executeFind(new HibernateCallback(){public Object doInHibernate(Session session)throws HibernateException,SQLException {    Query query = session.createQuery(hql);//创建SESSION    List list = query.list();    return list;//返回值}});return list;}protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {try {exportExcel(req, resp);} catch (ExcelException e) {e.printStackTrace();}}protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {try {exportExcel(req, resp);} catch (ExcelException e) {e.printStackTrace();}}}

3.excleUtil 工具类

package com.pul.energy.excle;import java.io.InputStream;import java.io.OutputStream;import java.lang.reflect.Field;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Arrays;import java.util.Date;import java.util.HashMap;import java.util.LinkedHashMap;import java.util.List;import java.util.Map.Entry;import javax.servlet.http.HttpServletResponse;import jxl.Cell;import jxl.Sheet;import jxl.Workbook;import jxl.write.Label;import jxl.write.WritableSheet;import jxl.write.WritableWorkbook;/** * 导入导出Excel工具类 * @author 魏东 * 2015年10月14日 上午10:05:37 */public class ExcelUtil {/** * 导出Excel(可以导出到本地文件系统,也可以导出到浏览器,可自定义工作表大小) * * @param list *            数据源 * @param fieldMap *            类的英文属性和Excel中的中文列名的对应关系,如果需要的是引用对象的属性,则英文属性使用类似于EL表达式的格式,如: *            list中存放的都是student *            ,student中又有college属性,而我们需要学院名称,则可以这样写,fieldMap *            .put("college.collegeName","学院名称") * @param sheetName *            工作表的名称 * @param sheetSize *            每个工作表中记录的最大个数 * @param out *            导出流 * @throws ExcelException *             异常 */public static <T> void listToExcel(List<T> list,LinkedHashMap<String, String> fieldMap, String sheetName,int sheetSize, OutputStream out) throws ExcelException {if (list == null || list.size() == 0) {throw new ExcelException("数据源中没有任何数据");}if (sheetSize > 65535 || sheetSize < 1) {sheetSize = 65535;}// 创建工作簿并发送到OutputStream指定的地方WritableWorkbook wwb;try {wwb = Workbook.createWorkbook(out);// 因为2003的Excel一个工作表最多可以有65536条记录,除去列头剩下65535条// 所以如果记录太多,需要放到多个工作表中,其实就是个分页的过程// 1.计算一共有多少个工作表double sheetNum = Math.ceil(list.size()/ new Integer(sheetSize).doubleValue());// 2.创建相应的工作表,并向其中填充数据for (int i = 0; i < sheetNum; i++) {// 如果只有一个工作表的情况if (1 == sheetNum) {WritableSheet sheet = wwb.createSheet(sheetName, i);fillSheet(sheet, list, fieldMap, 0, list.size() - 1);// 有多个工作表的情况} else {WritableSheet sheet = wwb.createSheet(sheetName + (i + 1),i);// 获取开始索引和结束索引int firstIndex = i * sheetSize;int lastIndex = (i + 1) * sheetSize - 1 > list.size() - 1 ? list.size() - 1 : (i + 1) * sheetSize - 1;// 填充工作表fillSheet(sheet, list, fieldMap, firstIndex, lastIndex);}}wwb.write();wwb.close();} catch (Exception e) {e.printStackTrace();// 如果是ExcelException,则直接抛出if (e instanceof ExcelException) {throw (ExcelException) e;// 否则将其它异常包装成ExcelException再抛出} else {throw new ExcelException("导出Excel失败");}}}/** * 导出excel * * @param list *            数据源 * @param fieldMap *            类的英文属性和Excel中的中文列名的对应关系 * @param collectionName *            子集合的名称 * @param title *            标题 * @param content *            内容 * @param sheetName *            工作表的名称 * @param sheetSize *            每个工作表中记录的最大个数 * @param out *            导出流 * @throws ExcelException *             异常 */public static <T> void listToExcel(List<T> list,LinkedHashMap<String, String> fieldMap, String collectionName,String title, String content, String sheetName, int sheetSize,OutputStream out) throws ExcelException {if (list == null || list.size() == 0) {throw new ExcelException("数据源中没有任何数据");}if (sheetSize > 65535 || sheetSize < 1) {sheetSize = 65535;}// 创建工作簿并发送到OutputStream指定的地方WritableWorkbook wwb;try {wwb = Workbook.createWorkbook(out);// 因为2003的Excel一个工作表最多可以有65536条记录,除去列头剩下65535条// 所以如果记录太多,需要放到多个工作表中,其实就是个分页的过程// 1.计算一共有多少个工作表double sheetNum = Math.ceil(list.size()/ new Integer(sheetSize).doubleValue());// 2.创建相应的工作表,并向其中填充数据for (int i = 0; i < sheetNum; i++) {// 如果只有一个工作表的情况if (1 == sheetNum) {WritableSheet sheet = wwb.createSheet(sheetName, i);fillSheet(sheet, list, fieldMap, collectionName, title,content, 0, list.size() - 1);// 有多个工作表的情况} else {WritableSheet sheet = wwb.createSheet(sheetName + (i + 1),i);// 获取开始索引和结束索引int firstIndex = i * sheetSize;int lastIndex = (i + 1) * sheetSize - 1 > list.size() - 1 ? list.size() - 1 : (i + 1) * sheetSize - 1;// 填充工作表fillSheet(sheet, list, fieldMap, collectionName, title,content, firstIndex, lastIndex);}}wwb.write();wwb.close();} catch (Exception e) {e.printStackTrace();// 如果是ExcelException,则直接抛出if (e instanceof ExcelException) {throw (ExcelException) e;// 否则将其它异常包装成ExcelException再抛出} else {throw new ExcelException("导出Excel失败");}}}/** * 导出excel * * @param list *            数据源 * @param fieldMap *            类的英文属性和Excel中的中文列名的对应关系 * @param sheetName *            工作表的名称 * @param out *            导出流 * @throws ExcelException *             异常 */public static <T> void listToExcel(List<T> list,LinkedHashMap<String, String> fieldMap, String sheetName,OutputStream out) throws ExcelException {listToExcel(list, fieldMap, sheetName, 65535, out);}/** * 导出Excel(导出到浏览器,可以自定义工作表的大小) * * @param list *            数据源 * @param fieldMap *            类的英文属性和Excel中的中文列名的对应关系 * @param sheetName *            工作表的名称 * @param sheetSize *            每个工作表中记录的最大个数 * @param response *            使用response可以导出到浏览器 * @param fileName *            Excel的文件名 * @throws ExcelException *             异常 */public static <T> void listToExcel(List<T> list,LinkedHashMap<String, String> fieldMap, String sheetName,int sheetSize, HttpServletResponse response, String fileName)throws ExcelException {// 如果文件名没提供,则使用时间戳if (fileName == null || fileName.trim().equals("")) {// 设置默认文件名为当前时间:年月日时分秒fileName = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()).toString();}// 设置response头信息response.reset();response.setContentType("application/vnd.ms-excel"); // 改成输出excel文件response.setHeader("Content-disposition", "attachment; filename="+ fileName + ".xls");// 创建工作簿并发送到浏览器try {OutputStream out = response.getOutputStream();listToExcel(list, fieldMap, sheetName, sheetSize, out);} catch (Exception e) {e.printStackTrace();// 如果是ExcelException,则直接抛出if (e instanceof ExcelException) {throw (ExcelException) e;// 否则将其它异常包装成ExcelException再抛出} else {throw new ExcelException("导出Excel失败");}}}/** * 导出Excel(导出到浏览器,可以自定义工作表的大小) * * @param list *            数据源 * @param fieldMap *            类的英文属性和Excel中的中文列名的对应关系 * @param collectionName * @param title *            标题 * @param content *            内容 * @param sheetName *            工作表的名称 * @param sheetSize *            每个工作表中记录的最大个数 * @param response *            使用response可以导出到浏览器 * @param fileName *            Excel的文件名 * @throws ExcelException *             异常 */public static <T> void listToExcel(List<T> list,LinkedHashMap<String, String> fieldMap, String collectionName,String title, String content, String sheetName, int sheetSize,HttpServletResponse response, String fileName)throws ExcelException {// 如果文件名没提供,则使用时间戳if (fileName == null || fileName.trim().equals("")) {// 设置默认文件名为当前时间:年月日时分秒fileName = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()).toString();}// 设置response头信息response.reset();response.setContentType("application/vnd.ms-excel"); // 改成输出excel文件response.setHeader("Content-disposition", "attachment; filename="+ fileName + ".xls");// 创建工作簿并发送到浏览器try {OutputStream out = response.getOutputStream();listToExcel(list, fieldMap, collectionName, title, content,sheetName, sheetSize, out);} catch (Exception e) {e.printStackTrace();// 如果是ExcelException,则直接抛出if (e instanceof ExcelException) {throw (ExcelException) e;// 否则将其它异常包装成ExcelException再抛出} else {throw new ExcelException("导出Excel失败");}}}/** * 导出Excel(导出到浏览器,可以自定义工作表的大小) * * @param list *            数据源 * @param fieldMap *            类的英文属性和Excel中的中文列名的对应关系 * @param sheetName *            工作表的名称 * @param sheetSize *            每个工作表中记录的最大个数 * @param response *            使用response可以导出到浏览器 * @throws ExcelException *             异常 */public static <T> void listToExcel(List<T> list,LinkedHashMap<String, String> fieldMap, String sheetName,int sheetSize, HttpServletResponse response) throws ExcelException {// 设置默认文件名为当前时间:年月日时分秒String fileName = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()).toString();listToExcel(list, fieldMap, sheetName, sheetSize, response, fileName);}/** * 导出Excel(导出到浏览器,可以自定义工作表的大小) * * @param list *            数据源 * @param fieldMap *            类的英文属性和Excel中的中文列名的对应关系 * @param collectionName * @param title *            标题 * @param content *            内容 * @param sheetName *            工作表的名称 * @param response *            使用response可以导出到浏览器 * @throws ExcelException *             异常 */public static <T> void listToExcel(List<T> list,LinkedHashMap<String, String> fieldMap, String collectionName,String title, String content, String sheetName,HttpServletResponse response) throws ExcelException {listToExcel(list, fieldMap, collectionName, title, content, sheetName,65535, response, "");}/** * 导出Excel(导出到浏览器,可以自定义工作表的大小) * * @param list *            数据源 * @param fieldMap *            类的英文属性和Excel中的中文列名的对应关系 * @param sheetName *            工作表的名称 * @param response *            使用response可以导出到浏览器 * @throws ExcelException *             异常 */public static <T> void listToExcel(List<T> list,LinkedHashMap<String, String> fieldMap, String sheetName,HttpServletResponse response) throws ExcelException {listToExcel(list, fieldMap, sheetName, 65535, response);}/** * 导出Excel模板 考试专用(导出到浏览器,可以自定义工作表的大小) * * @param fieldMap *            类的英文属性和Excel中的中文列名的对应关系 * @param sheetName *            工作表的名称 * @param response *            使用response可以导出到浏览器 * @throws ExcelException *             异常 */public static <T> void leadToExcelQuestionBankTemplet(LinkedHashMap<String, String> fieldMap, String sheetName,HttpServletResponse response) throws ExcelException {// 设置默认文件名为当前时间:年月日时分秒String fileName = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()).toString();// 如果文件名没提供,则使用时间戳if (fileName == null || fileName.trim().equals("")) {// 设置默认文件名为当前时间:年月日时分秒fileName = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()).toString();}// 设置response头信息response.reset();response.setContentType("application/vnd.ms-excel"); // 改成输出excel文件response.setHeader("Content-disposition", "attachment; filename="+ fileName + ".xls");// 创建工作簿并发送到浏览器try {OutputStream out = response.getOutputStream(); @SuppressWarnings("unused")int sheetSize = 65535;// 创建工作簿并发送到OutputStream指定的地方WritableWorkbook wwb;try {wwb = Workbook.createWorkbook(out);// 因为2003的Excel一个工作表最多可以有65536条记录,除去列头剩下65535条// 所以如果记录太多,需要放到多个工作表中,其实就是个分页的过程// 1.计算一共有多少个工作表//double sheetNum = Math.ceil(list.size()/// new Integer(sheetSize).doubleValue());double sheetNum=1;// 2.创建相应的工作表,并向其中填充数据// 如果只有一个工作表的情况if (1 == sheetNum) {WritableSheet sheet = wwb.createSheet(sheetName, 1);// 定义存放英文字段名和中文字段名的数组String[] enFields = new String[fieldMap.size()];String[] cnFields = new String[fieldMap.size()];// 填充数组int count = 0;for (Entry<String, String> entry : fieldMap.entrySet()) {enFields[count] = entry.getKey();cnFields[count] = entry.getValue();count++;}// 填充表头for (int i = 0; i < cnFields.length; i++) {Label label = new Label(i, 0, cnFields[i]);sheet.addCell(label);}// 设置自动列宽setColumnAutoSize(sheet, 5);} wwb.write();wwb.close();} catch (Exception e) {e.printStackTrace();// 如果是ExcelException,则直接抛出if (e instanceof ExcelException) {throw (ExcelException) e;// 否则将其它异常包装成ExcelException再抛出} else {throw new ExcelException("导出Excel失败");}}} catch (Exception e) {e.printStackTrace();// 如果是ExcelException,则直接抛出if (e instanceof ExcelException) {throw (ExcelException) e;// 否则将其它异常包装成ExcelException再抛出} else {throw new ExcelException("导出Excel失败");}}}/** * 将Excel转化为List * * @param in *            :承载着Excel的输入流 * @param sheetIndex *            :要导入的工作表序号 * @param entityClass *            :List中对象的类型(Excel中的每一行都要转化为该类型的对象) * @param fieldMap *            :Excel中的中文列头和类的英文属性的对应关系Map * @param uniqueFields *            :指定业务主键组合(即复合主键),这些列的组合不能重复 * @return list集合 * @throws ExcelException *             异常 */public static <T> List<T> excelToList(InputStream in, String sheetName,Class<T> entityClass, LinkedHashMap<String, String> fieldMap,String[] uniqueFields) throws ExcelException {// 定义要返回的listList<T> resultList = new ArrayList<T>();try {// 根据Excel数据源创建WorkBookWorkbook wb = Workbook.getWorkbook(in);// 获取工作表Sheet sheet = wb.getSheet(sheetName);// 获取工作表的有效行数int realRows = 0;for (int i = 0; i < sheet.getRows(); i++) {int nullCols = 0;for (int j = 0; j < sheet.getColumns(); j++) {Cell currentCell = sheet.getCell(j, i);if (currentCell == null|| "".equals(currentCell.getContents().toString())) {nullCols++;}}if (nullCols == sheet.getColumns()) {break;} else {realRows++;}}// 如果Excel中没有数据则提示错误if (realRows <= 1) {throw new ExcelException("Excel文件中没有任何数据");}Cell[] firstRow = sheet.getRow(0);String[] excelFieldNames = new String[firstRow.length];// 获取Excel中的列名for (int i = 0; i < firstRow.length; i++) {excelFieldNames[i] = firstRow[i].getContents().toString().trim();}// 判断需要的字段在Excel中是否都存在boolean isExist = true;List<String> excelFieldList = Arrays.asList(excelFieldNames);for (String cnName : fieldMap.keySet()) {if (!excelFieldList.contains(cnName)) {isExist = false;break;}}// 如果有列名不存在,则抛出异常,提示错误if (!isExist) {throw new ExcelException("Excel中缺少必要的字段,或字段名称有误");}// 将列名和列号放入Map中,这样通过列名就可以拿到列号LinkedHashMap<String, Integer> colMap = new LinkedHashMap<String, Integer>();for (int i = 0; i < excelFieldNames.length; i++) {colMap.put(excelFieldNames[i], firstRow[i].getColumn());}// 判断是否有重复行// 1.获取uniqueFields指定的列Cell[][] uniqueCells = new Cell[uniqueFields.length][];for (int i = 0; i < uniqueFields.length; i++) {int col = colMap.get(uniqueFields[i]);uniqueCells[i] = sheet.getColumn(col);}// 2.从指定列中寻找重复行for (int i = 1; i < realRows; i++) {int nullCols = 0;for (int j = 0; j < uniqueFields.length; j++) {String currentContent = uniqueCells[j][i].getContents();Cell sameCell = sheet.findCell(currentContent,uniqueCells[j][i].getColumn(),uniqueCells[j][i].getRow() + 1,uniqueCells[j][i].getColumn(),uniqueCells[j][realRows - 1].getRow(), true);if (sameCell != null) {nullCols++;}}if (nullCols == uniqueFields.length) {throw new ExcelException("Excel中有重复行,请检查");}}// 将sheet转换为listfor (int i = 1; i < realRows; i++) {// 新建要转换的对象T entity = entityClass.newInstance();// 给对象中的字段赋值for (Entry<String, String> entry : fieldMap.entrySet()) {// 获取中文字段名String cnNormalName = entry.getKey();// 获取英文字段名String enNormalName = entry.getValue();// 根据中文字段名获取列号int col = colMap.get(cnNormalName);// 获取当前单元格中的内容String content = sheet.getCell(col, i).getContents().toString().trim();// 给对象赋值setFieldValueByName(enNormalName, content, entity);}resultList.add(entity);}} catch (Exception e) {e.printStackTrace();// 如果是ExcelException,则直接抛出if (e instanceof ExcelException) {throw (ExcelException) e;// 否则将其它异常包装成ExcelException再抛出} else {e.printStackTrace();throw new ExcelException("导入Excel失败");}}return resultList;}/** * 根据字段名获取字段值 * * @param fieldName *            字段名 * @param o *            对象 * @return 字段值 * @throws Exception *             异常 */public static Object getFieldValueByName(String fieldName, Object o)throws Exception {Object value = null;Field field = getFieldByName(fieldName, o.getClass());if (field != null) {field.setAccessible(true);value = field.get(o);} else {throw new ExcelException(o.getClass().getSimpleName() + "类不存在字段名 "+ fieldName);}return value;}/** * 根据字段名获取字段 * * @param fieldName *            字段名 * @param clazz *            包含该字段的类 * @return 字段 */public static Field getFieldByName(String fieldName, Class<?> clazz) {// 拿到本类的所有字段Field[] selfFields = clazz.getDeclaredFields();// 如果本类中存在该字段,则返回for (Field field : selfFields) {if (field.getName().equals(fieldName)) {return field;}}// 否则,查看父类中是否存在此字段,如果有则返回Class<?> superClazz = clazz.getSuperclass();if (superClazz != null && superClazz != Object.class) {return getFieldByName(fieldName, superClazz);}// 如果本类和父类都没有,则返回空return null;}/** * 根据实体拿到该实体的所有属性 * * @param clazz 实体 * @return 返回属性的list集合 */@SuppressWarnings({ "rawtypes", "unchecked" })public static List getFieldByClass( Class<?> clazz) {List list = new ArrayList();// 拿到本类的所有字段Field[] selfFields = clazz.getDeclaredFields();for (Field field : selfFields) {list.add(field.getName());}// 否则,查看父类中是否存在此字段,如果有则返回Class<?> superClazz = clazz.getSuperclass();Field[] superFields=superClazz.getDeclaredFields();for (Field field : superFields) {list.add(field.getName());}// 如果本类和父类都没有,则返回空return list;}/** * 根据实体拿到该实体的所有属性 * * @param clazz 实体 * @return 返回属性的list集合 */@SuppressWarnings({ "unchecked", "rawtypes" })public static List getSuperClassFieldByClass( Class<?> clazz) {List list = new ArrayList();// 否则,查看父类中是否存在此字段,如果有则返回Class<?> superClazz = clazz.getSuperclass();Field[] superFields=superClazz.getDeclaredFields();for (Field field : superFields) {list.add(field.getName());}// 如果父类没有,则返回空return list;}/** * 根据带路径或不带路径的属性名获取属性值,即接受简单属性名,如userName等,又接受带路径的属性名,如student.department. * name等 * * @param fieldNameSequence *            带路径的属性名或简单属性名 * @param o *            对象 * @return 属性值 * @throws Exception *             异常 */public static Object getFieldValueByNameSequence(String fieldNameSequence,Object o) throws Exception {Object value = null;// 将fieldNameSequence进行拆分String[] attributes = fieldNameSequence.split("\\.");if (attributes.length == 1) {value = getFieldValueByName(fieldNameSequence, o);} else {// 根据属性名获取属性对象Object fieldObj = getFieldValueByName(attributes[0], o);String subFieldNameSequence = fieldNameSequence.substring(fieldNameSequence.indexOf(".") + 1);value = getFieldValueByNameSequence(subFieldNameSequence, fieldObj);}return value;}/** * 根据字段名给对象的字段赋值 * * @param fieldName *            字段名 * @param fieldValue *            字段值 * @param o *            对象 * @throws Exception *             异常 */public static void setFieldValueByName(String fieldName,Object fieldValue, Object o) throws Exception {Field field = getFieldByName(fieldName, o.getClass());if (field != null) {field.setAccessible(true);// 获取字段类型Class<?> fieldType = field.getType();// 根据字段类型给字段赋值if (String.class == fieldType) {field.set(o, String.valueOf(fieldValue));} else if ((Integer.TYPE == fieldType)|| (Integer.class == fieldType)) {field.set(o, Integer.parseInt(fieldValue.toString()));} else if ((Long.TYPE == fieldType) || (Long.class == fieldType)) {field.set(o, Long.valueOf(fieldValue.toString()));} else if ((Float.TYPE == fieldType) || (Float.class == fieldType)) {field.set(o, Float.valueOf(fieldValue.toString()));} else if ((Short.TYPE == fieldType) || (Short.class == fieldType)) {field.set(o, Short.valueOf(fieldValue.toString()));} else if ((Double.TYPE == fieldType)|| (Double.class == fieldType)) {field.set(o, Double.valueOf(fieldValue.toString()));} else if (Character.TYPE == fieldType) {if ((fieldValue != null)&& (fieldValue.toString().length() > 0)) {field.set(o,Character.valueOf(fieldValue.toString().charAt(0)));}} else if (Date.class == fieldType) {field.set(o, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(fieldValue.toString()));} else {field.set(o, fieldValue);}} else {throw new ExcelException(o.getClass().getSimpleName() + "类不存在字段名 "+ fieldName);}}/** * 设置工作表自动列宽和首行加粗 * * @param ws *            要设置格式的工作表 * @param extraWith *            额外的宽度 */public static void setColumnAutoSize(WritableSheet ws, int extraWith) {// 获取本列的最宽单元格的宽度for (int i = 0; i < ws.getColumns(); i++) {int colWith = 0;for (int j = 0; j < ws.getRows(); j++) {String content = ws.getCell(i, j).getContents().toString();int cellWith = content.length();if (colWith < cellWith) {colWith = cellWith;}}// 设置单元格的宽度为最宽宽度+额外宽度ws.setColumnView(i, colWith + extraWith);}}/** * 向工作表中填充数据 * * @param sheet *            工作表名称 * @param list *            数据源 * @param fieldMap *            中英文字段对应关系的Map * @param firstIndex *            开始索引 * @param lastIndex *            结束索引 * @throws Exception *             异常 */public static <T> void fillSheet(WritableSheet sheet, List<T> list,LinkedHashMap<String, String> fieldMap, int firstIndex,int lastIndex) throws Exception {// 定义存放英文字段名和中文字段名的数组String[] enFields = new String[fieldMap.size()];String[] cnFields = new String[fieldMap.size()];// 填充数组int count = 0;for (Entry<String, String> entry : fieldMap.entrySet()) {enFields[count] = entry.getKey();cnFields[count] = entry.getValue();count++;}// 填充表头for (int i = 0; i < cnFields.length; i++) {Label label = new Label(i, 0, cnFields[i]);sheet.addCell(label);}// 填充内容int rowNo = 1;for (int index = firstIndex; index <= lastIndex; index++) {// 获取单个对象@SuppressWarnings("rawtypes")HashMap map = (HashMap)list.get(index);for (int i = 0; i < enFields.length; i++) {Object objValue = map.get(enFields[i]);String fieldValue = objValue == null ? "" : objValue.toString();Label label = new Label(i, rowNo, fieldValue);sheet.addCell(label);}//自动查找实体字段//T item = list.get(index);//System.out.println("list.get(index)的值是-"+item);//for (int i = 0; i < enFields.length; i++) {//Object objValue = getFieldValueByNameSequence(enFields[i], item);//System.out.println("看看这个是啥"+objValue);//String fieldValue = objValue == null ? "" : objValue.toString();//Label label = new Label(i, rowNo, fieldValue);//sheet.addCell(label);//}rowNo++;}// 设置自动列宽setColumnAutoSize(sheet, 5);}/** * 向工作表中填充数据 * * @param sheet * @param list *            数据源 * @param normalFieldMap *            普通中英文字段对应关系的Map * @param collectionFieldMap *            集合類中英文字段对应关系的Map * @param title *            标题 * @param content *            内容 * @param firstIndex *            开始索引 * @param lastIndex *            结束索引 * @throws Exception */@SuppressWarnings("rawtypes")public static <T> void fillSheet(WritableSheet sheet, List<T> list,LinkedHashMap<String, String> normalFieldMap,String collectionFieldName, String title, String content,int firstIndex, int lastIndex) throws Exception {// 定义存放普通英文字段名和中文字段名的数组String[] enFields = new String[normalFieldMap.size()];String[] cnFields = new String[normalFieldMap.size()];// 填充普通字段数组int count = 0;for (Entry<String, String> entry : normalFieldMap.entrySet()) {enFields[count] = entry.getKey();cnFields[count] = entry.getValue();count++;}// 填充表头(普通字段)for (int i = 0; i < cnFields.length; i++) {Label label = new Label(i, 0, cnFields[i]);sheet.addCell(label);}// 填充表头(行转列字段)T firstItem = list.get(0);List childList = (List) getFieldValueByName(collectionFieldName,firstItem);int colCount = cnFields.length;for (Object obj : childList) {Object objValue = getFieldValueByNameSequence(title, obj);String fieldValue = objValue == null ? "" : objValue.toString();Label label = new Label(colCount, 0, fieldValue);sheet.addCell(label);colCount++;}// 填充内容int rowNo = 1;for (int index = firstIndex; index <= lastIndex; index++) {// 获取单个对象T item = list.get(index);// 填充普通字段內容for (int i = 0; i < enFields.length; i++) {Object objValue = getFieldValueByNameSequence(enFields[i], item);String fieldValue = objValue == null ? "" : objValue.toString();Label label = new Label(i, rowNo, fieldValue);sheet.addCell(label);}// 填充集合字段內容if (collectionFieldName != null && !collectionFieldName.equals("")) {// 拿到集合对象List currentList = (List) getFieldValueByName(collectionFieldName, item);// 将集合对象行转列for (int i = 0; i < currentList.size(); i++) {Object objValue = getFieldValueByNameSequence(content,currentList.get(i));String fieldValue = objValue == null ? "" : objValue.toString();Label label = new Label(i + cnFields.length, rowNo,fieldValue);sheet.addCell(label);}}rowNo++;}// 设置自动列宽setColumnAutoSize(sheet, 5);}}

4.导出异常类

public class ExcelException  extends Exception{/** * 序列号 */private static final long serialVersionUID = 1L;//构造函数1public ExcelException() {      }    //构造函数2    public ExcelException(String message) {            super(message);     }        //构造函数3    public ExcelException(Throwable cause) {             super(cause);     }        //构造函数4    public ExcelException(String message, Throwable cause) {          super(message, cause);      } }



0 0
原创粉丝点击