1. 程式人生 > >java匯入excel模板中的資料到資料庫

java匯入excel模板中的資料到資料庫

一、前臺頁面其實就是一個檔案的上傳的模板

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ include file="/common/include/init.jsp"%>
<c:set var="now" value="<%=new java.util.Date()%>" />
<html>
<head>
<title>批量匯入被調查人員資訊</title>
<link rel="stylesheet" type="text/css" href="${ctx}/plugins/jquery-easyui/themes/default/easyui.css" />
<link rel="stylesheet" type="text/css" href="${ctx}/plugins/jquery-easyui/themes/icon.css" />
<script type="text/javascript" src="${ctx}/plugins/form/jquery.form.js"></script>
<script language="javascript" type="text/javascript" src="${ctx}/plugins/My97DatePicker/WdatePicker.js"></script>
<script type="text/javascript" src="${ctx}/plugins/jquery-easyui/jquery.easyui.min.js"></script>
<%@ include file="/common/include/common_rkSelect.jsp"%>
<script type="text/javascript" src="${ctx}/plugins/autocomplete/jquery.autocomplete.js"></script>
<link   rel="stylesheet" href="${ctx}/plugins/autocomplete/jquery.autocomplete.css"  /> 
<script src="<c:url value='/plugins/form/jquery.form.js' />"></script>
<script src="${ctx}/plugins/layer/layer.js"></script>
<script type="text/javascript">
	$(function(){
		$("#uploadEventBtn").unbind("click").bind("click", function() {
			$("#uploadEventFile").click();
		});
		$("#uploadEventFile").bind("change", function() {
			$("#uploadEventPath").attr("value",	$("#uploadEventFile").val());
		});
	})
	function save() {
		var uploadEventFile = $("#uploadEventFile").val();
		if (uploadEventFile == '') {
			alert("請擇excel,再上傳");
		} else if (uploadEventFile.lastIndexOf(".xls") < 0) {//可判斷以.xls和.xlsx結尾的excel  
			alert("只能上傳Excel檔案");
		} 
		var formData = new FormData($('form')[0]);
		$.ajax({
			type:"POST",
			url:"<%=service_domain%>/satisfy/satbeExam/addbatch",
			data:formData,
			cache : false,
            contentType : false,
            processData : false,
			success:function(data){
				var result = data;
				var api = frameElement.api, w = api.opener;
				w.$.dialog.alert(result.message, function(){
					frameElement.api.opener.refresh();
				})
			},
			error:function(xhr,status,err){
				alert("error");
				console.log(err);
			}
		});
	}
</script>
</head>
<body>
<br />
 <div class="popWin_w">
 <form enctype="multipart/form-data" id="batchUpload"  action="" method="post" class="form-horizontal">  
 	<table class="table_s2">
 		<tr>
 			<td width="18%" align="center"> 
				Excel模板:
			</td>
			<td width="32%" align="left">
				<input type="file" name="file"  style="width:0px;height:0px;" id="uploadEventFile"/> 
				<input id="uploadEventPath"  disabled="disabled"  type="text" placeholder="請選擇excel表" style="border: 1px solid #e6e6e6; height: 26px;width: 200px;" /> 
			</td>
			<td>
				<button class="btn btn-success btn-xs" id="uploadEventBtn" style="height:26px;"  type="button" >選擇檔案</button>  
			</td>
		</tr>
	</table>
</form>
	<div class="table_s2_btns">
		<button type="button" class="button_com hand_icon button_save orange_back" onClick="save();" style="margin-right: 20px;">
			<span><span><span class="ok">批量匯入</span> </span> </span>
		</button>
	</div>
</div>
</body>
</html>

後臺的controller

/**
	 * 批量匯入
	 */
	@RequestMapping("/addbatch")
	@ApiOperation(value = "批量匯入人員資訊", httpMethod = "POST", 
	    consumes="application/json;charset=UFT-8",produces="application/json;charset=UFT-8",
	    notes = "批量匯入人員資訊")
	public Map<String, Object> addbatch(@ApiParam(name="file",value="檔案",required=true) MultipartFile file){
		Map<String, Object> map = new HashMap<String, Object>();
        String result = manager.readExcelFile(file);  
        map.put("message", result);
        return map;  
	}

service層

@SuppressWarnings("unused")
	public String readExcelFile(MultipartFile file) {
		// TODO Auto-generated method stub
		String result = "";  
        //建立處理EXCEL的類  
        ReadExcel readExcel = new ReadExcel();  
        //解析excel,獲取上傳的事件單  
        List<Map<String, Object>> beExamList = readExcel.getExcelInfo(file);  
        //至此已經將excel中的資料轉換到list裡面了,接下來就可以操作list,可以進行儲存到資料庫,或者其他操作,  
        for(Map<String, Object> modal:beExamList){
        	SatBeExam entity = new SatBeExam();
        	entity.setCommunity((String)modal.get("community"));
        	entity.setName((String)modal.get("name"));
        	entity.setPhone((String)modal.get("phone"));
        	entity.setStreet((String)modal.get("street"));
        	entity.setDept_name((String)modal.get("dept_name"));
        	entity.setIdcard((String)modal.get("idcard"));
        	entity.setRemark((String)modal.get("remark"));
        	entity.setDept_id((String)modal.get("dept_id"));
        	if(entity != null){
        		dao.save(entity);
        		result = "插入資料庫成功";
        	}else{
        		result = "插入資料庫是失敗";
        	}
        }
        return result;  
	}

dao層就不往出貼了

還有一個相當於工具的方法

package com.rockontrol.satisfy.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;
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;

public class ReadExcel {

