1. 程式人生 > >利用poi從excel中匯入資料到資料庫

利用poi從excel中匯入資料到資料庫

最近遇到了從excel向資料庫匯入資料的情況,利用POI技術實現資料的匯入:

前臺頁面程式碼如下:

<input type="file" name="" id="file" style="width: 165px">
<button type="button" onclick="improtMessage()" style="width: 48px">匯入</button>
<button type="button" onclick="exportMessage()" style="width: 48px">匯出</button>
<button type="button" onclick="dowloadMessage()" style="width: 70px">模板下載</button>

前臺js程式碼:
/**
 * 匯入配置
 */
function improtMessage() {
	$.messager.confirm('提示','確定您要匯入配置?',function(r){
		if (r){
			var fileName=$('#file').val();
			var file=fileName.split(".")[0];
		
			$('#file').attr("name",$('#file').val());
			$.ajaxFileUpload({
				url: path+'/systemConfigureController/importSysConfig.do',
				secureuri: false,//非同步
				fileElementId: 'file',//上傳控制元件ID
				dataType: 'text',//返回的資料資訊格式
				success: function(data){
					$.messager.alert('提示','匯入配置成功!');
					if(file == "小區"){
						selectVillageMessage();						
					}if(file == "國家地區碼"){
						selectCountryMessage();					
					}if(file == "位置區"){
						selectPositionMessage();					
					}if(file == "終端資訊"){
						selectIMEIMessage();					
					}
				}
			})
		}
	});
}

控制層程式碼如下:
/**
	 * 匯入配置
	 * @param request
	 * @param response
	 * @throws IOException
	 */

	@RequestMapping("importSysConfig")
	public void importData(HttpServletRequest request, HttpServletResponse response) throws IOException{
		logger.info("**********into method importData*************");
		// 設定上下文
	    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
	        request.getSession().getServletContext());
	    // 檢查form是否有enctype="multipart/form-data"
	    if (multipartResolver.isMultipart(request)) {
	    	MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
	    	Iterator<String> iter = multiRequest.getFileNames();
	    	while (iter.hasNext()) {
	    		List objList = new ArrayList();
	    		MultipartFile file = multiRequest.getFile(iter.next());
	    		logger.info("print out file:  "+file+"  fileName:  "+file.getName()+" fileSize: "+file.getSize());
    			version = (file.getName().endsWith(".xls") ? version2003 : version2007);
    			if (version == 2003) {
    				 POIFSFileSystem fs = new POIFSFileSystem(file.getInputStream());  
                     HSSFWorkbook wb = new HSSFWorkbook(fs);  
                     HSSFSheet sheet = wb.getSheetAt(0); 
                     readObject(file.getName(), sheet);
                     logger.info("print out readExcel: " + objList);
    			}else if (version == 2007){
    				XSSFWorkbook hwk = new XSSFWorkbook(file.getInputStream());// 將is流例項到 一個excel流裡
    				XSSFSheet sheet = hwk.getSheetAt(0);// 得到book第一個工作薄sheet
    				readObject(file.getName(), sheet);
    				logger.info("print out readExcel: " + objList);
    			}
	    	}
	    }
	    response.getWriter().print("1");

	}
	
	/**
	 * 根據不同的excle表名,呼叫不同的讀取方法
	 * @param name
	 * @param sheet
	 * @return
	 */
	public void readObject(String name, Sheet sheet){
		List objList = new ArrayList();
		String _name = name.substring(0, name.indexOf("."));
		if (_name.equals("國家地區碼")){
			objList = readCountryExcel(sheet);
			systemConfigureService.addCountryMEessage(objList);
		}
		else if (_name.equals("位置區")){
			objList = readPositionExcel(sheet);
			systemConfigureService.addPositionMessage(objList);
		}
		else if(_name.equals("小區")){
			objList = readVillageExcel(sheet);
			systemConfigureService.addVillageMessage(objList);
		}
		else if(_name.equals("終端資訊")){
			objList = readIMEIExcel(sheet);
			systemConfigureService.addIMEIMessage(objList);
		}
	}
	

