Java使用XSSFWorkbook进行excel表格的上传,并将excel中的数据保存到数据库

最近因工作需要上传excel表格,并将表格的数据上传到数据库,我是使用了XSSFWorkbook这个工作表进行的上传,

废话少说,直接上代码

前端html




 

js请求代码

function inspect(){
  var fileObj = document.getElementById("loadfile").files[0];
        if(fileObj == undefined){
            alert('请先选择上传文件');
            return false;
        }
        layer.msg("上传中",{time:10000});
        var formData = new FormData($('#uploadForm')[0]);
			$.ajax({
            url:"/device/uploadDevice",
            type:"post",
            data:formData,
            processData:false,
            contentType:false,
            success:function(data){
                if(data.state){
                    alert("上传成功")
                    window.location.reload();
                }else {
                    alert("上传失败")
                }
            }
        });

后台控制层代码Controller 这里使用MultipartFile接收file文件,JsonResult是我自己定义的一个Json返回类型,接收到file文件后判断是否为空,然后执行代码,将file先转file,再将file转为XSSFWorkbook类型,这样方便获取行和列的元素,获取每一单元格的元素保存到list<对象>中的属性中,其中有时间格式的数据,excel表中的时间数据默认是使用数字保存的,所以先使用HSSFDateUtil.getJavaDate(purchaseTime.getNumericCellValue());获取excel的时间数据,然后转换为Date类型的数据,在转为指定的字符串数据,然后交给service层处理进行数据插入。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = HSSFDateUtil.getJavaDate(purchaseTime.getNumericCellValue());
 device.setPurchaseTime(sdf.format(date));

@RequestMapping(value ="/device/uploadDevice",method=RequestMethod.POST)
	@ResponseBody
	public JsonResult  uploadDevice(@RequestParam("file") MultipartFile file,HttpServletRequest request, HttpServletResponse response)throws Exception{
		
		JsonResult j=new JsonResult();
		//List> list = new ArrayList>();
        if (!file.isEmpty()) {
        	//boolean FLAG;//身份状态
        	int result=0;
    		List list = new ArrayList();
    		XSSFWorkbook workbook =null;
    		
    		//把MultipartFile转化为File
    		File fo=MultipartFileToFile(file);
    		FileInputStream fileInputStream = new FileInputStream(fo);  
    		//创建Excel,读取文件内容
    		workbook = new XSSFWorkbook(fileInputStream);
    		 //System.out.println("Workbook对象:" + workbook);
    		//获取第一个工作表
    		XSSFSheet sheet =  workbook.getSheetAt(0);
    		//获取sheet中第一行行号
    		int firstRowNum = sheet.getFirstRowNum();
    		//获取sheet中最后一行行号
    		int lastRowNum = sheet.getLastRowNum();
    		
    		try {
    			//循环插入数据
    			for(int i=firstRowNum+2;i<=lastRowNum;i++){//因为表格中第一行为标题,第二行为列标题
    				XSSFRow row = sheet.getRow(i);
    				Device device = new Device();
    					//第一列
    				XSSFCell deviceNo = row.getCell(0);//设备编码
    				if(deviceNo!=null){
    					deviceNo.setCellType(Cell.CELL_TYPE_STRING);
    					device.setDeviceNo(deviceNo.getStringCellValue());
    				}
    				//第二列
    				XSSFCell deviceName = row.getCell(1);//设备名称
    				if(deviceName!=null){
    					deviceName.setCellType(Cell.CELL_TYPE_STRING);
    					device.setDeviceName(deviceName.getStringCellValue());
    				}
    				//第三列
    				XSSFCell deviceModel = row.getCell(2);//规格型号
    				if(deviceModel!=null){
    					deviceModel.setCellType(Cell.CELL_TYPE_STRING);
    					device.setDeviceModel(deviceModel.getStringCellValue());
    				}
    				XSSFCell supplier = row.getCell(3);//供应商 SUPPLIER
    				if(supplier!=null){
    					supplier.setCellType(Cell.CELL_TYPE_STRING);
    					device.setSupplier(supplier.getStringCellValue());
    				}
     				XSSFCell factoryName = row.getCell(4);//生产厂家  FACTORY_NAME
    				if(factoryName!=null){
    					factoryName.setCellType(Cell.CELL_TYPE_STRING);
    					device.setFactoryName(factoryName.getStringCellValue());
    				}
    				XSSFCell departId = row.getCell(5);//使用部门 departId
    				if(departId!=null){
    					departId.setCellType(Cell.CELL_TYPE_STRING);
    					device.setDepartId(departId.getStringCellValue());
    				}
    				XSSFCell deviceGroupId = row.getCell(6);//分组名称 DEVICE_GROUP_ID
    				if(deviceGroupId!=null){
    					deviceGroupId.setCellType(Cell.CELL_TYPE_STRING);
    					device.setDeviceGroupId(deviceGroupId.getStringCellValue());
    				}

    				XSSFCell installPlace = row.getCell(7);//安装地点 DEVICE_GROUP_ID
    				if(installPlace!=null){
    					installPlace.setCellType(Cell.CELL_TYPE_STRING);
    					device.setInstallPlace(installPlace.getStringCellValue());
    				}
    				XSSFCell useStatus = row.getCell(8);//使用状态 USE_STATUS
    				if(useStatus!=null){
    					useStatus.setCellType(Cell.CELL_TYPE_STRING);
    					String status=useStatus.getStringCellValue();
    					// when '0' then '使用中' when '1' then '闲置' when '2' then '维修中' when '3' then '报废' else '其他' end as use_status,
    					if("使用中".equals(status)){
    						device.setUseStatus("0");
    					}else if("闲置".equals(status)){
    						device.setUseStatus("1");
    					}else if("维修中".equals(status)){
    						device.setUseStatus("2");
    					}else{
    						device.setUseStatus("3");
    					}
    					
    				}
    				XSSFCell quantity = row.getCell(9);//设备数量 QUANTITY
    				if(quantity!=null){
    					quantity.setCellType(Cell.CELL_TYPE_STRING);
    					String a=quantity.getStringCellValue();
    					device.setQuantity(Integer.parseInt(a));
    				}
    				XSSFCell price = row.getCell(10);//设备价格 PRICE
    				if(price!=null){
    					price.setCellType(Cell.CELL_TYPE_STRING);
    					device.setPrice(Integer.parseInt(price.getStringCellValue()));
    				}
    				XSSFCell purchaseTime = row.getCell(11);//购置时间 PURCHASE_TIME yyyy-MM-dd HH:mm:ss
    				if(purchaseTime!=null){
    					SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    		            Date date = HSSFDateUtil.getJavaDate(purchaseTime.getNumericCellValue());
    					device.setPurchaseTime(sdf.format(date));
    				}
    				String createTime = DateDUtil.getTheCurrentTime();
    				String createDate = DateDUtil.getCurrentDate();
    				device.setCreateDate(createDate);
    				device.setCreateTime(createTime);
    				device.setPurchaseWay("厂商直销");
    				list.add(device);
    			}
    			result=deviceService.insertExcelDevice(list);//往数据库插入数据
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			workbook.close();
    		}
    		if(result>0){
    			 j.setState(true);
    			 j.setMessage("导入文件成功");
    			 j.setData("");
    		}else{
    			 j.setState(false);
    			 j.setMessage("导入文件失败");
    			 j.setData("");
    		}
           
	}else{
		 j.setState(false);
		 j.setMessage("导入文件为空");
		 j.setData("");
	}
	     return j;
	} 

因为接收的代码是MultipartFile类型的文件,需要转为File类型的文件,这里转换一下

 public static File MultipartFileToFile(MultipartFile multiFile) {
	        // 获取文件名
	        String fileName = multiFile.getOriginalFilename();
	        // 获取文件后缀
	        String prefix = fileName.substring(fileName.lastIndexOf("."));
	        // 用当前时间作为文件名,防止生成的临时文件重复
	        try {
	            File file = File.createTempFile(System.currentTimeMillis() + "", prefix);

	            multiFile.transferTo(file);

	            return file;
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	        return null;
	    }

service层数据处理,service的接口

	//将excel表中的数据保存到数据库中
	public int insertExcelDevice(List list) throws Exception;

接口实现层,serviceImpl,我这使用的是oracle数据库,使用的是foreach循环进行的插入:因为在excel保存的 是分组和部门名称,所以在保存之前,查询对应的分组和部门id保存到数据库总。

 //将excel表中的数据保存到数据库 
	@Override
	@Transactional
	public int insertExcelDevice(List list) throws Exception {
		//第一步,使用遍历list进行插入,值插入之前先deviceNo 
		int index=0;
		for (Device device : list) {
			//第二步,在插入之前查询数据库是否存在该对象 通过deviceNo
//	List listDevice=deviceMapper.selectDeviceByDeviceNO(device.getDeviceNo());
//			if(listDevice.size()>0){
//				//代表数据库中有该数据,结束这个循环
//				continue;
//			}
			//生成数据二位码
			Device de=chengDevice(device);
			//根据设备分组名称查询设备分组id
			List groupList=deviceGroupMapper.selectDeviceGroupbyName(device.getDeviceGroupId());
			if(groupList.size()>0){
				de.setDeviceGroupId(groupList.get(0).getDeviceGroupId());
			}
			List departsList=departMapper.selectDepartBydepartName(device.getDepartId());
			if(departsList.size()>0){
				de.setDepartId(departsList.get(0).getDepartId());
			}
			//进行数据插入
			index+=deviceMapper.insertDevice(device);
			
		}
		return index;
	}

因为每个对象都要根据id生成一个二维码来标记,所以我又单独写了一个方法进行生成对象的id和二维码图片

public Device chengDevice(Device device) throws Exception{
	
		// 新增设备 要根据设备id生成一个设备二维码图片
	    String deviceId=UUIDGenerator.getUUID();
		//产生4位长度的随机码(由字母和数字组成)
		String randomStr = StringDUtil.generateRandomCodeForLength(4);
		String name = DateDUtil.DateToStr(DateDUtil.yyyyMMddHHmmss, new Date()) + randomStr+".png";
		//生成二维码路径地址
		String fileName = StatusDefine.fileCodePath+name;//二维码存放路径
		//调用方法生成二维码图片地址
		QRCodeUtil.createQrCode(fileName,deviceId,device.getDeviceName());
				
		device.setDeviceId(deviceId);
		device.setQrCodePath(fileName);
		return device;
	
	}

 

后面的插入和查询的sql语句就展示了,都是正常的插入和查询语句,希望这个文章对大家有所帮助。

 

 

 

 

 

 

你可能感兴趣的:(后台,问题总结,excel上传,数据库)