`
hbxflihua
  • 浏览: 678299 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

poi excel导入工具类

阅读更多

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通用工具类"是利用Java的POI库和一些额外的技术来实现对Excel数据的导入功能,使得开发人员能够方便地将Excel数据转化为Java对象或者对已有对象进行填充。下面我们将深入探讨相关的知识点。 ...

    Excel POI 工具类

    本篇将深入探讨"Excel POI 工具类",这个工具类旨在简化日常的Excel操作,提升开发效率。 Apache POI 提供了HSSF(Horizontally Stored Sheets Format)和XSSF(XML Spreadsheet Format)两个主要的API,分别用于...

    java_poi导入excel通用工具类V0915

    "java_poi导入excel通用工具类V0915" 提供了一种通用的方式来处理Excel数据的导入工作,它支持多种赋值方式,包括单个对象、列表对象以及指定坐标的赋值。 首先,让我们深入理解一下这个工具类的主要功能: 1. **...

    Java poi导入导出EXCEL工具类(兼容各版本)

    概述:Java poi导入导出EXCEL工具类(兼容各版本) 一、功能说明 允许同时导入或导出多个sheet,同一sheet可同时存在多个数据块,按数据块划分处理数据。 二、配置文件示例及详细说明 1、导入xml配置示例如下(见...

    java_poi实现excel导入导出

    5. 使用 Java POI 实现 Excel 导入导出工具类 在上面的示例中,我们已经实现了 Excel 导入和导出功能。下面是一个实现了 Excel 导入导出工具类的示例: ```java import org.apache.poi.hssf.usermodel.HSSFWorkbook...

    基于POI的Excel多Sheet页导出导入工具类

    "基于POI的Excel多Sheet页导出导入工具类"是一个实用的Java类库,专为处理Excel文件中的多个工作表(Sheet)而设计,提供了一种高效且灵活的方式来操作Excel数据。 该工具类的核心功能包括: 1. **多Sheet页操作**...

    excel poi工具类 导入 导出 合并单元格 计算公式

    这个“excel poi工具类”是利用Apache POI库来实现对Excel文件进行导入、导出、合并单元格以及处理计算公式的功能。下面我们将深入探讨这些知识点。 **1. Apache POI库介绍** Apache POI是一个开源项目,它为Java...

    poi excel导入、导出,工具类、jar包

    支持excel2003、2007,导入的直接传入MultipartFile.getInputStream(),返回List,String&gt;&gt;,再做处理。 导出的数据直接生成excel文档存在本地,返回路径。

    POI Excel 工具类

    以下是对POI Excel工具类的详细说明: 1. **基本概念** - **Apache POI**: POI是Apache软件基金会的项目,它提供了Java API来处理Microsoft的OLE2复合文档格式,包括Excel、Word、PowerPoint等。 - **HSSF...

    java 使用poi导出excel工具类

    java的poi的导入工具类,只需要传入两个arrayList,一个是execl的标题,一个是ececl的数据,就可以直接导出到execl里面,支持最新的execl,全新封装的,让每一个人都会使用poi导出execl!

    poi导入导出Excel通用工具类 兼容xls,xlsx

    总结,"poi导入导出Excel通用工具类 兼容xls,xlsx"这个工具实现了利用Apache POI库处理Excel文件的功能,涵盖了从旧版的.xls到新版的.xlsx格式,提供了方便的导入和导出接口,使得在Java开发中处理Excel数据变得...

    poi excel导入

    通过上述步骤,我们可以实现一个功能完备的Excel数据导入工具。在实际开发中,可能还需要考虑其他因素,比如多线程处理大文件以提高性能,或者设计更灵活的配置来适应不同格式的Excel文件和数据库结构。标签“excel ...

    java poi excel 模板导入通用工具类,支持2003/2007

    本工具类就是基于Java POI实现的,旨在提供一个通用的解决方案,用于从Excel模板导入数据,同时兼容2003和2007两种版本的Excel文件。 Excel模板导入通用工具类的核心功能可能包括以下几个方面: 1. **模板解析**:...

    POI实现excel导入导出

    在实际项目中,为了提高代码的可重用性和可维护性,你可能会封装这些操作到一个服务类或工具类中,提供易于使用的API供其他部分的代码调用。例如,可以创建一个`ExcelService`,包含`importExcel(InputStream) -&gt; ...

    Excel导入导出 jxl及Poi 工具类

    为了更好地理解这两个库的用法,你可以查看提供的"Excel导入导出(jxl及Poi)工具类"压缩包中的示例代码。通过阅读和运行这些代码,你可以更深入地了解如何在实际项目中应用jxl和Apache POI。 总的来说,jxl和Apache ...

    POI实现Excel导入导出并附带加载进度条

    本项目通过Apache POI实现了Excel的导入与导出功能,并在操作过程中加入了进度条展示,增强了用户体验。 首先,Apache POI的核心类HSSFWorkbook和XSSFWorkbook分别用于处理老版本的.xls和新版本的.xlsx文件。在导入...

    Java poi 实现excel导入导出

    在Java编程环境中,Apache POI库是一个非常重要的工具,它允许开发者读取、写入和修改Microsoft Office格式的文件,尤其是Excel(.xlsx 和 .xls)文件。本教程将深入探讨如何利用Java POI库来实现Excel的导入与导出...

    使用poi读取、写入复杂excel工具类(包含样式)

    使用poi读取写入复杂excel内容包括样式,工具类

    poi导入excel表需要的jar包

    6. **commons-lang**: 提供了一些常用的字符串和对象操作工具类。 7. **commons-codec**: 提供了各种编码和解码算法,例如Base64。 在实际开发中,你可以通过以下步骤使用Apache POI来导入Excel数据: 1. **创建...

Global site tag (gtag.js) - Google Analytics