	// 總行數
    private int totalRows = 0;
    // 總條數
    private int totalCells = 0;
    // 錯誤資訊接收器
    private String errorMsg;

    // 構造方法
    public ReadExcel() {
    }

    // 獲取總行數
    public int getTotalRows() {
        return totalRows;
    }

    // 獲取總列數
    public int getTotalCells() {
        return totalCells;
    }

    // 獲取錯誤資訊
    public String getErrorInfo() {
        return errorMsg;
    }

    /**
     * 讀EXCEL檔案,獲取資訊集合
     * 
     * @param fielName
     * @return
     */
    public List<Map<String, Object>> getExcelInfo(MultipartFile mFile) {
        String fileName = mFile.getOriginalFilename();// 獲取檔名
//        List<Map<String, Object>> userList = new LinkedList<Map<String, Object>>();
        try {
            if (!validateExcel(fileName)) {// 驗證檔名是否合格
                return null;
            }
            boolean isExcel2003 = true;// 根據檔名判斷檔案是2003版本還是2007版本
            if (isExcel2007(fileName)) {
                isExcel2003 = false;
            }
            return createExcel(mFile.getInputStream(), isExcel2003);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 根據excel裡面的內容讀取客戶資訊
     * 
     * @param is      輸入流
     * @param isExcel2003   excel是2003還是2007版本
     * @return
     * @throws IOException
     */
    public List<Map<String, Object>> createExcel(InputStream is, boolean isExcel2003) {
        try {
            Workbook wb = null;
            if (isExcel2003) {// 當excel是2003時,建立excel2003
                wb = new HSSFWorkbook(is);
            } else {// 當excel是2007時,建立excel2007
                wb = new XSSFWorkbook(is);
            }
            return readExcelValue(wb);// 讀取Excel裡面客戶的資訊
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 讀取Excel裡面客戶的資訊
     * 
     * @param wb
     * @return
     */
    private List<Map<String, Object>> readExcelValue(Workbook wb) {
        // 得到第一個shell
        Sheet sheet = wb.getSheetAt(0);
        // 得到Excel的行數
        this.totalRows = sheet.getPhysicalNumberOfRows();
        // 得到Excel的列數(前提是有行數)
        if (totalRows > 1 && sheet.getRow(0) != null) {
            this.totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
        }
        List<Map<String, Object>> userList = new ArrayList<Map<String, Object>>();
        // 迴圈Excel行數
        for (int r = 1; r < totalRows; r++) {
            Row row = sheet.getRow(r);
            if (row == null) {
                continue;
            }
            // 迴圈Excel的列
            Map<String, Object> map = new HashMap<String, Object>();
            for (int c = 0; c < this.totalCells; c++) {
                Cell cell = row.getCell(c);
                if (null != cell) {
                    if (c == 0) {
                        // 如果是純數字,比如你寫的是25,cell.getNumericCellValue()獲得是25.0,通過擷取字串去掉.0獲得25
                        if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
                            String name = String.valueOf(cell.getNumericCellValue());
                            map.put("name", name.substring(0, name.length() - 2 > 0 ? name.length() - 2 : 1));// 名稱
                        } else {
                            map.put("name", cell.getStringCellValue());// 名稱
                        }
                    } else if (c == 1) {
                        if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
                            String dept_name = String.valueOf(cell.getNumericCellValue());
                            map.put("dept_name",dept_name.substring(0, dept_name.length() - 2 > 0 ? dept_name.length() - 2 : 1));// 
                        } else {
                            map.put("dept_name",cell.getStringCellValue());// 性別
                        }
                    } else if (c == 2) {
                        if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
                            String street = String.valueOf(cell.getNumericCellValue());
                            map.put("street", street.substring(0, street.length() - 2 > 0 ? street.length() - 2 : 1));// 
                        } else {
                            map.put("street", cell.getStringCellValue());// 
                        }
                    }else if(c == 3){
                    	if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
                            String community = String.valueOf(cell.getNumericCellValue());
                            map.put("community", community.substring(0, community.length() - 2 > 0 ? community.length() - 2 : 1));// 
                        } else {
                            map.put("community", cell.getStringCellValue());// 
                        }
                    }else if(c == 4){
                    	if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
                            String phone = String.valueOf(cell.getNumericCellValue());
                            map.put("phone", phone.substring(0, phone.length() - 2 > 0 ? phone.length() - 2 : 1));// 
                        } else {
                            map.put("phone", cell.getStringCellValue());// 
                        }
                    }else if(c == 5){
                    	if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
                            String idcard = String.valueOf(cell.getNumericCellValue());
                            map.put("idcard", idcard.substring(0, idcard.length() - 2 > 0 ? idcard.length() - 2 : 1));// 
                        } else {
                            map.put("idcard", cell.getStringCellValue());// 
                        }
                    }else if(c == 6){
                    	if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
                            String remark = String.valueOf(cell.getNumericCellValue());
                            map.put("remark", remark.substring(0, remark.length() - 2 > 0 ? remark.length() - 2 : 1));// 
                        } else {
                            map.put("remark", cell.getStringCellValue());// 
                        }
                    }
                }
            }
            // 新增到list
            userList.add(map);
        }
        return userList;
    }

    /**
     * 驗證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)$");
    }
    
}

到此,匯入完成。

excel模板如下

姓名 行政區劃 街道 社群 電話 身份證號 備註
11 222 33 44 55 66 77
張三 北京 海淀 大悟 1111111 2222222 33333
張三 北京 海淀 大悟 1111111 2222222 33333
張三 北京 海淀 大悟 1111111 2222222 33333
張三 北京 海淀 大悟 1111111 2222222 33333
張三 北京 海淀 大悟 1111111 2222222 33333