工作中导入excel每次都要重写会不会很麻烦?
答案是肯定的。今天写了一个稍微通用一点的excel导出工具类,如果大家看了觉得还蛮好用,或是有什么问题,记得给我留言。
package com.system.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.text.DecimalFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.time.DateUtils; import org.apache.log4j.Logger; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFDataFormat; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.OfficeXmlFileException; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import com.pkg.controller.form.Pojo; /*** * * @作者 Dick * @创建时间 2015年9月6日 下午3:39:36 * @TODO excel导入的工具类 * @修改备注 * * */ /*** * * @作者 Dick * @创建时间 2015年9月6日 下午5:25:13 * @TODO * excel导出工具类, * 需要poi支持 * * @修改备注 * * */ public class ImportExcelUtil { private static Logger log = Logger.getLogger(ImportExcelUtil.class); /*** * 日期格式化类型 * * */ private static String[] dateFormats = new String[]{"yyyy-MM","yyyyMM","yyyy/MM", "yyyyMMdd","yyyy-MM-dd","yyyy/MM/dd", "yyyyMMddHHmmss", "yyyy-MM-dd HH:mm:ss", "yyyy/MM/dd HH:mm:ss"}; /*** * * @作者 Dick * @创建时间 2015年9月6日 下午3:08:50 * @param @param file * @param @param clazz * @param @param field 格式: excel列名=实体属性名 * @param @return * @TODO 读取excel文件的内容。读取失败时返回 null; * * @修改备注 * * */ public static List getExcelContent(File file, Class clazz, Map<String, Object> fields) { FileInputStream io = null;//poi会在结束时自动关闭流 try { io = new FileInputStream(file); return getExcelContent(io, clazz, fields); } catch (FileNotFoundException e) { log.info("导入excel失败,文件不存在"); log.error(e.getMessage(),e); } catch(OfficeXmlFileException e){ log.error("excel属于Office 2007+ XML,因此采用xlsx读取."); //如果是2007以上的excel,在catch中处理 try { io = new FileInputStream(file); //xlsx结尾的excel。 return getExcelContentXlsx(io, clazz, fields); } catch (FileNotFoundException e1) { log.error(e1.getMessage(),e1); } } return null; } /**** * * @作者 Dick * @创建时间 2015年9月6日 下午3:37:00 * @param @param io * @param @param clazz * @param @param fields 格式: excel列名=实体属性名 * @param * @return * @TODO 只能读取*.xls的excel文件流中的内容, 读取失败时返回 null; * @修改备注 * * */ public static List getExcelContent(InputStream io, Class clazz, Map<String, Object> fields) { HSSFWorkbook workbook = null; HSSFSheet sheet = null; List<Object> results =null; try { workbook = new HSSFWorkbook(io); for (Iterator iterator = fields.keySet().iterator(); iterator .hasNext();) { String key = iterator.next().toString(); String prop = fields.get(key).toString(); fields.put(key, clazz.getDeclaredField(prop)); } results=new ArrayList<Object>(); sheet = workbook.getSheetAt(0); // 标题总列数 int maxRow = sheet.getLastRowNum(); List<String> columns = new ArrayList<String>(); for (int j = 0; j < sheet.getRow(0).getLastCellNum(); j++) { columns.add(sheet.getRow(0).getCell(j).getStringCellValue() .trim()); } for (int j = 1; j < maxRow; j++) { HSSFRow row = sheet.getRow(j); if (null != row) { Object obj = Class.forName(clazz.getName()).newInstance(); for (int k = 0; k < row.getLastCellNum(); k++) { HSSFCell cell = row.getCell(k); Object value = null; if (null != cell) { switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_NUMERIC: // 数字 // 日期格式处理 if (HSSFDateUtil.isCellDateFormatted(cell)) { if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式 SimpleDateFormat sdf = null; if (cell.getCellStyle().getDataFormat() == HSSFDataFormat .getBuiltinFormat("h:mm")) { sdf = new SimpleDateFormat("HH:mm"); } else {// 日期 sdf = new SimpleDateFormat( "yyyy-MM-dd"); } Date date = cell.getDateCellValue(); value = date; } else if (cell.getCellStyle() .getDataFormat() == 58) { // 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58) SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd"); double v = cell.getNumericCellValue(); Date date = org.apache.poi.ss.usermodel.DateUtil .getJavaDate(v); value = date; } else { double v = cell.getNumericCellValue(); CellStyle style = cell.getCellStyle(); DecimalFormat format = new DecimalFormat(); String temp = style .getDataFormatString(); // 单元格设置成常规 if (temp.equals("General")) { format.applyPattern("#"); } value = Double.valueOf(v); } } break; case HSSFCell.CELL_TYPE_STRING: // 字符串 value = cell.getStringCellValue() != null ? cell .getStringCellValue().trim() : null; break; case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean value = Boolean.valueOf(cell .getBooleanCellValue()); break; case HSSFCell.CELL_TYPE_FORMULA: // 公式 value = null; // + " "); break; case HSSFCell.CELL_TYPE_BLANK: // 空值 value = null;// System.out.println(" "); break; case HSSFCell.CELL_TYPE_ERROR: // 故障 value = null;// System.out.println(" "); break; default: value = null;// System.out.print("未知类型 "); break; } Field field = (Field) fields.get(columns.get(k)); if(field!=null){fieldValueSetting(clazz, field, obj, value);} } else { continue; } } results.add(obj); } } return results; } catch (FileNotFoundException e) { log.info("导入excel失败,文件不存在"); log.error(e.getMessage(),e); } catch (IOException e) { log.info("导入excel失败,文件流异常"); log.error(e.getMessage(),e); } catch (ClassNotFoundException e) { log.info("导入excel失败,无法根据class创建对象"); log.error(e.getMessage(),e); } catch (NoSuchFieldException e) { log.info("导入excel失败,无法获取类的属性字段"); log.error(e.getMessage(),e); } catch (SecurityException e) { log.info("导入excel失败,无法获取类的属性字段"); log.error(e.getMessage(),e); } catch (InstantiationException e) { log.info("导入excel失败,创建对象失败,至少有一个无参的构造函数"); log.error(e.getMessage(),e); } catch (IllegalAccessException e) { log.info("导入excel失败,创建行对象失败!"); log.error(e.getMessage(),e); } finally { if (workbook != null) { workbook = null; } } return null; } /*** * * @作者 Dick * @创建时间 2015年9月6日 下午4:03:50 * @param @param io * @param @param clazz * @param @param fields * @param @return * @TODO * 只能读取*.xlsx文件中的内容,读取失败返回 null * * @修改备注 * * */ public static List getExcelContentXlsx(InputStream io, Class clazz, Map<String, Object> fields) { XSSFWorkbook workbook = null; XSSFSheet sheet = null; List<Object> results = new ArrayList<Object>(); try { workbook = new XSSFWorkbook(io); for (Iterator iterator = fields.keySet().iterator(); iterator .hasNext();) { String key = iterator.next().toString(); //System.out.println("100:key="+key); String prop = fields.get(key).toString(); fields.put(key, clazz.getDeclaredField(prop)); } sheet = workbook.getSheetAt(0); // 标题总列数 int maxRow = sheet.getLastRowNum(); List<String> columns = new ArrayList<String>(); for (int j = 0; j < sheet.getRow(0).getLastCellNum(); j++) { columns.add(sheet.getRow(0).getCell(j).getStringCellValue() .trim()); } for (int j = 1; j <= maxRow; j++) { XSSFRow row = sheet.getRow(j); if (null != row) { Object obj = Class.forName(clazz.getName()).newInstance(); for (int k = 0; k < row.getLastCellNum(); k++) { XSSFCell cell = row.getCell(k); Object value = null; if (null != cell) { Field field = (Field) fields.get(columns.get(k)); if(field!=null){ switch (cell.getCellType()) { case XSSFCell.CELL_TYPE_NUMERIC: // 数字 // 日期格式处理 if (HSSFDateUtil.isCellDateFormatted(cell)) { if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式 SimpleDateFormat sdf = null; if (cell.getCellStyle().getDataFormat() == HSSFDataFormat .getBuiltinFormat("h:mm")) { sdf = new SimpleDateFormat("HH:mm"); } else {// 日期 sdf = new SimpleDateFormat( "yyyy-MM-dd"); } Date date = cell.getDateCellValue(); value = date; } else if (cell.getCellStyle() .getDataFormat() == 58) { // 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58) SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd"); double v = cell.getNumericCellValue(); Date date = org.apache.poi.ss.usermodel.DateUtil .getJavaDate(v); value = date; } else { double v = cell.getNumericCellValue(); CellStyle style = cell.getCellStyle(); DecimalFormat format = new DecimalFormat(); String temp = style .getDataFormatString(); // 单元格设置成常规 if (temp.equals("General")) { format.applyPattern("#"); } value = Double.valueOf(v); } } break; case XSSFCell.CELL_TYPE_STRING: // 字符串 value = cell.getStringCellValue() != null ? cell .getStringCellValue().trim() : null; break; case XSSFCell.CELL_TYPE_BOOLEAN: // Boolean value = Boolean.valueOf(cell .getBooleanCellValue()); break; case XSSFCell.CELL_TYPE_FORMULA: // 公式 value = null;// System.out.print(cell.getCellFormula() // + " "); break; case XSSFCell.CELL_TYPE_BLANK: // 空值 value = null;// System.out.println(" "); break; case XSSFCell.CELL_TYPE_ERROR: // 故障 value = null;// System.out.println(" "); break; default: value = null;// System.out.print("未知类型 "); break; } fieldValueSetting(clazz, field, obj, value); } } else { continue; } } results.add(obj); } } return results; } catch (FileNotFoundException e) { log.info("导入excel失败,文件不存在"); log.error(e.getMessage(),e); } catch (IOException e) { log.info("导入excel失败,文件流异常"); log.error(e.getMessage(),e); } catch (ClassNotFoundException e) { log.info("导入excel失败,无法根据class创建对象"); log.error(e.getMessage(),e); } catch (NoSuchFieldException e) { log.info("导入excel失败,无法获取类的属性字段"); log.error(e.getMessage(),e); } catch (SecurityException e) { log.info("导入excel失败,无法获取类的属性字段"); log.error(e.getMessage(),e); } catch (InstantiationException e) { log.info("导入excel失败,创建对象失败,至少有一个无参的构造函数"); log.error(e.getMessage(),e); } catch (IllegalAccessException e) { log.info("导入excel失败,创建行对象失败!"); log.error(e.getMessage(),e); } finally { if (workbook != null) { workbook = null; } } return null; } /** * * @作者 Dick * @创建时间 2015年9月6日 下午5:03:13 * @param @param clazz * @param @param field * @param @param target * @param @param value * @TODO * 向clazz类的对象target的field属性设置值 value * * @修改备注 * * */ public static void fieldValueSetting(Class clazz,Field field,Object target,Object value) { try { clazz.getMethod("set"+StringUtils.capitalize(field.getName()),field.getType()).invoke(target, cast(field.getType(),value)); } catch (IllegalAccessException e) { log.error("私有成员,非法访问"); } catch (IllegalArgumentException e) { log.error("非法参数:"+value.getClass().getName()+" to "+field.getType()); } catch (InvocationTargetException e) { log.error("实例对象异常,target="+target.getClass().getName()); } catch (NoSuchMethodException e) { log.error("对象方法异常,method=set"+StringUtils.capitalize(field.getName())); } catch (SecurityException e) { log.error(e.getMessage()); } } /*** * * @作者 Dick * @创建时间 2015年9月6日 下午4:54:00 * @param @param type 目标类型 * @param @param value 参数类型 * @param @return * @TODO * * * @修改备注 * * */ public static Object cast(Class<?> type,Object value){ if(value.getClass().getName().equals(type.getName())){ return value; } if("java.lang.String".equals(type.getName())){ return value.toString(); } if("java.lang.Long".equals(type.getName())&&"java.lang.String".equals(value.getClass().getName())){ return Long.valueOf(value.toString().trim()); } if("java.lang.Double".equals(type.getName())&&"java.lang.String".equals(value.getClass().getName())){ return Double.valueOf(value.toString().trim()); } if("java.lang.Integer".equals(type.getName())&&"java.lang.String".equals(value.getClass().getName())){ return Integer.valueOf(value.toString().trim()); } if("java.util.Date".equals(type.getName())&&"java.lang.String".equals(value.getClass().getName())){ try { return DateUtils.parseDate(value.toString().trim(),dateFormats); } catch (ParseException e) { log.error("日期格式转换失败:"+value.toString().trim()); return null; } } if("java.util.Date".equals(type.getName())&&"java.lang.Long".equals(value.getClass().getName())){ return new Date(Long.valueOf(value.toString())); } return null; } /*** * * @作者 Dick * @创建时间 2015年9月6日 下午5:25:47 * @param @param args * @TODO * 测试 * * @修改备注 * * */ public static void main(String[] args) { Map<String, Object> fields = new HashMap<String, Object>(); fields.put("包裹号", "packageId"); //key:excel字段名,value:实体的字段名 fields.put("订单编号", "orderNumber"); fields.put("公司", "deliveryCompany"); fields.put("单号", "deliveryNo"); fields.put("创建日期", "gmtCreated"); List<Pojo> result = ImportExcelUtil.getExcelContent( new File("F:\\迅雷下载\\20150906125645.xlsx"), Pojo.class, fields); if (result != null) { for (int i = 0; i < result.size(); i++) { System.out.println(result.toString()); } } } }
excel的内容如下:
编号 | 包裹号 | 公司 | 单号 | 金额 | 手机号码 | 创建日期 |
500004 | 6 | 1 | 22222222222222 | 1.00 | 1 |
2015-05-05 00:00:00
|
package com.pkg.controller.form; import java.util.Date; public class Pojo { private Long packageId; private String orderNumber; private String deliveryCompany; private String deliveryNo; private Date gmtCreated; /** * Long * @return the packageId */ public Long getPackageId() { return packageId; } /** * @param packageId the packageId to set */ public void setPackageId(Long packageId) { this.packageId = packageId; } /** * String * @return the orderNumber */ public String getOrderNumber() { return orderNumber; } /** * @param orderNumber the orderNumber to set */ public void setOrderNumber(String orderNumber) { this.orderNumber = orderNumber; } /** * String * @return the deliveryCompany */ public String getDeliveryCompany() { return deliveryCompany; } /** * @param deliveryCompany the deliveryCompany to set */ public void setDeliveryCompany(String deliveryCompany) { this.deliveryCompany = deliveryCompany; } /** * String * @return the deliveryNo */ public String getDeliveryNo() { return deliveryNo; } /** * @param deliveryNo the deliveryNo to set */ public void setDeliveryNo(String deliveryNo) { this.deliveryNo = deliveryNo; } /** * Date * @return the gmtCreated */ public Date getGmtCreated() { return gmtCreated; } /** * @param gmtCreated the gmtCreated to set */ public void setGmtCreated(Date gmtCreated) { this.gmtCreated = gmtCreated; } }
放到项目中可能会有编辑异常,调整后即可调用 main函数测试下了。
转载请注明出处,谢谢!
相关推荐
第11讲:深入理解指针(1)
springboot整合 freemarker方法
第14讲:深入理解指针(4)
《同行者4.1.2语音助手:车机版安装详解》 在现代科技日新月异的时代,智能车载设备已经成为了汽车生活的重要组成部分。"同行者4.1.2"便是这样一款专为车机设计的语音助手,旨在提供更为便捷、安全的驾驶体验。该版本针对掌讯全系列设备进行了兼容优化,让车主能够轻松实现语音控制,减少驾驶过程中的手动操作,提升行车安全性。 我们来了解下"同行者4.1.2"的核心功能。这款语音助手集成了智能语音识别技术,用户可以通过简单的语音指令完成导航、音乐播放、电话拨打等一系列操作,有效避免了因操作手机或车机带来的分心。此外,其强大的语义理解和自学习能力,使得它能逐步适应用户的口音和习惯,提供更个性化的服务。 在安装过程中,用户需要注意的是,"同行者4.1.2"包含了四个核心组件,分别是: 1. TXZCore.apk:这是同行者语音助手的基础框架,包含了语音识别和处理的核心算法,是整个应用运行的基础。 2. com.txznet.comm.base.BaseApplication.apk:这个文件可能包含了应用的公共模块和基础服务,为其他组件提供支持。 3. TXZsetting.apk:这
市场拓展主管绩效考核表
“线上购车3D全方位体验:汽车模型展示与个性化定制功能”,three.js案例- 线上购车3d展示(源码) 包含内容:1.汽车模型展示;2.汽车肤;3.轮毂部件更;4.开关车门动画;5.汽车尺寸测量;6.自动驾驶;7.镜面倒影;8.hdr运用;9.移动端适配; 本为html+css+three.js源码 ,核心关键词:three.js案例; 线上购车3D展示; 汽车模型展示; 汽车换肤; 轮毂部件更换; 开关车门动画; 汽车尺寸测量; 自动驾驶; 镜面倒影; HDR运用; 移动端适配; HTML+CSS+three.js源码。,"Three.js源码:线上购车3D展示案例,含汽车模型、换肤、轮毂更换等九大功能"
数据名称:2000-2022年各县市区主要社会经济发展指标面板数据 数据类型:dta格式 数据来源:中国县域统计
一、智慧环卫管理平台的建设背景与目标 智慧环卫管理平台的建设源于对环卫管理全面升级的需求。当前,城管局已拥有139辆配备车载GPS系统、摄像头和油耗传感器的环卫车辆,但环卫人员尚未配备智能移动终端,公厕也缺乏信息化系统和智能终端设备。为了提升环卫作业效率、实现精细化管理并节省开支,智慧环卫管理平台应运而生。该平台旨在通过信息化技术和软硬件设备,如车载智能终端和环卫手机App,实时了解环卫人员、车辆的工作状态、信息和历史记录,使环卫作业管理透明化、精细化。同时,平台还期望通过数据模型搭建和数据研读,实现更合理的环卫动态资源配置,为环卫工作的科学、健康、持续发展提供决策支持。 二、智慧环卫管理平台的建设内容与功能 智慧环卫管理平台的建设内容包括运行机制体制建设、业务流程设计、智慧公厕系统建设、网络建设、主机和储存平台需求、平台运维管理体系、硬件标准规范体系以及考核评价体系等多个方面。其中,智慧公厕系统建设尤为关键,它能实时监控公厕运行状态,保障公厕的清洁和正常运行。平台建设还充分利用了现有的电子政务网络资源,并考虑了有线和无线网络的需求。在功能上,平台通过普查、整合等手段全面收集环卫车辆、企业、人员、设施、设备等数据,建立智慧环卫基础数据库。利用智能传感、卫星定位等技术实现环卫作业的在线监管和远程监控,实现对道路、公共场所等的作业状况和卫生状况的全面监管。此外,平台还建立了环卫作业网格化管理责任机制,实现从作业过程到结果的全面监管,科学评价区域、部门、单位和人员的作业效果。 三、智慧环卫管理平台的效益与风险规避 智慧环卫管理平台的建设将带来显著的环境、经济和管理效益。环境方面,它将有力推进环境卫生监管服务工作,改善环境卫生状况,为人民群众创造更加清洁、卫生的工作和生活环境。经济方面,通过智慧化监管,大大降低了传统管理手段的成本,提高了监管的准确性和效率。管理方面,平台能够追踪溯源市民反映的问题,如公厕异味、渣土车辆抛洒等,并找到相应的责任单位进行处置,防止类似事件再次发生。同时,平台还拥有强大的预警机制功能,能够在很多环卫问题尚未出现前进行处置。然而,平台建设也面临一定的风险,如部门协调、配合问题,建设单位选择风险以及不可预测的自然灾害等。为了规避这些风险,需要加强领导、统一思想,选择优秀的系统集成商承接项目建设,并做好计算机和应用系统的培训工作。同时,也要注意标准制定工作和相关法律法规的制定工作,以保证系统建设完成后能够真正为环卫管理工作带来便利。
36 -企业管理主管绩效考核表1
1.1 -1.4 工程代码
USDT合约,USDT智能合约
基于姿态估计三维人脸形状重建.pdf
一般员工绩效考核表模板(通用版) (2)
全国各省295地级市互联网普及率、互联网用户数、每百人互联网宽带用户(2011-2022年) 数据年份:2011-2022年(2022存在部分缺失) 数据范围:全国各省295个地级市 数据来源:地方统计局
一、各省、分行业CO2排放、283个地级市碳排放及计算过程 2.分行业二氧化碳排放量 在这里插入图片描述 3、280多个地级市碳排放及计算过程 二、碳中和文献、最新政策、碳金融数据+数学建模 1.二氧化碳减排规划,碳金融数据收集及数学建模 2.碳中和政策和下载量最高的碳中和论文 三、碳排放+碳市场+碳交易+碳中和+碳排放核算Excel自动计算表 全行业碳排放核算Excel自动计算表 四、碳交易数据 五、主要能源碳排放计算参数
第20讲:自定义类型:结构体
视觉跟踪算法综述.pdf
MATLAB超效率SBM-DEA模型代码详解:简易操作指南及期望与非期望产出的超效率分析,附Malmquist指数与分解功能,MATLAB的超效率SBM-DEA模型代码(有安装教程和内容讲解之类的东西),操作很简单 可以做期望产出和非期望产出的超效率和非超效率sbm模型和Malmquist指数和分解 ,MATLAB; SBM-DEA模型; 超效率SBM-DEA; 安装教程; 内容讲解; 期望产出; 非期望产出; 超效率与非超效率sbm模型; Malmquist指数; 分解。,"MATLAB超效SBM-DEA模型代码:非期望产出分析的便捷工具"
人事行政主管绩效考核评分表
人力资源管理工具绩效考核excel模板