Java匯入Excel--值得收藏使用
業務實現有如下幾點:
1.解析Excel;
2.提示異常行;
3.提示多行重複資料;
程式碼解析:(僅供參考)
// TODO Auto-generated method stub
JSONObject json = new JSONObject();
response.setCharacterEncoding("utf-8");
SystemUser user = (SystemUser)request.getSession().getAttribute(Constants.SESSION_TRAIN_ADMIN_USER);
int insertNum=0;//記錄成功插入多少條記錄
int nullNum=0;//記錄空行記錄
try{
Integer result =0;
//獲取年度
String yearId = request.getParameter("yearId");
//機構
String orgId = request.getParameter("orgId");
//省id
String provinceId = request.getParameter("provinceId");
//年度值
String yearName = request.getParameter("yearName");
/**
* 獲取級別
*/
String unitLevel = request.getParameter("unitLevel");
StringBuffer bufferExce = new StringBuffer();
MultipartHttpServletRequest multipartRequest=(MultipartHttpServletRequest) request;
List<List<Object>> objList=new ArrayList<List<Object>>();
MultipartFile file= multipartRequest.getFile("upfile");
if(null!=file&&file.isEmpty()){
json.put("code", "1000");
json.put("msg", "匯入失敗,檔案不存在!");
try {
throw new Exception("匯入失敗,檔案不存在!");
} catch (Exception e) {
e.printStackTrace();
}
}
long size=file.getSize();
if(size>1*1024*1024){
json.put("code", "1000");
json.put("msg", "匯入失敗,檔案大小不超過1M!");
return json.toString();
}
String uploadDir=request.getSession().getServletContext().getRealPath("/") + "/excelupload/";
File fileDir=new File(uploadDir);
if(!fileDir.exists())
fileDir.mkdir();
File newFile = new File(uploadDir + file.getOriginalFilename());
if (!newFile.exists()){
newFile.createNewFile();
}
byte[] b = new byte[2248000];
InputStream is = file.getInputStream();
FileOutputStream fos = new FileOutputStream(newFile);
int read = 0;
while (read != -1) {
read = is.read(b, 0, b.length);
if (read == -1) {
break;
}
fos.write(b, 0, read);
}
fos.flush();
fos.close();
is.close();
//首先對上傳的Excel進行解析,進行資料檢查
Workbook wb = null;
is = file.getInputStream();
String fileName = file.getOriginalFilename();
try{
if(fileName.contains(".xlsx")){
wb = new XSSFWorkbook(is);
} else {
wb = new HSSFWorkbook(is);
}
}catch(Exception e){
json.put("code", "1000");
json.put("message", "匯入失敗,請下載正確的匯入模板!");
StrutsUtil.renderText(response, json.toString());
return null;
}
HashMap<String,Object> numPhone=new HashMap<String,Object>();//手機號
HashMap<String,String> mapPhone=new HashMap<String,String>();//手機號
HashMap<String,Object> tmapPhone=new HashMap<String,Object>();//手機號
HashMap<String,Object> tmapExcepPhone=new HashMap<String,Object>();//手機號
HashMap<String,Object> tmapRowNull=new HashMap<String,Object>();//記錄空行
HashMap<String,Object> tmapLevel=new HashMap<String,Object>();//行政級別
List<Map<String, String>> tmapMaps = new ArrayList<Map<String, String>>();;//重複資料--省市區機構級別
Map<String,Object> tmapCriticalCareMedicine=new HashMap<String,Object>();//培訓呼吸與危重症醫學
Map<String,Object> tmapCardiovascularMedicine=new HashMap<String,Object>();//培訓心血管內科學
Map<String,Object> tmapObstetricsAndGynecology =new HashMap<String,Object>();//培訓婦產科學
Map<String,Object> tmapUltrasonicDiagnostics=new HashMap<String,Object>();//訓超聲診斷學
//省市區+機構名+級別 拼接--省+市+區+機構+級別
HashMap<String,String> tmapAll=new HashMap<String,String>();//區縣
HashMap<String,String> mapAll=new HashMap<String,String>();//區縣
String allMap = "";
List<ZxBase> baseList = new ArrayList<ZxBase>();//基地集合
List<ZxBaseYear> updateBaseYearList = new ArrayList<ZxBaseYear>();//基地年度集合
List<ZxBase> updateBaseList = new ArrayList<ZxBase>();//基地年度集合
int count=0;
Sheet sheet = wb.getSheetAt(0);
//讀取圖片
List<XSSFPictureData> pictures = (List<XSSFPictureData>) wb.getAllPictures();
int noPictures = pictures.size();
if (noPictures>0) {
json.put("code", "1000");
json.put("message", "上傳檔案中不應該包含圖片,匯入失敗!");
throw new RuntimeException(json.toString());
}
int rowNum = getSheetRowLength(sheet);
if(rowNum>0){
int realNum = RealNums.RealNum(wb);//實際行數
if(realNum>1000){
int sumNum = realNum-2;
if(sumNum>1000){
json.put("code", "1000");
json.put("message", "匯入失敗,總行數不能超過1000行!");
throw new RuntimeException(json.toString());
}
}
}
for (int x = 0; x < 2; x++) {
String countent="";
String submitObj ="";
try {//只校驗標題
countent = formatCell(sheet.getRow(x).getCell(0)).toString().trim();
//是否培訓1
String oneObjName1 = formatCell(sheet.getRow(x).getCell(6)).toString().trim();
//是否培訓2
String twoObjName2 = formatCell(sheet.getRow(x).getCell(7)).toString().trim();
//是否培訓3
String threeObjName3 = formatCell(sheet.getRow(x).getCell(8)).toString().trim();
//是否培訓4
String fourObjName4 = formatCell(sheet.getRow(x).getCell(9)).toString().trim();
if(!StringUtil.isBlank(oneObjName1)&&!StringUtil.isBlank(twoObjName2)&&!StringUtil.isBlank(threeObjName3)&&
!StringUtil.isBlank(fourObjName4)){
submitObj = oneObjName1+twoObjName2+threeObjName3+threeObjName3+fourObjName4;
}
if(!StringUtil.isBlank(countent)){
int status = zxBaseService.ImportExcelCommonService(Integer.valueOf(yearId),countent,x,submitObj,user.getProjectId());
if(status == 400){
json.put("code", "1000");
json.put("message", "上傳檔案與模板不匹配,請重新下載模板!");
StrutsUtil.renderText(response, json.toString());
return null;
}
}else{
json.put("code", "1000");
json.put("message", "上傳失敗!Excel資訊為空無法匯入!");
StrutsUtil.renderText(response, json.toString());
return null;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
json.put("code", "1000");
json.put("message", "上傳失敗!Excel資訊為空無法匯入!");
throw new RuntimeException(json.toString());
}
//獲取第二行的第6、7、8、9的列值,是否和資料庫中的培訓物件一一對應
//是否培訓呼吸與危重症醫學
String isCriticalCareMedicine = formatCell(sheet.getRow(x).getCell(6)).toString().trim();
if(!StringUtil.isBlank(isCriticalCareMedicine)){
//擷取第四位開始
ZxTrainObjectExample exampleC = new ZxTrainObjectExample();
com.ncme.guopei.model.ZxTrainObjectExample.Criteria criteriaC = exampleC.createCriteria();
criteriaC.andNameEqualTo(isCriticalCareMedicine.substring(4, isCriticalCareMedicine.length()));
if(user.getProjectId()!=null){
criteriaC.andProjectIdEqualTo(user.getProjectId());
}
List<ZxTrainObject> list = trainObjectService.selectByExample(exampleC);
if(list!=null && list.size()>0){
Integer id = list.get(0).getId();
tmapCriticalCareMedicine.put("careMedicine", id);
}
}
//是否培訓心血管內科學
String isCardiovascularMedicine = formatCell(sheet.getRow(x).getCell(7)).toString().trim();
if(!StringUtil.isBlank(isCardiovascularMedicine)){
//tmapCardiovascularMedicine
ZxTrainObjectExample exampleM = new ZxTrainObjectExample();
com.ncme.guopei.model.ZxTrainObjectExample.Criteria criteriaM = exampleM.createCriteria();
criteriaM.andNameEqualTo(isCardiovascularMedicine.substring(4, isCardiovascularMedicine.length()));
if(user.getProjectId()!=null){
criteriaM.andProjectIdEqualTo(user.getProjectId());
}
List<ZxTrainObject> listCard = trainObjectService.selectByExample(exampleM);
if(listCard!=null && listCard.size()>0){
Integer id = listCard.get(0).getId();
tmapCardiovascularMedicine.put("cardiovascular", id);
}
}
//是否培訓婦產科學
String isObstetricsAndGynecology = formatCell(sheet.getRow(x).getCell(8)).toString().trim();
if(!StringUtil.isBlank(isObstetricsAndGynecology)){
//tmapObstetricsAndGynecology
ZxTrainObjectExample exampleO = new ZxTrainObjectExample();
com.ncme.guopei.model.ZxTrainObjectExample.Criteria criteriaO = exampleO.createCriteria();
criteriaO.andNameEqualTo(isObstetricsAndGynecology.substring(4, isObstetricsAndGynecology.length()));
if(user.getProjectId()!=null){
criteriaO.andProjectIdEqualTo(user.getProjectId());
}
List<ZxTrainObject> listObs = trainObjectService.selectByExample(exampleO);
if(listObs!=null && listObs.size()>0){
Integer id = listObs.get(0).getId();
tmapObstetricsAndGynecology.put("obstetrics", id);
}
}
//是否培訓超聲診斷學
String isUltrasonicDiagnostics = formatCell(sheet.getRow(x).getCell(9)).toString().trim();
if(!StringUtil.isBlank(isUltrasonicDiagnostics)){
//tmapUltrasonicDiagnostics
ZxTrainObjectExample exampleU = new ZxTrainObjectExample();
com.ncme.guopei.model.ZxTrainObjectExample.Criteria criteriaU = exampleU.createCriteria();
criteriaU.andNameEqualTo(isUltrasonicDiagnostics.substring(4, isUltrasonicDiagnostics.length()));
if(user.getProjectId()!=null){
criteriaU.andProjectIdEqualTo(user.getProjectId());
}
List<ZxTrainObject> listUlt = trainObjectService.selectByExample(exampleU);
if(listUlt!=null && listUlt.size()>0){
Integer id = listUlt.get(0).getId();
tmapUltrasonicDiagnostics.put("ultrasonic", id);
}
}
}
String telphone = "";
int j = 2;//記錄實際行
for (int i = 2; i < rowNum; i++) {
ZxBase base=new ZxBase();
StringBuffer trainObj = new StringBuffer();
if(sheet.getRow(i)==null){
continue;
}
String provinceName = formatCell(sheet.getRow(i).getCell(0)).toString().trim();
if(!StringUtil.isBlank(provinceName)){
provinceName = provinceName.replaceAll("\\s*", "");
}
//市
String cityName = formatCell(sheet.getRow(i).getCell(1)).toString().trim();
if(!StringUtil.isBlank(cityName)){
cityName = cityName.replaceAll("\\s*", "");
}
//區/縣
String countyName = formatCell(sheet.getRow(i).getCell(2)).toString().trim();
if(!StringUtil.isBlank(countyName)){
countyName = countyName.replaceAll("\\s*", "");
}
//機構名稱
String orgName = formatCell(sheet.getRow(i).getCell(3)).toString().trim();
if(!StringUtil.isBlank(orgName)){
orgName = orgName.replaceAll("\\s*", "");
}
//上級主管部門
String upUnitName = formatCell(sheet.getRow(i).getCell(4)).toString().trim();
if(!StringUtil.isBlank(upUnitName)){
upUnitName = upUnitName.replaceAll("\\s*", "");
}
//本單位級別
String Level = formatCell(sheet.getRow(i).getCell(5)).toString().trim();
if(!StringUtil.isBlank(Level)){
Level = Level.replaceAll("\\s*", "");
}
//是否培訓呼吸與危重症醫學
String isCriticalCareMedicine = formatCell(sheet.getRow(i).getCell(6)).toString().trim();
//是否培訓心血管內科學
String isCardiovascularMedicine = formatCell(sheet.getRow(i).getCell(7)).toString().trim();
//是否培訓婦產科學
String isObstetricsAndGynecology = formatCell(sheet.getRow(i).getCell(8)).toString().trim();
//是否培訓超聲診斷學
String isUltrasonicDiagnostics = formatCell(sheet.getRow(i).getCell(9)).toString().trim();
/******培訓物件 end****************/
//擬培訓人數
String trainNumber = formatCell(sheet.getRow(i).getCell(10)).toString().trim();
if(!StringUtil.isBlank(trainNumber)){
trainNumber = trainNumber.replaceAll("\\s*", "");
}
//聯絡人
String trainUser = formatCell(sheet.getRow(i).getCell(11)).toString().trim();
if(!StringUtil.isBlank(trainUser)){
trainUser = trainUser.replaceAll("\\s*", "");
}
//聯絡電話
String trainPhone = formatCell(sheet.getRow(i).getCell(12)).toString().trim();
if(!StringUtil.isBlank(trainPhone)){
trainPhone = trainPhone.replaceAll("\\s*", "");
}
//排除物理讀行後,整行都為空的行
if("".equals(provinceName) && "".equals(cityName) && "".equals(countyName)
&& "".equals(orgName) && "".equals(upUnitName) && "".equals(Level) && "".equals(isCriticalCareMedicine)
&& "".equals(isCardiovascularMedicine) && "".equals(isObstetricsAndGynecology) && "".equals(isUltrasonicDiagnostics)
&& "".equals(trainNumber) && "".equals(trainUser) && "".equals(trainPhone)){
continue;
}else if("".equals(provinceName) || "".equals(cityName) || "".equals(countyName)
|| "".equals(orgName) || "".equals(upUnitName) || "".equals(Level) || "".equals(isCriticalCareMedicine)
|| "".equals(isCardiovascularMedicine) || "".equals(isObstetricsAndGynecology) || "".equals(isUltrasonicDiagnostics)
|| "".equals(trainNumber) || "".equals(trainUser) || "".equals(trainPhone)){//篩選出資訊不全的所在行
//篩選出資訊不全的所在行
i++;
bufferExce.append("第"+i+"行有資訊為空無法匯入!<br>");
continue;
}else{
/**
* -- 此else執行解決. 對讀取的列值,進行校驗,無異常儲存到base實體類,封裝到list<Base>中;有異常,記錄多處錯誤,按提示返回到使用者
* */
j++;
/**
*Excel解析從0開始,已控制從2(解析Excel的第三行)開始,
*發現在Excel中是從第2行開始,所以,這裡的j代替i遞增的虛數,j++,從實際行第三行開始
**/
//根據省名字,匹配省id
ExamPropVal propValPro=null;
List<ExamPropVal> prop = null;//市集合
ExamPropVal examCity = null;//市
List<ExamPropVal> propCount = null;//區縣集合
ExamPropVal examCount = null;//區縣
if(!StringUtil.isBlank(provinceName)){
Map<String, Object> mapProName = new HashMap<>();
mapProName.put("name", provinceName.trim());
mapProName.put("type", 20);
propValPro = examPropValService.getPropByName(mapProName);
if(propValPro==null){//異常
bufferExce.append("第"+j+"行有地區省資訊錯誤,無法匯入!<br>");
}else{
base.setProvinceName(propValPro.getName());
base.setProvinceId(propValPro.getId());
}
}
//根據市名字,匹配市id
if(!StringUtil.isBlank(cityName)){
ExamPropVal query = new ExamPropVal();
query.setName(cityName.trim());
if(propValPro!=null){
query.setId(propValPro.getId());
query.setType(21);//市級
prop = examPropValService.getNextLevelProp(query);
if(prop!=null&&prop.size()>0){
base.setCityName(prop.get(0).getName());
base.setCityId(prop.get(0).getId());
}else{
bufferExce.append("第"+j+"行有地區市資訊錯誤,無法匯入!<br>");
}
}else{
Map<String, Object> mapCitName = new HashMap<>();
mapCitName.put("name", cityName.trim());
mapCitName.put("type", 21);
examCity = examPropValService.getPropByName(mapCitName);
if(examCity!=null){//二次校驗市
base.setCityName(examCity.getName());
base.setCityId(examCity.getId());
}else{//市資訊錯誤
bufferExce.append("第"+j+"行有地區市資訊錯誤,無法匯入!<br>");
}
}
}
//根據區縣名字,匹配區縣的id
if(!StringUtil.isBlank(countyName)){
ExamPropVal queryCount = new ExamPropVal();
queryCount.setName(countyName.trim());//區縣級
if(prop!=null&&prop.size()>0){
queryCount.setId(prop.get(0).getId());
queryCount.setType(22);//區縣級
propCount = examPropValService.getNextLevelProp(queryCount);
if(propCount!=null&&propCount.size()>0){
base.setCountyName(propCount.get(0).getName());
base.setCountyId(propCount.get(0).getId());
}else{
bufferExce.append("第"+j+"行有地區區縣資訊錯誤,無法匯入!<br>");
}
}else{
//bufferExce.append("第"+j+"行有地區區縣資訊錯誤,無法匯入!<br>");
Map<String, Object> mapCountyName = new HashMap<>();
mapCountyName.put("name", countyName.trim());
mapCountyName.put("type", 22);
examCount = examPropValService.getPropByName(mapCountyName);
if(examCount!=null){//二次校驗區縣
base.setCountyName(examCount.getName());
base.setCountyId(examCount.getId());
}else{//市資訊錯誤
bufferExce.append("第"+j+"行有地區區縣資訊錯誤,無法匯入!<br>");
}
}
}
if(!StringUtil.isBlank(orgName)){
base.setOrgName(orgName);
}
//上級主管單位
if(!StringUtil.isBlank(upUnitName)){
ZxOrgExample orgExample = new ZxOrgExample();
orgExample.createCriteria().andNameEqualTo(upUnitName).andProjectIdEqualTo(user.getProjectId());
List<ZxOrg> orgList = zxOrgService.selectByExample(orgExample);
if(orgList!=null&&orgList.size()>0){
base.setOrgId(orgList.get(0).getId());//科教司加入上級單位
}else{
bufferExce.append("第"+j+"行有上級主管部門與模板不符,無法匯入!<br>");
}
}
if(!StringUtil.isBlank(Level)){
//查詢行政級別
ZxLevelExample example = new ZxLevelExample();
example.createCriteria().andNameEqualTo(Level).andProjectIdEqualTo(user.getProjectId());
List<ZxLevel> levels = zxlevelService.searchLevels(example);
if(!levels.isEmpty()){
for (ZxLevel zxLevel : levels) {
if(zxLevel.getName().equals(Level)){//excel模板中的單位級別與資料庫級別相等
Level = String.valueOf(zxLevel.getSeq());
}else{
bufferExce.append("第"+j+"行有行政級別與模板不符,無法匯入!<br>");//行政級別和資料庫中沒有一一對應的,記錄錯誤行
}
}
if(isInteger(Level)){
//做一個判斷
if (!StringUtil.isBlank(unitLevel)) {
Integer unitL = Integer.valueOf(unitLevel);//上級
Integer newlev = Integer.valueOf(Level);//excel中的級別
if(newlev>=unitL){//eq:下級大於上級時,
base.setUnitLevel(Integer.valueOf(Level));
}else{
bufferExce.append("第"+j+"行“本單位級別”超出您的管轄範圍,無法匯入!<br>");//行政級別和資料庫中沒有一一對應的,記錄錯誤行
}
}
}
}else{
bufferExce.append("第"+j+"行有行政級別與模板不符,無法匯入!<br>");//行政級別和資料庫中沒有一一對應的,記錄錯誤行
}
}
/****培訓物件begin***************/
if(!StringUtil.isBlank(isCriticalCareMedicine)){
if(isCriticalCareMedicine.contains("是")){//存在此培訓物件
if(tmapCriticalCareMedicine!=null&&null!=tmapCriticalCareMedicine.get("careMedicine")){//培訓物件得到id
trainObj.append(tmapCriticalCareMedicine.get("careMedicine")+",");
}
}
}
if(!StringUtil.isBlank(isCardiovascularMedicine)){
if(isCardiovascularMedicine.contains("是")){//存在此培訓物件
if(tmapCardiovascularMedicine!=null&&null!=tmapCardiovascularMedicine.get("cardiovascular")){//培訓物件得到id
trainObj.append(tmapCardiovascularMedicine.get("cardiovascular")+",");
}
}
}
if(!StringUtil.isBlank(isObstetricsAndGynecology)){
if(isObstetricsAndGynecology.contains("是")){
if(tmapObstetricsAndGynecology!=null&&null!=tmapObstetricsAndGynecology.get("obstetrics")){//培訓物件得到id
trainObj.append(tmapObstetricsAndGynecology.get("obstetrics")+",");
}
}
}
if(!StringUtil.isBlank(isUltrasonicDiagnostics)){
if(isUltrasonicDiagnostics.contains("是")){
if(tmapUltrasonicDiagnostics!=null&&null!=tmapUltrasonicDiagnostics.get("ultrasonic")){//培訓物件得到id
trainObj.append(tmapUltrasonicDiagnostics.get("ultrasonic")+",");
}
}
}
/****培訓物件end***************/
if(!StringUtil.isBlank(trainNumber)){//你培訓人數
boolean isNum = isInteger(trainNumber);
if(isNum){//判斷是否是數字
if(trainNumber.length()>5){
bufferExce.append("第"+j+"行擬培訓人數超出5位數字,無法匯入!<br>");
}else{
base.setTrainNumber(Integer.valueOf(trainNumber));
}
}else{//可能是數字
bufferExce.append("第"+j+"行有擬培訓人數錯誤,無法匯入!<br>");
}
}
if(!StringUtil.isBlank(trainUser)){//聯絡人
if(trainUser.length()>20){//聯絡人超過20個字,擷取前20
String string = trainUser.substring(0, 20);
base.setTelUser(string);
}else{//不超過20個字
base.setTelUser(trainUser);
}
}
if(!StringUtil.isBlank(trainPhone)){//手機號
boolean isNum = isInteger(trainPhone);//判斷手機號是否是數字
if(isNum){//是數字
boolean trueOrFalse = ValidateUtils.validPhoneNum("2", trainPhone);
if(trueOrFalse){//符合
if(trainPhone.length()>11){//聯絡人超過11個字,擷取前11
String string = trainPhone.substring(0, 11);
base.setTelPhone(string);
}else{//不超過11個字
base.setTelPhone(trainPhone);
}
}else{
bufferExce.append("第"+j+"行有手機號錯誤,無法匯入!<br>");
}
}else{//可能是漢字
bufferExce.append("第"+j+"行有手機號錯誤,無法匯入!<br>");
}
}
//地區機構名級別拼接--省市區 機構名完全一致
if(!StringUtil.isBlank(provinceName)&&!StringUtil.isBlank(cityName)&&!StringUtil.isBlank(countyName)
&&!StringUtil.isBlank(orgName)
&&!StringUtil.isBlank(Level)){
String allStr=provinceName.trim()+cityName.trim()+countyName.trim()+orgName.trim()+Level.trim();
int newNum=i+1;
//失敗原因:第XX行XX
if(mapAll.containsKey(allStr)){
//記住第一次出現
String lineNum=mapAll.get(allStr);//拿到先前儲存的行號
//logger.info("----地區拿到行號----"+lineNum);
if(tmapAll.containsKey(allStr)){
allMap = provinceName.trim()+cityName.trim()+countyName.trim()+orgName.trim()+Level.trim();;//allMap = allStr 方便異常輸入
String str = tmapAll.get(allStr);
tmapAll.put(allStr, str+"與第"+newNum+"行資訊重複<br>");//更新後,顯示效果:——》行重複:在第 2 ,3 , 5
logger.info("地區更新後,顯示效果 "+str+","+newNum);
}else{
allMap = base.getProvinceName()+base.getCityName()+base.getCountyName()+base.getOrgName()+base.getUnitLevel();//allMap = allStr 方便異常輸入
logger.info("地區最後顯示效果 ---->重複:行數位於第 "+lineNum+","+newNum);
tmapAll.put(allStr, "第"+lineNum+"行與第"+newNum+"行資訊重複<br>");//最後顯示效果:——》行重複:在第 2 ,3
}
}
tmapMaps.add(tmapAll);
mapAll.put(allStr, newNum+"");//把i行的第column列的值與行號儲存到map中
}
//儲存培訓物件
&nb