/**
	 * 1讀取國家地區碼excel表格
	 * @param sheet
	 * @return
	 */
	public List<Country> readCountryExcel(Sheet sheet){
		List<Country> countryList = new ArrayList<Country>();
		 int rowNum = sheet.getPhysicalNumberOfRows();  //獲得總共的行數
		 Country country = null;
		 for (int i =1; i<rowNum; i++){
			 country = new Country();
			 Row row = sheet.getRow(i);   //得到第i行資料
			 Cell c = null;
			 if (null != row){
				 c = row.getCell(0);
				 if (null != c){
					 if (c.getCellType() == c.CELL_TYPE_NUMERIC) {
						 c.setCellType(c.CELL_TYPE_STRING);
						 country.setCountry(c.getStringCellValue());
					 }else{
						 country.setCountry(c.getStringCellValue());
					 }
				 }
				 c = row.getCell(1);
				 if (null != c){
					 if (c.getCellType() == c.CELL_TYPE_NUMERIC) {
						 c.setCellType(c.CELL_TYPE_STRING);
						 country.setProvince(c.getStringCellValue());
					 }else {
						 country.setProvince(c.getStringCellValue());
					 }
				 }
				 c = row.getCell(2);
				 if (null != c){
					 if (c.getCellType() == c.CELL_TYPE_NUMERIC) {
						 c.setCellType(c.CELL_TYPE_STRING);
						 country.setZone(c.getStringCellValue());
					 }else {
						 country.setZone(c.getStringCellValue());
					 }
				 }
				 c = row.getCell(3);
				 if (null != c){
					 if (c.getCellType() == c.CELL_TYPE_NUMERIC) {
						 c.setCellType(c.CELL_TYPE_STRING);
						 country.setCode(c.getStringCellValue());
					 }else {
						 country.setCode(c.getStringCellValue());
					 }
				 }
			 }
			 countryList.add(country);
			 logger.info("print out read Excel row" + i + "Country: " + country);
		 }
		return countryList;
	}
	
	/**
	 * 2.讀取位置區excel表格
	 * @param sheet
	 * @return
	 */
	public List<Position> readPositionExcel(Sheet sheet){
		List<Position> positionList = new ArrayList<Position>();
		 int rowNum = sheet.getPhysicalNumberOfRows();  //獲得總共的行數
		 Position position = null;
		 for (int i =1; i<rowNum; i++){
			 position = new Position();
			 Row row = sheet.getRow(i);   //得到第i行資料
			 Cell c = null;
			 if (null != row){
				 c = row.getCell(0);
				 if (null != c){
					 if (c.getCellType() == c.CELL_TYPE_NUMERIC) {
						 c.setCellType(c.CELL_TYPE_STRING);
						 position.setArea(c.getStringCellValue());
					 }else {
						 position.setArea(c.getStringCellValue());
					 }
				 }
				 c = row.getCell(1);
				 if (null != c){
					 if (c.getCellType() == c.CELL_TYPE_NUMERIC) {
						 c.setCellType(c.CELL_TYPE_STRING);
						 position.setPosition_code(c.getStringCellValue());
					 }else {
						 position.setPosition_code(c.getStringCellValue());
					 }
				 }
				 c = row.getCell(2);
				 if (null != c){
					 if (c.getCellType() == c.CELL_TYPE_NUMERIC) {
						 c.setCellType(c.CELL_TYPE_STRING);
						 position.setPosition_name(c.getStringCellValue());
					 }else {
						 position.setPosition_name(c.getStringCellValue());
					 }
					 
				 }
			 }
			 positionList.add(position);
			 logger.info("print out read Excel row" + i + "position: " + position);
		 }
		return positionList;
	}
	
	/**
	 * 3.讀取小區excel表格
	 * @param sheet
	 * @return
	 */
	public List<Village> readVillageExcel(Sheet sheet){
		StringBuffer sss=null;
		List<Village> villageList = new ArrayList<Village>();
		int rowNum = sheet.getPhysicalNumberOfRows();  //獲得總共的行數
		   for(int i = 1; i<rowNum; i++){            
			   Row row = sheet.getRow(i);  //得到第i行資料         
			   int cols = row.getLastCellNum();  // 該行的總列數      
			   String[] str = new String[cols];   // 用來存放該行每一列的值    
			   for (int j = 0; j < cols; j++) {               
				   Object col = row.getCell((short)j);   
				   if (null != col){
					   str[j] = col.toString();          
				   }else{
					   str[j] = "";
				   }
				 	  
			   }  
			   Village v = new Village(str); 
			   logger.info("print out read String[] str" +  "str: " + Arrays.toString(str));
			   villageList.add(v);
		   }
		return villageList;
	}
	
	/**
	 * 4.讀取終端資訊excel表格
	 * @param sheet
	 * @return
	 */
	public List<IMEI> readIMEIExcel(Sheet sheet){
		List<IMEI> IMEIList = new ArrayList<IMEI>();
		 int rowNum = sheet.getPhysicalNumberOfRows();  //獲得總共的行數
		 IMEI _imei = null;
		 for (int i =1; i<rowNum; i++){
			 _imei = new IMEI();
			 Row row = sheet.getRow(i);   //得到第i行資料
			 Cell c = null;
			 if (null != row){
				 c = row.getCell(0);
				 if (null != c){
					 if (c.getCellType() == c.CELL_TYPE_NUMERIC){
						 c.setCellType(c.CELL_TYPE_STRING);
						 _imei.setIMEI(c.getStringCellValue());
					 }else{
						 _imei.setIMEI(c.getStringCellValue());
					 }
				 }
				 c = row.getCell(1);
				 if (null != c){
					 if (c.getCellType() == c.CELL_TYPE_NUMERIC){
						 c.setCellType(c.CELL_TYPE_STRING);
						 _imei.setImei_version(c.getStringCellValue());
					 }else{
						 _imei.setImei_version(c.getStringCellValue());
					 }
				 }
				 c = row.getCell(2);
				 if (null != c){
					 if (c.getCellType() == c.CELL_TYPE_NUMERIC){
						 c.setCellType(c.CELL_TYPE_STRING);
						 _imei.setImei_name(c.getStringCellValue());
					 }else{
						 _imei.setImei_name(c.getStringCellValue());
					 }
				 }
				 c = row.getCell(3);
				 if (null != c){
					 if (c.getCellType() == c.CELL_TYPE_NUMERIC){
						 c.setCellType(c.CELL_TYPE_STRING);
						 _imei.setImei_factory_name(c.getStringCellValue());
					 }else{
						 _imei.setImei_factory_name(c.getStringCellValue());
					 }
					 
				 }
			 }
			 IMEIList.add(_imei);
			 logger.info("print out read Excel row" + i + "_imei: " + _imei);
		 }
		return IMEIList;
	}
}

servicedao的程式碼:
public void addCountryMEessage(List<Country> list);
	public void addIMEIMessage(List<IMEI> list);
	public void addPositionMessage(List<Position> list);
	public void addVillageMessage(List<Village> list);

servicedaoimpl的程式碼:

@Override
	public void addCountryMEessage(List<Country> list) {
		countryDao.addCountryMessage(list);
		
	}

	@Override
	public void addIMEIMessage(List<IMEI> list) {
		
		imeiDao.addIMEIMessage(list);
		
	}

	@Override
	public void addPositionMessage(List<Position> list) {
		positionDao.addPositionMessage(list);
		
	}

	@Override
	public void addVillageMessage(List<Village> list) {
		villageDao.addVillageMessage(list);
		
	}

xml中sql的程式碼如下:

<!-- 向資料庫imei中插入資料 -->
	<insert id="addIMEIMessage" parameterType="java.util.List">
		insert into imei 
		(IMEI, imei_version, imei_name, imei_factory_name)
		values
		<foreach collection="list" item="item" index="index" separator="," >
			(#{item.IMEI}, #{item.imei_version}, #{item.imei_name}, #{item.imei_factory_name})
		</foreach>
	</insert>