Apache POI实现数据的Excel导入

得到上传的MultipartFile 文件转换成FileInputStream ,将输入流传入importExcelX解析返回List,然后遍历插入数据库。


ExportDataController.java

 @RequestMapping(value = "ImportExcelProduct.do",method = RequestMethod.POST)
    public String ImportExcelProduct(@RequestParam("files") MultipartFile file){    
        BasicProductMsg basicProductMsg = new BasicProductMsg();
        String fileName =file.getOriginalFilename() ;
        String returnStr = StringUtil.RETURN_ERROR_DATA_FORMAT;//这个是一个返回提示内容:上传格式错误!
        //文件不为空并且后缀等于xlsx就将上传的文件写入临时的文件夹中
        if (!file.isEmpty() && fileName.endsWith(".xlsx")) {
            try {
                //得到文件的输入流
                FileInputStream fis = (FileInputStream) file.getInputStream();
                //解析Excel后得到的 List集合
                List<Object> list = ImportExcelUtil.importExcelX(fis, basicProductMsg);
                for (Object objects : list) {
                    BasicProductMsg bpmo = (BasicProductMsg) objects;
                    //判断新增的记录数据表是否已经包含
                    if(basicProductMsgService.DetctBasicProductMsg(bpmo).size()!= 0){
                        continue;
                    }
                    basicProductMsgService.addBasicProductMsg(StringUtil.objectToMap(objects));
                }
                //关闭输入流
                fis.close();
                returnStr = "Data import success";
            } catch (Exception e) {
                e.printStackTrace();
                returnStr = "Data import failure";
            }
        }
        return  StringUtil.returnPopover(returnStr,"/mainMate/productInform?a");
    }

ImportExxcelUtil.java

import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
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 com.alibaba.fastjson.JSON;
import com.sd.xm003.model.User;

/**
 * 导入Excel表格的工具类
 */
public class ImportExcelUtil {
	/**
	 * POI:解析Excel文件中的数据并把每行数据封装成一个实体 
	 * @param filePath 文件绝对路径
	 * @return List<Object> Excel中数据封装实体的集合 
	 */
	public static List<Object> importExcelX(FileInputStream fis,Object object){
		
		List<Object> objects =new ArrayList<Object>();
		Workbook wookbook = null;
		Cell cell = null;
		String json ="";
		//FileInputStream fis =null;
		
		//创建Excel工作簿
		try {
			//得到文件输入流对象
			//fis = new FileInputStream(filePath);
			//2007版本的excel,用.xlsx结尾
			wookbook = new XSSFWorkbook(fis);//得到工作簿
			fis.close();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		
		//得到第一个工作表
		Sheet sheet = wookbook.getSheetAt(0);
		
        //获得表头
        Row rowHead = sheet.getRow(0);
        //得到表头列数
        int heads =rowHead.getPhysicalNumberOfCells();
        String[] headers = new String[heads];//表头
        //遍历表头存放在数组中
        for(int i =0; i<heads; i++){
        	cell =rowHead.getCell(i);
        	headers[i] =cell.getStringCellValue();
        }
        
        //获得数据的总行数
        int totalRowNum = sheet.getLastRowNum();
        
        //遍历表格数据,生成对应
        for (int i = 1; i <= totalRowNum; i++) {
        	Row rowDate =sheet.getRow(i);
        	for(int j = 0; j<heads; j++){
        		cell =rowDate.getCell(j);
        		String value =getCellValue(cell);
        		//String value =cell.getStringCellValue();
        		String head =headers [j];
        		if(j !=heads-1){
        			json = json+"\""+head+"\""+":"+"\""+value+"\""+",";
        		}
        		if(j ==heads-1){
        			json = json+"\""+head+"\""+":"+"\""+value+"\"";
        		}
        	}
        	//生成单个json数据
    		json = "{"+json+"}";
    		object = JSON.parseObject(json,object.getClass());
    		objects.add(object);
        	json ="";
		}
        
		return objects;
	}
	
	//判断从Excel文件中解析出来数据的格式   
    private static String getCellValue(Cell cell){   
        String value = null;   
        //日期格式化  
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        if(cell == null || cell.equals("") || cell.getCellType() ==HSSFCell.CELL_TYPE_BLANK){
        	value = null;
        	return value;
        }
        
        //简单的查检列类型   
        switch(cell.getCellType())   
        {   
            case Cell.CELL_TYPE_STRING://字符串   
                value = cell.getRichStringCellValue().getString();
                value = StringUtil.convertNull(value);
                break;   
            case Cell.CELL_TYPE_NUMERIC://数字   
            	//判断是否是日期类型
            	if(DateUtil.isCellDateFormatted(cell)){
            		Date date =cell.getDateCellValue();
            		//格式化日期类型
            		value = sdf.format(date);//.toString();
            		break;  
            	}
                long dd = (long)cell.getNumericCellValue();   
                value = dd+"";   
                break;   
            case Cell.CELL_TYPE_BLANK:   
                value = "";   
                break;      
            case Cell.CELL_TYPE_FORMULA:   
                value = String.valueOf(cell.getCellFormula());   
                break;   
            case Cell.CELL_TYPE_BOOLEAN://boolean型值   
                value = String.valueOf(cell.getBooleanCellValue());   
                break; 
            case Cell.CELL_TYPE_ERROR:   
                value = String.valueOf(cell.getErrorCellValue());   
                break;   
            default:   
                break;   
        }   
        return value;
    }

	public static void main(String[] args) {
		User user =new User();
		String filePath ="D:\\123.xlsx";

		List<Object> objects =importExcelX(filePath,user);
		List<User> users =new ArrayList<User>();
		for (Object object : objects) {
			users.add((User)object);
		}
		for (User user2 : users) {
			System.out.println(user2.toString());
		}
	}
}


StringUtil.java

