导入Excel表,并解析数据录入数据库,Excel表一个sheet或者多个sheet均可使用

controller类的导入接口

/**
     * 解析Excel表数据并保存
     * @param request
     * @param response
     * @throws Exception
     */
    @RequestMapping(value="import")
    @Action(description="导入数据")
    public void importExcelSource(MultipartHttpServletRequest request,HttpServletResponse response) throws Exception{
		Map<String, Object> map = new HashMap<String, Object>();

		Map<String, MultipartFile> files = request.getFileMap();
        Iterator<MultipartFile> it = files.values().iterator();
        MultipartFile file = (MultipartFile) it.next();
        
        // 1、解析Excel数据
        ExcelToBeanUtil eToBeanUtil = new ExcelToBeanUtil();
        Map<Integer, String[]> keys = new HashMap<Integer, String[]>();
        //个人信息表相应属性数组
        String [] perColumnName = {"customerName","customerType", "customerIndustry", "customerArea", "customerCategory", "personIdentityCard","personPapersExpire"
        		, "personCategory", "personEducation", "personMobile", "personCensusAddr","personMarital", "personFamily", "personExistChild"};
       
        //企业信息表相应属性数组
        String [] entColumnName = {"customerName","customerType", "customerIndustry", "customerArea", "customerCategory", "enterpriseNumber"
    			,"enterpriseType", "userType", "enterpriseLegalIdNo", "enterpriseLegalUser", "enterpriseLegalUserPhone","registrationType", "enterpriseOrganizingNumber"};
    	keys.put(0, perColumnName);
    	keys.put(1, entColumnName);
    	
        List<CrmCustomerDto> list =  eToBeanUtil.toObjectList(CrmCustomerDto.class, file, keys, 3, 0); //从第四行,第一列开始解析数据

        //2、保存数据
        Integer resultCode = this.crmCustomerService.insertList(list);
        String resultMsg = "导入数据成功!";
		
        if(resultCode != Constant.YES){
			resultMsg = "导入数据失败!";
		}
		
		map.put("result", resultCode);
		map.put("message", resultMsg);
		
		String jsonStr = JSONObject.fromObject(map).toString();
		response.setCharacterEncoding("utf-8");
		response.getWriter().print(jsonStr);
    }

解析Excel文件数据工具类  直接调用工具类 toObjectList该方法就可以,会将数据转换成相应的实体类集合返回,接着就可以进行数据库的录入保存操作。

1、Excel文件解析获取单元格的数据都是以字符串的形式获取,设计到其他数据类型的可以解析到数据后再做类型转换(本人单独写了个dto来做数据接收的,这里属性的命名可以享有的实体类的属性命名一直,这样方便直接使用BeanUtils.copyProperties(customerdDto, person)方法来copy)。

package com.deelon.common.util;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
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;
import org.springframework.web.multipart.MultipartFile;

import com.alibaba.fastjson.JSONObject;

/**
 * Excel表数据导入,数据解析转换成实体bean工具类
 * @author FUYONGJIN
 *
 */
public class ExcelToBeanUtil {
	
	// 总行数
    private int totalRows = 0;
    // 总条数
    private int totalCells = 0;
    // 错误信息接收器
    private String errorMsg;

    // 构造方法
    public ExcelToBeanUtil() {
    }

    // 获取总行数
    public int getTotalRows() {
        return totalRows;
    }

    // 获取总列数
    public int getTotalCells() {
        return totalCells;
    }

    // 获取错误信息
    public String getErrorInfo() {
        return errorMsg;
    }

	
 
