工作中导入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函数测试下了。
转载请注明出处,谢谢!
相关推荐
Thinkphp5整合excel导入导出Thinkphp5整合excel导入导出Thinkphp5整合excel导入导出Thinkphp5整合excel导入导出Thinkphp5整合excel导入导出Thinkphp5整合excel导入导出Thinkphp5整合excel导入导出Thinkphp5整合excel...
thinkhphp3.2 excel导入导出demothinkhphp3.2 excel导入导出demothinkhphp3.2 excel导入导出demothinkhphp3.2 excel导入导出demothinkhphp3.2 excel导入导出demothinkhphp3.2 excel导入导出demothinkhphp3.2 excel...
易语言是一种专为中国人设计的编程语言,它以简体...总的来说,易语言EXCEL表导入EDB数据库的源码是一个实用的编程示例,展示了如何利用易语言进行数据处理,对于学习易语言和数据库管理的初学者来说是一份宝贵的资料。
本文档描述了一个使用Java后台方法实现Excel表中的数据导入的示例,包括前端页面代码和后台方法代码。 前端页面代码 前端页面代码使用HTML、JavaScript和jQuery实现了文件上传和导入功能。页面中有两个主要部分:...
- **行列映射**:确保正确映射Excel中的列到数据库表的字段。 - **性能优化**:大量数据导入时,批量操作比单条插入更快。可以使用SqlBulkCopy类进行批量导入。 在提供的"ExcelDataToSQLServer__demo"示例中,可能...
在给定的“易语言EXCEL表导入EDB数据库”主题中,我们将深入探讨如何使用易语言来实现Excel表格数据的导入,并将其存储到EDB(Enterprise Database)数据库中。 首先,我们需要了解的是Excel文件格式。Excel文件...
Excel 导入照片和照片引用详解 在 Excel 中导入照片和引用照片是非常实用的功能,特别是在需要展示大量照片的场景中。下面将详细介绍 Excel 中如何导入照片和引用照片。 Excel 导入照片 在 Excel 中导入照片需要...
在Java编程中,Excel数据导入是一项常见的任务,特别是在数据分析、报表生成或批量处理大量数据时。标题中的"excel导入用到jar包"指的是为了在Java程序中读取和操作Excel文件,我们需要引入特定的库,这里提及的是...
在C#编程中,将Excel数据导入SQLite数据库是一项常见的任务,尤其在数据处理和分析的场景下。以下是如何使用C#实现这一功能的详细步骤和关键知识点: 首先,需要引入必要的库,包括System.Data.SQLite和System.Data...
标题与描述概述的知识点是关于使用PowerBuilder 9(PB9)进行Excel文件导入的过程及其实现效率。本文将深入解析这一操作的具体步骤、注意事项以及潜在的错误处理机制,为IT专业人士提供一个全面的PB9 Excel导入指南...
"C# Excel导入出错解决办法" 在ASP.NET项目开发过程中,经常需要进行数据处理,Oracle数据库和Microsoft Excel在数据处理过程中经常使用到。Oracle数据库可以处理大量数据,无论性能和坚固性都是非常好的数据库...
这个"asp将EXCEL导入导出数据库原程序"提供了一个解决方案,能够方便地将Excel中的数据存入MSSQL数据库,同时也能将数据库中的数据导出到Excel文件。 首先,我们需要了解如何使用ASP连接MSSQL数据库。通常,这涉及...
SpringBoot+AntDesignVue 实现 Excel 导入功能 在本篇文章中,我们将介绍如何使用 SpringBoot 和 AntDesignVue 实现 Excel 导入功能。这个功能主要是使用 Ant Design Vue 中的 upload 组件来实现导入 excel 文件的...
在前端开发中,Web Excel导入是一项常见的需求,它允许用户在网页上直接上传Excel文件,以便进行数据的读取、处理或展示。这项技术对于数据分析、报表制作等场景尤为重要。以下将详细介绍实现Web Excel导入涉及的...
本文将深入探讨如何结合EasyExcel和Validation实现高效且准确的Excel导入导出与数据校验。 EasyExcel的优势在于其简洁的API设计和对内存的高效利用。它无需预先加载整个Excel文件到内存,而是采用流式读写,降低了...
3. **准备Excel文件**:确保Excel文件中的数据格式正确,并且包含所有需要导入到数据库表中的列。 #### 三、本地测试环境数据导入步骤 1. **登录PL/SQL Developer**:启动PL/SQL Developer并连接到本地测试数据库...
在.NET框架中,处理Excel数据是一项常见的任务,特别是在构建企业级Web应用时,用户可能需要上传Excel文件以导入数据。本篇文章将详细讲解如何在.NET环境中实现Excel的导入功能,以便网页可以处理Excel数据。 首先...
标题中的“Excel导入CSV文件”指的是在Microsoft Excel中将逗号分隔值(Comma Separated Values, CSV)格式的数据导入到工作表中。CSV文件是一种常见的数据交换格式,因其简单和通用性而广泛使用。它以纯文本形式...
本文将深入探讨如何利用Excel文件来导入数据到PowerDesigner,以便更有效地管理和设计数据库。 首先,我们需要了解PowerDesigner的基本操作。它提供了丰富的功能,包括表的设计、关系的建立、索引的设置,以及数据...
PB Excel 导入数据窗口 PB Excel 导入数据窗口是 PowerBuilder 中的一种功能强大的数据导入工具,能够将 Excel 文件中的数据快速导入到数据窗口中。下面我们将详细介绍该功能的实现原理和代码实现。 函数名称:GF_...