 /**
     * 返回给前端的提示框
     * @param content  弹窗内容
     * @param url      返回地址
     * @return(返回中文会乱码)
     */
    public static String returnPopover(String content,String url){
        String str = "<!doctype html><html lang=\"en\">" +
                "<head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /></head>" +
                "<body>" +
                "<script>alert(\"" + content + "\"),location.href=\""+url+"\";</script>" +
                "</body></html>";
        return str;
    }

实体类

import java.util.Date;

public class BasicProductMsg {
    private Integer id;
    private String productNo;
    private String productName;
    private String figureNo;
    private String model;
    private String unit;
    private String venderFigureNo;
    private String customer;
    private String remarks;
    private String companyFlag;
    private String operator;
    private String operatingTime;
    private String flag;
    private Integer minStock;        
    private Integer maxStock;       
    private Integer unitPackageNumber; 
    private Integer number; 


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getProductNo() {
        return productNo;
    }

    public void setProductNo(String productNo) {
        this.productNo = productNo == null ? null : productNo.trim();
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName == null ? null : productName.trim();
    }

    public String getFigureNo() {
        return figureNo;
    }

    public void setFigureNo(String figureNo) {
        this.figureNo = figureNo == null ? null : figureNo.trim();
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model == null ? null : model.trim();
    }

    public String getUnit() {
        return unit;
    }

    public void setUnit(String unit) {
        this.unit = unit == null ? null : unit.trim();
    }

    public String getVenderFigureNo() {
        return venderFigureNo;
    }

    public void setVenderFigureNo(String venderFigureNo) {
        this.venderFigureNo = venderFigureNo == null ? null : venderFigureNo.trim();
    }

    public String getCustomer() {
        return customer;
    }

    public void setCustomer(String customer) {
        this.customer = customer == null ? null : customer.trim();
    }

    public String getRemarks() {
        return remarks;
    }

    public void setRemarks(String remarks) {
        this.remarks = remarks == null ? null : remarks.trim();
    }

    public String getCompanyFlag() {
        return companyFlag;
    }

    public void setCompanyFlag(String companyFlag) {
        this.companyFlag = companyFlag == null ? null : companyFlag.trim();
    }

    public String getOperator() {
        return operator;
    }

    public void setOperator(String operator) {
        this.operator = operator == null ? null : operator.trim();
    }

    public String getOperatingTime() {
        return operatingTime;
    }

    public void setOperatingTime(String operatingTime) {
        this.operatingTime = operatingTime;
    }

    public String getFlag() {
        return flag;
    }

    public void setFlag(String flag) {
        this.flag = flag == null ? null : flag.trim();
    }

    public Integer getMinStock() {
        return minStock;
    }

    public void setMinStock(Integer minStock) {
        this.minStock = minStock;
    }

    public Integer getMaxStock() {
        return maxStock;
    }

    public void setMaxStock(Integer maxStock) {
        this.maxStock = maxStock;
    }

    @Override
    public String toString() {
        return "BasicProductMsg{" +
                "id=" + id +
                ", productNo='" + productNo + '\'' +
                ", productName='" + productName + '\'' +
                ", figureNo='" + figureNo + '\'' +
                ", model='" + model + '\'' +
                ", unit='" + unit + '\'' +
                ", venderFigureNo='" + venderFigureNo + '\'' +
                ", customer='" + customer + '\'' +
                ", remarks='" + remarks + '\'' +
                ", companyFlag='" + companyFlag + '\'' +
                ", operator='" + operator + '\'' +
                ", operatingTime='" + operatingTime + '\'' +
                ", flag='" + flag + '\'' +
                ", minStock=" + minStock +
                ", maxStock=" + maxStock +
                '}';
    }

    public Integer getUnitPackageNumber() {
        return unitPackageNumber;
    }

    public void setUnitPackageNumber(Integer unitPackageNumber) {
        this.unitPackageNumber = unitPackageNumber;
    }

    public Integer getNumber() {
        return number;
    }

    public void setNumber(Integer number) {
        this.number = number;
    }
}


导入的文件列头要和实体类一样,如果要列头是中文在就在帮助类58行下面写一个判断如果 headers[j] =“苹果”,name head = "apple"



猜你喜欢

转载自blog.csdn.net/javareact/article/details/78049281