    /**
     * 利用反射将	List<Map<String,Object>>结构 生成相应的List<T>数据
     * @param clazz
     * @param file
     * @param keys  工作表相应的javabean类的属性名称数组 (map集合 key 表示表的下标,value表示属性数组)
     * @param rowNum  开始行的下标
     * @param colNum  开始列的下标
     * @return
     * @throws Exception
     */
    public  <T>  List<T> toObjectList(Class<T> clazz,MultipartFile file,Map<Integer, String []> keys,Integer rowNum,Integer colNum) throws Exception{
    	
    	List<Map<String, String>> list = getExcelInfo(file, keys, rowNum, colNum);
    	
    	List<T> returnList = new LinkedList<T>();
    	for(int i=0;i<list.size();i++){
    		Set<Map.Entry<String, String>> set =  list.get(i).entrySet();
    		Iterator<Entry<String, String>> it = set.iterator();
			T obj= clazz.newInstance();
			Method[] methods = clazz.getDeclaredMethods();
    		while (it.hasNext()) {		//生成一个obj
				Map.Entry<String, String> entry = (Map.Entry<String, String>) it.next();
				for(Method m:methods){
					if(m.getName().startsWith("set")){		//为obj赋值
						String methodName = entry.getKey().toString();
						StringBuffer sb = new StringBuffer(methodName);  
		                sb.replace(0, 1, (methodName.charAt(0)+"").toUpperCase());  
		                methodName = "set" +  sb.toString();
						if(methodName.equals(m.getName())){
							m.invoke(obj, entry.getValue());
							break;
						}
					}
				}
			}
			returnList.add(obj);
    	}
    	System.out.println("size=" + returnList.size());
    	return returnList;
    }
    
    /**
     * 将workbook中的值放入List<Map<String,Object>>结构中
     * @author FUYONGJIN
     * @param wb  文件workbook 对象
     * @param keys  工作表相应的javabean类的属性名称数组 (map集合 key 表示表的下标,value表示属性数组)
     * @param rowNum  开始行的下标
     * @param colNum  开始列的下标
     * @throws Exception
     * @return
     */
    private List<Map<String, String>> readExcelValue(Workbook wb,Map<Integer, String []> keys,Integer rowNum,Integer colNum) throws Exception{
		List<Map<String, String>> list = new ArrayList<Map<String, String>>();
		
		String[] columnName = null; 
		// 遍历工作表sheet
		for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) { 
			
			if(keys.containsKey(sheetIndex)){
				columnName = keys.get(sheetIndex);
			}
			
			Sheet sheet = wb.getSheetAt(sheetIndex);
			// 得到Excel的行数
			this.totalRows = sheet.getLastRowNum();
			
			// 得到Excel的列数(前提是有行数)
			if (totalRows > 1 && sheet.getRow(0) != null) {
				this.totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
			}

			String str = "";
			
			for (int i = rowNum; i <= totalRows; i++) {
				Row row = sheet.getRow(i);

				if (isRowEmpty(row))
					continue;

				Map<String, String> map = new HashMap<String, String>();

				int j = colNum; 
				while (j < totalCells) {
					str = getCellFormatValueString(row.getCell((short) j), j).trim();

					for (int k = 0; k < columnName.length; k++) {
						if (k+colNum == j) {
							map.put(columnName[k], str);
							break;
						}
					}
					j++;
				}

				list.add(map);

			}
		}

