资源描述:
《JAVA POI通用工具类》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
JAVAPOI数据导入导出工具类1.Exception处理publicclassExcelExceptionextendsException{publicExcelException(){//TODOAuto-generatedconstructorstub}publicExcelException(Stringmessage){super(message);//TODOAuto-generatedconstructorstub}publicExcelException(Throwablecause){super(cause);//TODOAuto-generatedconstructorstub}publicExcelException(Stringmessage,Throwablecause){super(message,cause);//TODOAuto-generatedconstructorstub}}2.POI核心处理/***@author:SUNZK-QQ:1131341075*@Date:2018-8-23下午9:13:21*@Comments:导入导出Excel工具类*@Version:1.0.0*/publicclassExcelUtil{/***@MethodName:listToExcel*@Description:导出Excel(可以导出到本地文件系统,也可以导出到浏览器,可自定义工作表大小)*@paramlist数据源*@paramfieldMap类的英文属性和Excel中的中文列名的对应关系 *如果需要的是引用对象的属性,则英文属性使用类似于EL表达式的格式*如:list中存放的都是student,student中又有college属性,而我们需要学院名称,则可以这样写*fieldMap.put("college.collegeName","学院名称")*@paramsheetName工作表的名称*@paramsheetSize每个工作表中记录的最大个数*@paramout导出流*@throwsExcelException*/publicstaticvoidlistToExcel(Listlist,LinkedHashMapfieldMap,StringsheetName,intsheetSize,OutputStreamout)throwsExcelException{if(list.size()==0||list==null){thrownewExcelException("数据源中没有任何数据");}if(sheetSize>65535||sheetSize<1){sheetSize=65535;}//创建工作簿并发送到OutputStream指定的地方WritableWorkbookwwb;try{wwb=Workbook.createWorkbook(out);//因为2003的Excel一个工作表最多可以有65536条记录,除去列头剩下65535条//所以如果记录太多,需要放到多个工作表中,其实就是个分页的过程//1.计算一共有多少个工作表doublesheetNum=Math.ceil(list.size()/newInteger(sheetSize).doubleValue());//2.创建相应的工作表,并向其中填充数据for(inti=0;ilist.size()-1?list.size()-1:(i+1)*sheetSize-1;//填充工作表fillSheet(sheet,list,fieldMap,firstIndex,lastIndex);}}wwb.write();wwb.close();}catch(Exceptione){e.printStackTrace();//如果是ExcelException,则直接抛出if(einstanceofExcelException){throw(ExcelException)e;//否则将其它异常包装成ExcelException再抛出}else{thrownewExcelException("导出Excel失败");}}}/***@MethodName:listToExcel*@Description:导出Excel(可以导出到本地文件系统,也可以导出到浏览器,工作表大小为2003支持的最大值)*@paramlist数据源*@paramfieldMap类的英文属性和Excel中的中文列名的对应关系*@paramout导出流*@throwsExcelException*/publicstaticvoidlistToExcel(Listlist,LinkedHashMapfieldMap,StringsheetName, OutputStreamout)throwsExcelException{listToExcel(list,fieldMap,sheetName,65535,out);}/***@MethodName:listToExcel*@Description:导出Excel(导出到浏览器,可以自定义工作表的大小)*@paramlist数据源*@paramfieldMap类的英文属性和Excel中的中文列名的对应关系*@paramsheetSize每个工作表中记录的最大个数*@paramresponse使用response可以导出到浏览器*@throwsExcelException*/publicstaticvoidlistToExcel(Listlist,LinkedHashMapfieldMap,StringsheetName,intsheetSize,HttpServletResponseresponse)throwsExcelException{//设置默认文件名为当前时间:年月日时分秒StringfileName=newSimpleDateFormat("yyyyMMddhhmmss").format(newDate()).toString();//设置response头信息response.reset();response.setContentType("application/vnd.ms-excel");//改成输出excel文件response.setHeader("Content-disposition","attachment;filename="+fileName+".xls");//创建工作簿并发送到浏览器try{OutputStreamout=response.getOutputStream();listToExcel(list,fieldMap,sheetName,sheetSize,out);}catch(Exceptione){e.printStackTrace(); //如果是ExcelException,则直接抛出if(einstanceofExcelException){throw(ExcelException)e;//否则将其它异常包装成ExcelException再抛出}else{thrownewExcelException("导出Excel失败");}}}/***@MethodName:listToExcel*@Description:导出Excel(导出到浏览器,工作表的大小是2003支持的最大值)*@paramlist数据源*@paramfieldMap类的英文属性和Excel中的中文列名的对应关系*@paramresponse使用response可以导出到浏览器*@throwsExcelException*/publicstaticvoidlistToExcel(Listlist,LinkedHashMapfieldMap,StringsheetName,HttpServletResponseresponse)throwsExcelException{listToExcel(list,fieldMap,sheetName,65535,response);}/***@MethodName:excelToList*@Description:将Excel转化为List*@paramin:承载着Excel的输入流*@paramsheetIndex:要导入的工作表序号*@paramentityClass:List中对象的类型(Excel中的每一行都要转化为该类型的对象)*@paramfieldMap:Excel中的中文列头和类的英文属性的对应关系Map*@paramuniqueFields:指定业务主键组合(即复合主键),这些列的组合不能重复*@return:List*@throwsExcelException*/ publicstaticListexcelToList(InputStreamin,StringsheetName,ClassentityClass,LinkedHashMapfieldMap,String[]uniqueFields)throwsExcelException{//定义要返回的listListresultList=newArrayList();try{//根据Excel数据源创建WorkBookWorkbookwb=Workbook.getWorkbook(in);//获取工作表Sheetsheet=wb.getSheet(sheetName);//获取工作表的有效行数intrealRows=0;for(inti=0;iexcelFieldList=Arrays.asList(excelFieldNames);for(StringcnName:fieldMap.keySet()){if(!excelFieldList.contains(cnName)){isExist=false;break;}}//如果有列名不存在,则抛出异常,提示错误if(!isExist){thrownewExcelException("Excel中缺少必要的字段,或字段名称有误");}//将列名和列号放入Map中,这样通过列名就可以拿到列号LinkedHashMapcolMap=newLinkedHashMap();for(inti=0;ientry:fieldMap.entrySet()){//获取中文字段名StringcnNormalName=entry.getKey();//获取英文字段名StringenNormalName=entry.getValue();//根据中文字段名获取列号intcol=colMap.get(cnNormalName);//获取当前单元格中的内容Stringcontent=sheet.getCell(col,i).getContents().toString().trim();//给对象赋值setFieldValueByName(enNormalName,content,entity);}resultList.add(entity);} }catch(Exceptione){e.printStackTrace();//如果是ExcelException,则直接抛出if(einstanceofExcelException){throw(ExcelException)e;//否则将其它异常包装成ExcelException再抛出}else{e.printStackTrace();thrownewExcelException("导入Excel失败");}}returnresultList;}/*<-------------------------辅助的私有方法----------------------------------------------->*//***@MethodName:getFieldValueByName*@Description:根据字段名获取字段值*@paramfieldName字段名*@paramo对象*@return字段值*/privatestaticObjectgetFieldValueByName(StringfieldName,Objecto)throwsException{Objectvalue=null;Fieldfield=getFieldByName(fieldName,o.getClass());if(field!=null){field.setAccessible(true);value=field.get(o);}else{thrownewExcelException(o.getClass().getSimpleName()+"类不存在字段名"+fieldName);}returnvalue;} /***@MethodName:getFieldByName*@Description:根据字段名获取字段*@paramfieldName字段名*@paramclazz包含该字段的类*@return字段*/privatestaticFieldgetFieldByName(StringfieldName,Class>clazz){//拿到本类的所有字段Field[]selfFields=clazz.getDeclaredFields();//如果本类中存在该字段,则返回for(Fieldfield:selfFields){if(field.getName().equals(fieldName)){returnfield;}}//否则,查看父类中是否存在此字段,如果有则返回Class>superClazz=clazz.getSuperclass();if(superClazz!=null&&superClazz!=Object.class){returngetFieldByName(fieldName,superClazz);}//如果本类和父类都没有,则返回空returnnull;}/***@MethodName:getFieldValueByNameSequence*@Description:*根据带路径或不带路径的属性名获取属性值*即接受简单属性名,如userName等,又接受带路径的属性名,如student.department.name等**@paramfieldNameSequence带路径的属性名或简单属性名*@paramo对象*@return属性值*@throwsException*/privatestaticObjectgetFieldValueByNameSequence(StringfieldNameSequence,Objecto)throwsException{ Objectvalue=null;//将fieldNameSequence进行拆分String[]attributes=fieldNameSequence.split("\.");if(attributes.length==1){value=getFieldValueByName(fieldNameSequence,o);}else{//根据属性名获取属性对象ObjectfieldObj=getFieldValueByName(attributes[0],o);StringsubFieldNameSequence=fieldNameSequence.substring(fieldNameSequence.indexOf(".")+1);value=getFieldValueByNameSequence(subFieldNameSequence,fieldObj);}returnvalue;}/***@MethodName:setFieldValueByName*@Description:根据字段名给对象的字段赋值*@paramfieldName字段名*@paramfieldValue字段值*@paramo对象*/privatestaticvoidsetFieldValueByName(StringfieldName,ObjectfieldValue,Objecto)throwsException{Fieldfield=getFieldByName(fieldName,o.getClass());if(field!=null){field.setAccessible(true);//获取字段类型Class>fieldType=field.getType();//根据字段类型给字段赋值if(String.class==fieldType){field.set(o,String.valueOf(fieldValue));}elseif((Integer.TYPE==fieldType)||(Integer.class==fieldType)){field.set(o,Integer.parseInt(fieldValue.toString()));}elseif((Long.TYPE==fieldType)||(Long.class==fieldType)){field.set(o,Long.valueOf(fieldValue.toString())); }elseif((Float.TYPE==fieldType)||(Float.class==fieldType)){field.set(o,Float.valueOf(fieldValue.toString()));}elseif((Short.TYPE==fieldType)||(Short.class==fieldType)){field.set(o,Short.valueOf(fieldValue.toString()));}elseif((Double.TYPE==fieldType)||(Double.class==fieldType)){field.set(o,Double.valueOf(fieldValue.toString()));}elseif(Character.TYPE==fieldType){if((fieldValue!=null)&&(fieldValue.toString().length()>0)){field.set(o,Character.valueOf(fieldValue.toString().charAt(0)));}}elseif(Date.class==fieldType){field.set(o,newSimpleDateFormat("yyyy-MM-ddHH:mm:ss").parse(fieldValue.toString()));}else{field.set(o,fieldValue);}}else{thrownewExcelException(o.getClass().getSimpleName()+"类不存在字段名"+fieldName);}}/***@MethodName:setColumnAutoSize*@Description:设置工作表自动列宽和首行加粗*@paramws*/privatestaticvoidsetColumnAutoSize(WritableSheetws,intextraWith){//获取本列的最宽单元格的宽度for(inti=0;ivoidfillSheet(WritableSheetsheet,Listlist,LinkedHashMapfieldMap,intfirstIndex,intlastIndex)throwsException{//定义存放英文字段名和中文字段名的数组String[]enFields=newString[fieldMap.size()];String[]cnFields=newString[fieldMap.size()];//填充数组intcount=0;for(Entryentry:fieldMap.entrySet()){enFields[count]=entry.getKey();cnFields[count]=entry.getValue();count++;}//填充表头for(inti=0;i