poi excel导入工具类ImportUtil
import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.io.InputStream; import java.lang.reflect.Method; import java.math.BigDecimal; import java.sql.Date; import java.text.DecimalFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; /** * excel导入工具类 * * @author lihua_java@163.com * @version 2.0 * @since 2019-11-19 * */ public class ImportUtil { private final static String excel2003L = ".xls"; // 2003- 版本的excel private final static String excel2007U = ".xlsx"; // 2007+ 版本的excel private static final String DATE_FORMAT = "yyyy-MM-dd"; /** * 获取IO流中的数据,组装成List<T>对象 * @param in 输入流 * @param fileName 文件名称,根据后缀判断excel版本 * @param fields 导入字段名称 * @param fieldsClazz 导入字段类型,目前只支持基本类型 * @param clazz bean的class * @return class对应的实例对象List集合 * @throws Exception */ public static <T> List<T> getExcel(InputStream in, String fileName, String[] fields, Class<?>[] fieldsClazz, Class<T> clazz) throws Exception { List<T> list = new ArrayList<>(); if(fields == null || fieldsClazz == null || fields.length != fieldsClazz.length){ throw new Exception("需导入的列设置错误!"); } Map<String, Class<?>> fieldMap = new HashMap<>(); for (int i = 0, j = fields.length; i < j; i++) { fieldMap.put(fields[i], fieldsClazz[i]); } // 创建Excel工作薄 Workbook work = getWorkbook(in, fileName); if (null == work) { throw new Exception("Excel工作薄为空!"); } Sheet sheet = null; Row row = null; Cell cell = null; sheet = work.getSheetAt(0); if (sheet == null) { return list; } // 遍历当前sheet中的所有行 for (int j = sheet.getFirstRowNum(), y = sheet.getLastRowNum(); j <= y; j++) { row = sheet.getRow(j); if (row == null || row.getFirstCellNum() == j) { continue; } // 遍历所有的列 Map<String, Object> fieldDatas = new HashMap<>(); for (int k = row.getFirstCellNum(), z = row.getLastCellNum(); k < z; k++) { cell = row.getCell(k); if(cell == null){ continue; } Object value = getCellValue(cell); if(value == null){ continue; } fieldDatas.put(fields[k], value); } // bean添加到集合 list.add(cashToBean(fieldMap, fieldDatas, clazz)); } return list; } /** * 将读取的行数据转为实例对象 * @param fieldsClazz 字段名称和字段类型集合 * @param fieldDatas 行数据 * @param clazz 实例对象的class * @return * @throws Exception */ private static <T> T cashToBean(Map<String, Class<?>> fieldsClazz, Map<String, Object> fieldDatas, Class<T> clazz) throws Exception{ T entry = clazz.newInstance(); BeanInfo beanInfo = Introspector.getBeanInfo(clazz); PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor property : propertyDescriptors) { String fieldName = property.getName(); if (fieldDatas.containsKey(fieldName)) { Method setter = property.getWriteMethod(); Object _value = cashFieldClass(fieldsClazz.get(fieldName), fieldDatas.get(fieldName)); setter.invoke(entry, _value); } } return entry; } /** * 属性类型转换 * @param fieldsClazz 字段名称和字段类型集合 * @param fieldData 行数据 * @param fieldName 字段名称 * @return * @throws ParseException */ private static Object cashFieldClass(Class<?> fieldClazz, Object value) throws ParseException { Object _value = value; if(!fieldClazz.equals(value.getClass())){ String valueStr = value.toString(); if(fieldClazz.equals(Long.class)){ _value = Long.valueOf(valueStr); }else if(fieldClazz.equals(Integer.class)){ _value = Integer.valueOf(valueStr); }else if(fieldClazz.equals(Date.class)){ _value = new SimpleDateFormat(DATE_FORMAT).parse(valueStr); }else if(fieldClazz.equals(BigDecimal.class)){ _value = new BigDecimal(valueStr); }else if(fieldClazz.equals(Boolean.class)){ _value = Boolean.valueOf(valueStr); }else if(fieldClazz.equals(Double.class)){ _value = Double.valueOf(valueStr); }else if(fieldClazz.equals(Float.class)){ _value = Float.valueOf(valueStr); } } return _value; } /** * 根据文件后缀,自适应上传文件的版本 * * @param inStr * @param fileName * @return * @throws Exception */ public static Workbook getWorkbook(InputStream inStr, String fileName) throws Exception { Workbook wb = null; String fileType = fileName.substring(fileName.lastIndexOf(".")).toLowerCase(); if (excel2003L.equals(fileType)) { wb = new HSSFWorkbook(inStr); // 2003- } else if (excel2007U.equals(fileType)) { wb = new XSSFWorkbook(inStr); // 2007+ } else { throw new Exception("解析的文件格式有误!"); } return wb; } /** * 对表格中数值进行格式化 * * @param cell * @return */ public static Object getCellValue(Cell cell) { Object value = null; DecimalFormat df = new DecimalFormat("0"); // 格式化number String字符 SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT); // 日期格式化 DecimalFormat df2 = new DecimalFormat("0.000"); // 格式化数字 switch (cell.getCellType()) { case Cell.CELL_TYPE_STRING: value = cell.getRichStringCellValue().getString(); break; case Cell.CELL_TYPE_NUMERIC: if ("General".equals(cell.getCellStyle().getDataFormatString())) { value = df.format(cell.getNumericCellValue()); } else if ("m/d/yy".equals(cell.getCellStyle().getDataFormatString())) { value = sdf.format(cell.getDateCellValue()); } else { value = df2.format(cell.getNumericCellValue()); } break; case Cell.CELL_TYPE_BOOLEAN: value = cell.getBooleanCellValue(); break; case Cell.CELL_TYPE_BLANK: value = ""; break; default: break; } return value; } }
示例代码如下:
/** * 持仓划转导入 * @param upload * @param request * @param response */ @RequestMapping("/modules/manage/artPos/import.htm") public void importPos(@RequestParam(value = "upload") MultipartFile upload, HttpServletRequest request , HttpServletResponse response)throws Exception{ String[] fields = {"fromPhone", "toPhone", "artCode", "transferNumber", "transferPrice", "remark"}; Class<?>[] fieldsClazz = {String.class, String.class, String.class, Integer.class, BigDecimal.class, String.class}; List<ArtPositionTransferModel> list = ImportUtil.getExcel(upload.getInputStream(), upload.getOriginalFilename(), fields, fieldsClazz, ArtPositionTransferModel.class); artPositionTransferService.saveBatch(list); ServletUtils.success(response); }
相关推荐
这个"java_poi导入excel通用工具类"是利用Java的POI库和一些额外的技术来实现对Excel数据的导入功能,使得开发人员能够方便地将Excel数据转化为Java对象或者对已有对象进行填充。下面我们将深入探讨相关的知识点。 ...
本篇将深入探讨"Excel POI 工具类",这个工具类旨在简化日常的Excel操作,提升开发效率。 Apache POI 提供了HSSF(Horizontally Stored Sheets Format)和XSSF(XML Spreadsheet Format)两个主要的API,分别用于...
"java_poi导入excel通用工具类V0915" 提供了一种通用的方式来处理Excel数据的导入工作,它支持多种赋值方式,包括单个对象、列表对象以及指定坐标的赋值。 首先,让我们深入理解一下这个工具类的主要功能: 1. **...
概述:Java poi导入导出EXCEL工具类(兼容各版本) 一、功能说明 允许同时导入或导出多个sheet,同一sheet可同时存在多个数据块,按数据块划分处理数据。 二、配置文件示例及详细说明 1、导入xml配置示例如下(见...
5. 使用 Java POI 实现 Excel 导入导出工具类 在上面的示例中,我们已经实现了 Excel 导入和导出功能。下面是一个实现了 Excel 导入导出工具类的示例: ```java import org.apache.poi.hssf.usermodel.HSSFWorkbook...
"基于POI的Excel多Sheet页导出导入工具类"是一个实用的Java类库,专为处理Excel文件中的多个工作表(Sheet)而设计,提供了一种高效且灵活的方式来操作Excel数据。 该工具类的核心功能包括: 1. **多Sheet页操作**...
这个“excel poi工具类”是利用Apache POI库来实现对Excel文件进行导入、导出、合并单元格以及处理计算公式的功能。下面我们将深入探讨这些知识点。 **1. Apache POI库介绍** Apache POI是一个开源项目,它为Java...
支持excel2003、2007,导入的直接传入MultipartFile.getInputStream(),返回List,String>>,再做处理。 导出的数据直接生成excel文档存在本地,返回路径。
以下是对POI Excel工具类的详细说明: 1. **基本概念** - **Apache POI**: POI是Apache软件基金会的项目,它提供了Java API来处理Microsoft的OLE2复合文档格式,包括Excel、Word、PowerPoint等。 - **HSSF...
java的poi的导入工具类,只需要传入两个arrayList,一个是execl的标题,一个是ececl的数据,就可以直接导出到execl里面,支持最新的execl,全新封装的,让每一个人都会使用poi导出execl!
总结,"poi导入导出Excel通用工具类 兼容xls,xlsx"这个工具实现了利用Apache POI库处理Excel文件的功能,涵盖了从旧版的.xls到新版的.xlsx格式,提供了方便的导入和导出接口,使得在Java开发中处理Excel数据变得...
通过上述步骤,我们可以实现一个功能完备的Excel数据导入工具。在实际开发中,可能还需要考虑其他因素,比如多线程处理大文件以提高性能,或者设计更灵活的配置来适应不同格式的Excel文件和数据库结构。标签“excel ...
本工具类就是基于Java POI实现的,旨在提供一个通用的解决方案,用于从Excel模板导入数据,同时兼容2003和2007两种版本的Excel文件。 Excel模板导入通用工具类的核心功能可能包括以下几个方面: 1. **模板解析**:...
在实际项目中,为了提高代码的可重用性和可维护性,你可能会封装这些操作到一个服务类或工具类中,提供易于使用的API供其他部分的代码调用。例如,可以创建一个`ExcelService`,包含`importExcel(InputStream) -> ...
为了更好地理解这两个库的用法,你可以查看提供的"Excel导入导出(jxl及Poi)工具类"压缩包中的示例代码。通过阅读和运行这些代码,你可以更深入地了解如何在实际项目中应用jxl和Apache POI。 总的来说,jxl和Apache ...
本项目通过Apache POI实现了Excel的导入与导出功能,并在操作过程中加入了进度条展示,增强了用户体验。 首先,Apache POI的核心类HSSFWorkbook和XSSFWorkbook分别用于处理老版本的.xls和新版本的.xlsx文件。在导入...
在Java编程环境中,Apache POI库是一个非常重要的工具,它允许开发者读取、写入和修改Microsoft Office格式的文件,尤其是Excel(.xlsx 和 .xls)文件。本教程将深入探讨如何利用Java POI库来实现Excel的导入与导出...
使用poi读取写入复杂excel内容包括样式,工具类
6. **commons-lang**: 提供了一些常用的字符串和对象操作工具类。 7. **commons-codec**: 提供了各种编码和解码算法,例如Base64。 在实际开发中,你可以通过以下步骤使用Apache POI来导入Excel数据: 1. **创建...