		return list;
    }
    
    /**
     * 根据HSSFCell类型设置数据
     * @param xssfCell 纯数字的内容也按照String类型获取
     * @return
     */
    private String getCellFormatValueString(Cell cell,int j) {
        String cellvalue = "";
        if (cell != null) {
            // 判断当前Cell的Type
            switch (cell.getCellType()) {
                // 如果当前Cell的Type为NUMERIC
                case HSSFCell.CELL_TYPE_NUMERIC:
                case HSSFCell.CELL_TYPE_FORMULA: {
                    // 判断当前的cell是否为Date
                    if (HSSFDateUtil.isCellDateFormatted(cell)) {
                        // 如果是Date类型则,转化为Data格式
                    	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                        if(j == 2){
                        	sdf = new SimpleDateFormat("HH:mm");
                        }
                        Date date = cell.getDateCellValue();
                       
                        cellvalue = sdf.format(date);
                        
                    }
                    // 如果是纯数字
                    else {
                    	cell.setCellType(HSSFCell.CELL_TYPE_STRING);  //设置为String类型
                        // 取得当前Cell的数值
                        cellvalue = cell.getRichStringCellValue().getString(); //String.valueOf(cell.getNumericCellValue());
                    }
                    break;
                }
                // 如果当前Cell的Type为STRIN
                case HSSFCell.CELL_TYPE_STRING:
                    // 取得当前的Cell字符串
                    cellvalue = cell.getRichStringCellValue().getString();
                    break;
                    // 默认的Cell值
                default:
                    cellvalue = " ";
            }
        } else {
            cellvalue = "";
        }
        return cellvalue;
        
    }
    
    public static boolean isRowEmpty(Row row){
        for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) {
            Cell cell = row.getCell(i);
            if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK){
                return false;
            }
        }
        return true;
    }

   
    /**
     * 读EXCEL文件,获取信息集合
     * @param mFile
     * @param keys
     * @param rowNum
     * @param colNum
     * @throws Exception
     * @return
     */
    public List<Map<String, String>> getExcelInfo(MultipartFile mFile,Map<Integer, String []> keys,Integer rowNum,Integer colNum) throws Exception {
        
    	List<Map<String, String>> mapList = null;
    	String fileName = mFile.getOriginalFilename();// 获取文件名
        try {
            if (!validateExcel(fileName)) {// 验证文件名是否合格
                return null;
            }
            boolean isExcel2003 = true;// 根据文件名判断文件是2003版本还是2007版本
            if (isExcel2007(fileName)) {
                isExcel2003 = false;
            }
            
            Workbook wb = createExcel(mFile.getInputStream(), isExcel2003);
           
            // 解析Excel表数据
            mapList = readExcelValue(wb,keys,rowNum,colNum);// 解析Excel表数据
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        return mapList;
    }
    
    /**
     * 获取Workbook对象
     * @param is      输入流
     * @param isExcel2003   excel是2003还是2007版本
     * @return
     * @throws Exception
     */
    public Workbook createExcel(InputStream is, boolean isExcel2003) throws Exception {
    	 Workbook wb = null;
    	try {
            if (isExcel2003) {// 当excel是2003时,创建excel2003
                wb = new HSSFWorkbook(is);
            } else {// 当excel是2007时,创建excel2007
                wb = new XSSFWorkbook(is);
            }
            return wb;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return wb;
    }
    
    /**
     * 验证EXCEL文件
     * 
     * @param filePath
     * @return
     */
    public boolean validateExcel(String filePath) {
        if (filePath == null || !(isExcel2003(filePath) || isExcel2007(filePath))) {
            errorMsg = "文件名不是excel格式";
            return false;
        }
        return true;
    }

    // @描述:是否是2003的excel,返回true是2003
    public static boolean isExcel2003(String filePath) {
        return filePath.matches("^.+\\.(?i)(xls)$");
    }

    // @描述:是否是2007的excel,返回true是2007
    public static boolean isExcel2007(String filePath) {
        return filePath.matches("^.+\\.(?i)(xlsx)$");
    }
    
    public static void main(String args[]) throws Exception{
    	
    	FileInputStream input = new FileInputStream("D:\\用户信息导入模板.xlsx");
    	XSSFWorkbook workbook = new XSSFWorkbook(input);
    	
    	Map<Integer, String[]> keys = new HashMap<Integer, String[]>();
    	String [] columnName = {"tradeDate", "tradeTime", "remittAmount", "reciprocalAccount", "summary"
    			,"tradeDate", "tradeTime", "remittAmount", "reciprocalAccount", "summary","tradeDate", "tradeTime", "remittAmount"};
    	keys.put(1, columnName);
    	ExcelToBeanUtil util = new ExcelToBeanUtil();
    	List<Map<String, String>> list = util.readExcelValue(workbook,keys , 3,0);
    	System.out.println(JSONObject.toJSONString(list)); //利用fastjson将其序列化打印出来
    }

}

用于接收数据的dto(这里我个人的代码在set方法里做了相应的转换)

package com.deelon.crmform.dto;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.deelon.constant.Constant;

/**
 * 批量导入用户实体dto
 * 
 * @author FUYONGJIN
 *
 */
public class CrmCustomerDto {
	
	// 客户名称
	private String customerName;
	// 客户类型
	private String customerType;
	// 所属行业
	private String customerIndustry;
	// 所属区域
	private String customerArea;
	// 客户分类
	private String customerCategory;

	// 个人用户信息
	// 身份证号码
	private String personIdentityCard;
	// 证件到期时间
	private Date personPapersExpire;
	// 户别
	private String personCategory;
	// 学历
	private String personEducation;
	// 移动电话
	private String personMobile;
	// 户籍地址
	private String personCensusAddr;
	// 婚姻状况
	private String personMarital;
	// 家庭人员
	private Integer personFamily;
	// 是否有子女
	private String personExistChild;

	// 企业用户信息
	// 营业执照号
	private String enterpriseNumber;
	// 企业性质
	private String enterpriseType;
	// 注册人类型
	private String userType;
	// 注册人身份证号码
	private String enterpriseLegalIdNo;
	// 注册人姓名
	private String enterpriseLegalUser;
	// 注册人联系电话
	private String enterpriseLegalUserPhone;
	// 企业注册类型
	private String registrationType;
	// 组织机构代码号/社会信用代码
	private String enterpriseOrganizingNumber;

	
	public String getCustomerType() {
		return customerType;
	}

	public void setCustomerType(String customerType) {
		if(customerType.isEmpty()){
			this.customerType = customerType;
			return;
		}
		if (customerType.trim().equals("个人")) {
			customerType = String.valueOf(Constant.PersonalOrEnterprise.PERSONAL);
		} else {
			customerType = String.valueOf(Constant.PersonalOrEnterprise.ENTERPRISE);
		}
		this.customerType = customerType;
	}

	public String getCustomerName() {
		return customerName;
	}

	public String getCustomerIndustry() {
		return customerIndustry;
	}

	public String getCustomerArea() {
		return customerArea;
	}

	public String getCustomerCategory() {
		return customerCategory;
	}

	public String getPersonIdentityCard() {
		return personIdentityCard;
	}

	public Date getPersonPapersExpire() {
		return personPapersExpire;
	}

	public String getPersonCategory() {
		return personCategory;
	}

	public String getPersonEducation() {
		return personEducation;
	}

	public String getPersonMobile() {
		return personMobile;
	}

	public String getPersonCensusAddr() {
		return personCensusAddr;
	}

	public String getPersonMarital() {
		return personMarital;
	}

	public Integer getPersonFamily() {
		return personFamily;
	}

	public String getPersonExistChild() {
		return personExistChild;
	}

	public String getEnterpriseNumber() {
		return enterpriseNumber;
	}

	public String getEnterpriseType() {
		return enterpriseType;
	}

	public String getUserType() {
		return userType;
	}

	public String getEnterpriseLegalIdNo() {
		return enterpriseLegalIdNo;
	}

	public String getEnterpriseLegalUser() {
		return enterpriseLegalUser;
	}

	public String getEnterpriseLegalUserPhone() {
		return enterpriseLegalUserPhone;
	}

	public String getRegistrationType() {
		return registrationType;
	}

	public String getEnterpriseOrganizingNumber() {
		return enterpriseOrganizingNumber;
	}

	public void setCustomerName(String customerName) {
		this.customerName = customerName;
	}

	public void setCustomerIndustry(String customerIndustry) {
		this.customerIndustry = customerIndustry;
	}

	public void setCustomerArea(String customerArea) {
		this.customerArea = customerArea;
	}

	public void setCustomerCategory(String customerCategory) {
		if (customerCategory.isEmpty()) {
			this.customerCategory = customerCategory;
			return;
		}
		if (customerCategory.trim().equals("借款人")) {
			customerCategory = Constant.customerCategory.BORROWER;
			
		} else if (customerCategory.trim().equals("担保人")) {
			customerCategory = Constant.customerCategory.GUARANTEE;
			
		} else if (customerCategory.trim().equals("银行")) {
			customerCategory = Constant.customerCategory.BANK;
			
		} else {
			customerCategory = Constant.customerCategory.FINANCING;
		}
		this.customerCategory = customerCategory;
	}

	public void setPersonIdentityCard(String personIdentityCard) {
		this.personIdentityCard = personIdentityCard;
	}

	public void setPersonPapersExpire(String personPapersExpire) {
		SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd"); 
		try {
			if(null != personPapersExpire && !personPapersExpire.isEmpty()){
				this.personPapersExpire = format.parse(personPapersExpire);
			}else {
				this.personPapersExpire = null;
			}
			
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}

	public void setPersonCategory(String personCategory) {
		if(personCategory.isEmpty()){
			this.personCategory = personCategory;
			return;
		}
		if (personCategory.trim().equals("农户")) {
			personCategory = Constant.perResidenceType.COUNTRYSIDE;
		} else {
			personCategory = Constant.perResidenceType.RESIDENT;
		}
		this.personCategory = personCategory;
	}

	public void setPersonEducation(String personEducation) {

		if (personEducation.isEmpty()) {
			this.personEducation = personEducation;
			return;
		}
		if (personEducation.trim().equals("本科")) {
			personEducation = Constant.education.UNDERGRADUATE;
			
		} else if (personEducation.trim().equals("硕士研究生")) {
			personEducation = Constant.education.MASTER;
			
		} else if (personEducation.trim().equals("博士研究生")) {
			personEducation = Constant.education.DOCTOR;
			
		} else if (personEducation.trim().equals("专科")) {
			personEducation = Constant.education.SPECIALTY;
			
		} else {
			personEducation = Constant.education.BELOWSPECIALTY;
		}
		this.personEducation = personEducation;
	}

	public void setPersonMobile(String personMobile) {
		this.personMobile = personMobile;
	}

	public void setPersonCensusAddr(String personCensusAddr) {
		this.personCensusAddr = personCensusAddr;
	}

	public void setPersonMarital(String personMarital) {
		
		if(personMarital.isEmpty()){
			this.personMarital = personMarital;
			return;
		}
		if (personMarital.trim().equals("未婚")) {
			personMarital = Constant.marital.UNMARRIED;
		}else if (personMarital.trim().equals("已婚")) {
			personMarital = Constant.marital.MARRIED;
		}else if (personMarital.trim().equals("离异")) {
			personMarital = Constant.marital.DIVORCE;
		}else if (personMarital.trim().equals("再婚")) {
			personMarital = Constant.marital.REMARRIAGE;
		} else {
			personMarital = Constant.marital.OTHER;
		}
		
		this.personMarital = personMarital;
	}

	public void setPersonFamily(String personFamily) {
		if(null != personFamily && !personFamily.isEmpty()){
			this.personFamily = Integer.valueOf(personFamily);
		}else {
			this.personFamily = null;
		}
		
	}

	public void setPersonExistChild(String personExistChild) {
		if(personExistChild.isEmpty()){
			this.personExistChild = personExistChild;
			return;
		}
		if (personExistChild.trim().equals("是")) {
			personExistChild = Constant.YES.toString();
		} else {
			personExistChild = Constant.NO.toString();
		}
		this.personExistChild = personExistChild;
	}

	public void setEnterpriseNumber(String enterpriseNumber) {
		this.enterpriseNumber = enterpriseNumber;
	}

	public void setEnterpriseType(String enterpriseType) {
		if(enterpriseType.isEmpty()){
			this.enterpriseType = enterpriseType;
			return;
		}
		if (enterpriseType.trim().equals("有限责任")) {
			enterpriseType = Constant.enterpriseType.LIMITEDLIABILITY;
		}else if (enterpriseType.trim().equals("股份制")) {
			enterpriseType = Constant.enterpriseType.SHAREHOLDINGSYSTEM;
		}else if (enterpriseType.trim().equals("私营")) {
			enterpriseType = Constant.enterpriseType.PRIVATEENTERPRISE;
		}else if (enterpriseType.trim().equals("独资")) {
			enterpriseType = Constant.enterpriseType.SOLEPROPRIET;
		} else {
			enterpriseType = Constant.enterpriseType.JOINTVENTURE;
		}
		
		this.enterpriseType = enterpriseType;
	}

	public void setUserType(String userType) {
		if(userType.isEmpty()){
			this.userType = userType;
			return;
		}
		if (userType.trim().equals("法人")) {
			userType = String.valueOf(Constant.EnterpriseUserType.LEGAT);
		} else {
			userType = String.valueOf(Constant.EnterpriseUserType.AGENT);
		}
		this.userType = userType;
	}

	public void setEnterpriseLegalIdNo(String enterpriseLegalIdNo) {
		this.enterpriseLegalIdNo = enterpriseLegalIdNo;
	}

	public void setEnterpriseLegalUser(String enterpriseLegalUser) {
		this.enterpriseLegalUser = enterpriseLegalUser;
	}

	public void setEnterpriseLegalUserPhone(String enterpriseLegalUserPhone) {
		this.enterpriseLegalUserPhone = enterpriseLegalUserPhone;
	}

	public void setRegistrationType(String registrationType) {
		if(registrationType.isEmpty()){
			this.registrationType = registrationType;
			return;
		}
		if (registrationType.trim().equals("多证合一")) {
			registrationType = String.valueOf(Constant.EnterpriseRegistrationType.UNITY);
		} else {
			registrationType = String.valueOf(Constant.EnterpriseRegistrationType.ORGANIZATION);
		}
		this.registrationType = registrationType;
	}

	public void setEnterpriseOrganizingNumber(String enterpriseOrganizingNumber) {
		this.enterpriseOrganizingNumber = enterpriseOrganizingNumber;
	}


}