Excel 報表導入導出

使用 Excel 進行報表的導入導出,首先下載相關的 jar 和 excel util。

Excel Util 下載地址

引入依賴:

<!-- poi office -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.9</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.9</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml-schemas</artifactId>
			<version>3.9</version>
		</dependency>

把相應的 jar 和 util 類放到項目中就可以在需要打印出來的實體類的get方法加上註解@ExcelField


Excel 報表數據模板下載代碼:

controller層:


/**
     * 下載導入Excel表信息數據模板
     */
    @RequiresPermissions("metermessage:meterMessage:view")
    @RequestMapping(value = "import/template")
    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes, String houseType) {
        try {
            meterMessageService.importFileTemplate(response);
            return null;
        } catch (Exception e) {
            addMessage(redirectAttributes, "導入模板下載失敗!失敗信息:" + e.getMessage());
        }
        return "redirect:" + Global.getAdminPath() + "/metermessage/meterMessage/?repage&houseType=" + houseType;
    }

service層:


//Excel表信息數據模板
	public void importFileTemplate(HttpServletResponse response) throws IOException {
		String fileName = "Excel表信息數據導入模板.xlsx";
        List<MeterMessage> list = Lists.newArrayList();
        MeterMessage meter = new MeterMessage();
        meter.setOfficeName("*****");
        meter.setUnitNumber("1");
        meter.setFloor("1");
        meter.setRoomNumber("01");
        meter.setMeterNo("001");
        meter.setRate(new Double(10));
        meter.setMeterTypeLabel("水錶");
        list.add(meter);
        new ExportExcel("Excel表信息數據", MeterMessage.class, 2).setDataList(list).write(response, fileName).dispose();
	}


Excel表信息導入代碼:

controller層:


/**
     * 導入Excel信息數據
     */
    @RequiresPermissions("metermessage:meterMessage:edit")
    @RequestMapping(value = "import", method = RequestMethod.POST)
    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes, String houseType) {
        if (Global.isDemoMode()) {
            addMessage(redirectAttributes, "演示模式,不允許操作!");
            return "redirect:" + Global.getAdminPath() + "/metermessage/meterMessage/?repage&houseType=" + houseType;
        }
        try {
            String message = meterMessageService.importFile(file);
            addMessage(redirectAttributes, message);
        } catch (Exception e) {
            addMessage(redirectAttributes, "導入Excel信息失敗!失敗信息:" + e.getMessage());
        }
        return "redirect:" + Global.getAdminPath() + "/metermessage/meterMessage/?repage&houseType=" + houseType;
    }


service層:



	//導入excel信息數據
	@Transactional(readOnly = false)
	public String importFile(MultipartFile file) throws Exception {
		int successNum = 0;
        int failureNum = 0;
        int row = 3;
        StringBuilder failureMsg = new StringBuilder();
        ImportExcel ei = new ImportExcel(file, 1, 0);
        List<MeterMessage> list = ei.getDataList(MeterMessage.class);
        Map<String, Object> map = new HashMap<String, Object>();// 去重複查詢用
        for (int i = 0; i < list.size(); i++) {
        	MeterMessage meter = list.get(i);
        	
        	String officeName = meter.getOfficeName();
        	String unitNumber = meter.getUnitNumber();
        	String floor = meter.getFloor();
        	String roomNumber = meter.getRoomNumber();
        	String meterTypeLabel = meter.getMeterTypeLabel();
        	String meterNo = meter.getMeterNo();
        	Double rate = meter.getRate();
        	
            if (StringUtils.isNoneBlank(officeName)) {
                if (!map.containsKey(officeName)) {
                    List<Office> officeList = officeDao.findOfficeByName(officeName);
                    if (officeList != null && officeList.size() > 0) {
                        meter.setOffice(officeList.get(0));
                        map.put(officeName, officeList.get(0));
                    } else {
                        failureMsg.append("<br/>第" + row + "行數據:小區' " + officeName
                                + "' 不存在,請先去'平臺設置-->單位管理'創建該小區 ;");
                        failureNum++;
                    }
                } else {
                    meter.setOffice((Office) (map.get(officeName)));
                }
            } else {
                failureMsg.append("<br/>第" + row + "行數據:小區 不可爲空 ");
                failureNum++;
            }
            
            String officeId = meter.getOffice().getId();
            if (StringUtils.isNoneBlank(officeId) && StringUtils.isNoneBlank(unitNumber) && StringUtils.isNoneBlank(floor) && StringUtils.isNoneBlank(roomNumber)) {
            	if(!map.containsKey(officeId+unitNumber+floor+roomNumber)) {
            		HouseInformation house = houseInformationDao.findHouseIdByCondition(officeId, unitNumber, floor, roomNumber);
            		if(house != null) {
            			meter.setHouse(house);
            			map.put(officeId+unitNumber+floor+roomNumber, house);
            		} else {
            			failureMsg.append("<br/>第" + row + "行數據:房屋' " + officeName
                                + "' 不存在;");
                        failureNum++;
            		}
            	} else {
            		meter.setHouse((HouseInformation) (map.get(officeId+unitNumber+floor+roomNumber)));
            	}
            } else {
            	failureMsg.append("<br/>第" + row + "行數據:房屋 不可爲空 ");
                failureNum++;
            }
            
            if (StringUtils.isNoneBlank(meterTypeLabel)) {
            	if(!map.containsKey(meterTypeLabel)) {
            		String meterType = DictUtils.getDictValue(meterTypeLabel, "meter_type", "1");
            		if (StringUtils.isNoneBlank(meterType)) {
            			meter.setMeterType(meterType);
            			map.put(meterTypeLabel, meterType);
                    } else {
                        failureMsg.append("<br/>第" + row + "行數據:儀表類型 '" + meterTypeLabel
                                + "' 不存在,請先去'平臺設置-->系統設置-->字典管理'創建該儀表類型 ");
                        failureNum++;
                    }
            	} else {
            		meter.setMeterType((String)(map.get(meterTypeLabel)));
            	}
            } else {
            	failureMsg.append("<br/>第" + row + "行數據:儀表類型 不可爲空 ");
                failureNum++;
            }
            
            if (StringUtils.isNoneBlank(meterNo)) {
            	meter.setMeterNo(meterNo);
            } else {
            	failureMsg.append("<br/>第" + row + "行數據:儀表編號 不可爲空 ");
                failureNum++;
            }
            
            if (rate != null) {
            	meter.setRate(rate);
            } else {
            	failureMsg.append("<br/>第" + row + "行數據:倍率 不可爲空 ");
                failureNum++;
            }
            
            meter.preInsert();
            row++;
        }
        
        if (failureNum > 0) {
            failureMsg.insert(0, ",失敗 " + failureNum + " 條Excel信息,導入信息如下:");
        } else {
            try {
                if (list != null && list.size() > 0) {
                	dao.insertMeterList(list);
                    successNum = list.size();
                }
            } catch (ConstraintViolationException ex) {
                failureMsg.append("<br/>excel信息 導入失敗:");
                List<String> messageList = BeanValidators.extractPropertyAndMessageAsList(ex, ": ");
                for (String message : messageList) {
                    failureMsg.append(message + "; ");
                    failureNum++;
                }
            } catch (Exception ex) {
                failureNum++;
                failureMsg.append("<br/>excel信息  導入失敗:" + ex.getMessage());
            }
        }
        return "已成功導入 " + successNum + " 條excel信息" + failureMsg;
	}


關注公衆號,分享乾貨,討論技術



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章