Spring使用POI实现Excel导入导出.docx
《Spring使用POI实现Excel导入导出.docx》由会员分享,可在线阅读,更多相关《Spring使用POI实现Excel导入导出.docx(6页珍藏版)》请在冰豆网上搜索。
Spring使用POI实现Excel导入导出
Spring使用POI实现Excel导入导出
ApachePOI是创建和维护操作各种符合OfficeOpenXML(OOXML)标准和微软的OLE2复合文档格式(OLE2)的JavaAPI。
用它可以使用Java读取和创建,修改MSExcel文件.而且,还可以使用Java读取和创建MSWord和MSPowerPoint文件。
ApachePOI提供Java操作Excel解决方案(适用于Excel97-2008)。
简单理解就是通过POI,java可以与office建立联系。
本次项目实践基于SSM框架,简单封装了Excel批量导入导出功能,实现过程如下
1.maven导入java包:
[html]viewplaincopy<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.5-FINAL</version></dependency>
2.建立Excel实体--ExcelBean
[java]viewplaincopy/****@Description:
导入导出excel*@authorhaipeng*@date2017年4月11日*/publicclassExcelBeanimplementsjava.io.Serializable{privateStringheadTextName;//列头(标题)名privateStringpropertyName;//对应字段名privateIntegercols;//合并单元格数privateXSSFCellStylecellStyle;publicExcelBean(){}publicExcelBean(StringheadTextName,StringpropertyName){this.headTextName=headTextName;this.propertyName=propertyName;}publicExcelBean(StringheadTextName,StringpropertyName,Integercols){super();this.headTextName=headTextName;this.propertyName=propertyName;this.cols=cols;}publicStringgetHeadTextName(){returnheadTextName;}publicvoidsetHeadTextName(StringheadTextName){this.headTextName=headTextName;}publicStringgetPropertyName(){returnpropertyName;}publicvoidsetPropertyName(StringpropertyName){this.propertyName=propertyName;}publicIntegergetCols(){returncols;}publicvoidsetCols(Integercols){this.cols=cols;}publicXSSFCellStylegetCellStyle(){returncellStyle;}publicvoidsetCellStyle(XSSFCellStylecellStyle){this.cellStyle=cellStyle;}}
3.封装Excel工具类--ExcelUtils
[java]viewplaincopypublicclassExcelUtils{privatefinalstaticStringexcel2003L=".xls";//2003-版本的excelprivatefinalstaticStringexcel2007U=".xlsx";//2007+版本的excel/*************************************文件上传****************************/publicstaticList<List<Object>>getBankListByExcel(InputStreamin,StringfileName)throwsException{List<List<Object>>list=null;//创建Excel工作薄Workbookwork=getWorkbook(in,fileName);if(null==work){thrownewException("创建Excel工作薄为空!
");}Sheetsheet=null;Rowrow=null;Cellcell=null;list=newArrayList<List<Object>>();//遍历Excel中所有的sheetfor(inti=0;i<work.getNumberOfSheets();i++){sheet=work.getSheetAt(i);if(sheet==null){continue;}//遍历当前sheet中的所有行for(intj=sheet.getFirstRowNum();j<sheet.getLastRowNum();j++){row=sheet.getRow(j);if(row==null||row.getFirstCellNum()==j){continue;}//遍历所有的列List<Object>li=newArrayList<Object>();for(inty=row.getFirstCellNum();y<row.getLastCellNum();y++){cell=row.getCell(y);li.add(getCellValue(cell));}list.add(li);}}//work.close();returnlist;}/***描述:
根据文件后缀,自适应上传文件的版本*@paraminStr,fileName*@return*@throwsException*/publicstaticWorkbookgetWorkbook(InputStreaminStr,StringfileName)throwsException{Workbookwb=null;StringfileType=fileName.substring(fileName.lastIndexOf("."));if(excel2003L.equals(fileType)){wb=newHSSFWorkbook(inStr);//2003-}elseif(excel2007U.equals(fileType)){wb=newXSSFWorkbook(inStr);//2007+}else{thrownewException("解析的文件格式有误!
");}returnwb;}/***描述:
对表格中数值进行格式化*@paramcell*@return*/publicstaticObjectgetCellValue(Cellcell){Objectvalue=null;DecimalFormatdf=newDecimalFormat("0");//格式化numberString字符SimpleDateFormatsdf=newSimpleDateFormat("yyy-MM-dd");//日期格式化DecimalFormatdf2=newDecimalFormat("0.00");//格式化数字switch(cell.getCellType()){caseCell.CELL_TYPE_STRING:
value=cell.getRichStringCellValue().getString();break;caseCell.CELL_TYPE_NUMERIC:
if("General".equals(cell.getCellStyle().getDataFormatString())){value=df.format(cell.getNumericCellValue());}elseif("m/d/yy".equals(cell.getCellStyle().getDataFormatString())){value=sdf.format(cell.getDateCellValue());}else{value=df2.format(cell.getNumericCellValue());}break;caseCell.CELL_TYPE_BOOLEAN:
value=cell.getBooleanCellValue();break;caseCell.CELL_TYPE_BLANK:
value="";break;default:
break;}returnvalue;}/****************************************上传结束***************************************/***多列头创建EXCEL**@paramsheetName工作簿名称*@paramclazz数据源model类型*@paramobjsexcel标题列以及对应model字段名*@parammap标题列行数以及cell字体样式*@return*@throwsIllegalArgumentException*@throwsIllegalAccessException*@throwsInvocationTargetException*@throwsClassNotFoundException*@throwsIntrospectionException*@throwsParseException*/publicstaticXSSFWorkbookcreateExcelFile(Classclazz,Listobjs,Map<Integer,List<ExcelBean>>map,StringsheetName)throwsIllegalArgumentException,IllegalAccessException,InvocationTargetException,ClassNotFoundException,IntrospectionException,ParseException{//创建新的Excel工作簿XSSFWorkbookworkbook=newXSSFWorkbook();//在Excel工作簿中建一工作表,其名为缺省值,也可以指定Sheet名称XSSFSheetsheet=workbook.createSheet(sheetName);//以下为excel的字体样式以及excel的标题与内容的创建,下面会具体分析;createFont(workbook);//字体样式createTableHeader(sheet,map);//创建标题(头)createTableRows(sheet,map,objs,clazz);//创建内容returnworkbook;}privatestaticXSSFCellStylefontStyle;privatestaticXSSFCellStylefontStyle2;publicstaticvoidcreateFont(XSSFWorkbookworkbook){//表头fontStyle=workbook.createCellStyle();XSSFFontfont1=workbook.createFont();font1.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);font1.setFontName("黑体");font1.setFontHeightInPoints((short)14);//设置字体大小fontStyle.setFont(font1);fontStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);//下边框fontStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框fontStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框fontStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框fontStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);//居中//内容fontStyle2=workbook.createCellStyle();XSSFFontfont2=workbook.createFont();font2.setFontName("宋体");font2.setFontHeightInPoints((short)10);//设置字体大小fontStyle2.setFont(font2);fontStyle2.setBorderBottom(XSSFCellStyle.BORDER_THIN);//下边框fontStyle2.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框fontStyle2.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框fontStyle2.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框fontStyle2.setAlignment(XSSFCellStyle.ALIGN_CENTER);//居中}/***根据ExcelMapping生成列头(多行列头)**@paramsheet*工作簿*@parammap*每行每个单元格对应的列头信息*/publicstaticfinalvoidcreateTableHeader(XSSFSheetsheet,Map<Integer,List<ExcelBean>>map){intstartIndex=0;//cell起始位置intendIndex=0;//cell终止位置for(Map.Entry<Integer,List<ExcelBean>>entry:
map.entrySet()){XSSFRowrow=sheet.createRow(entry.getKey());List<ExcelBean>excels=entry.getValue();for(intx=0;x<excels.size();x++){//合并单元格if(excels.get(x).getCols()>1){if(x==0){endIndex+=excels.get(x).getCols()-1;CellRangeAddressrange=newCellRangeAddress(0,0,startIndex,endIndex);sheet.addMergedRegion(range);startIndex+=excels.get(x).getCols();}else{endIndex+=excels.get(x).getCols();CellRangeAddressrange=newCellRangeAddress(0,0,startIndex,endIndex);sheet.addMergedRegion(range);startIndex+=excels.get(x).getCols();}XSSFCellcell=row.createCell(startIndex-excels.get(x).getCols());cell.setCellValue(excels.get(x).getHeadTextName());//设置内容if(excels.get(x).getCellStyle()!
=null){cell.setCellStyle(excels.get(x).getCellStyle());//设置格式}cell.setCellStyle(fontStyle);}else{XSSFCellcell=row.createCell(x);cell.setCellValue(excels.get(x).getHeadTextName());//设置内容if(excels.get(x).getCellStyle()!
=null){cell.setCellStyle(excels.get(x).getCellStyle());//设置格式}cell.setCellStyle(fontStyle);}}}}/****@paramsheet*@parammap*@paramobjs*@paramclazz*/@SuppressWarnings("rawtypes")publicstaticvoidcreateTableRows(XSSFSheetsheet,Map<Integer,List<ExcelBean>>map,Listobjs,Classclazz)throwsIllegalArgumentException,IllegalAccessException,InvocationTargetException,IntrospectionException,ClassNotFoundException,ParseException{introwindex=map.size();intmaxKey=0;List<ExcelBean>ems=newArrayList<>();for(Map.Entry<Integer,List<ExcelBean>>entry:
map.entrySet()){if(entry.getKey()>maxKey){maxKey=entry.getKey();}}ems=map.get(maxKey);List<Integer>widths=newArrayList<Integer>(ems.size());for(Objectobj:
objs){XSSFRowrow=sheet.createRow(rowindex);for(inti=0;i<ems.size();i++){ExcelBeanem=(ExcelBean)ems.get(i);//获得get方法PropertyDescriptorpd=newPropertyDescriptor(em.getPropertyName(),clazz);MethodgetMethod=pd.getReadMethod();Objectrtn=getMethod.invoke(obj);Stringvalue="";//如果是日期类型进行转换if(rtn!
=null){if(rtninstanceofDate){value=DateUtils.date2String((Date)rtn,"yyyy-MM-dd");}elseif(rtninstanceofBigDecimal){NumberFormatnf=newDecimalFormat("#,##0.00");value=nf.format((BigDecimal)rtn).toString();}elseif((rtninstanceofInteger)&&(Integer.valueOf(rtn.toString())<0)){value="--";}else{value=rtn.toString();}}XSSFCellcell=row.createCell(i);cell.setCellValue(value);cell.setCellType(XSSFCell.CELL_TYPE_STRING);cell.setCellStyle(fontStyle2);//获得最大列宽intwidth=value.getBytes().length*300;//还未设置,设置当前if(widths.size()<=i){widths.add(width);continue;}//比原来大,更新数据if(width>widths.get(i)){widths.set(i,width);}}rowindex++;}//设置列宽for(intindex=0;index<widths.size();index++){Integerwidth=widths.get(index);width=width<2500?
2500:
width+300;width=width>10000?
10000+300:
width+300;sheet.setColumnWidth(index,width);}}}
4.在HTML页面导入需要的js
[html]viewplaincopy<scripttype="text/javascript"src="${ctxPath}/js/jquery-form.js"></script>
5.在HTML添加测试控件
[java]viewplaincopy<