java常用工具类之Excel操作类及依赖包下载
依赖包下载:http://xiazai.jb51.net/201407/tools/java-excel-dependency(jb51.net).rar
Excel工具类ExcelUtil.java源码:
packagecom.itjh.javaUtil; importjava.io.File; importjava.io.FileInputStream; importjava.io.FileNotFoundException; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.OutputStream; importjava.text.DecimalFormat; importjava.util.LinkedList; importjava.util.List; importjavax.servlet.http.HttpServletResponse; importorg.apache.poi.hssf.usermodel.HSSFCell; importorg.apache.poi.hssf.usermodel.HSSFRichTextString; importorg.apache.poi.hssf.usermodel.HSSFRow; importorg.apache.poi.hssf.usermodel.HSSFSheet; importorg.apache.poi.hssf.usermodel.HSSFWorkbook; importorg.apache.poi.openxml4j.exceptions.InvalidFormatException; importorg.apache.poi.ss.usermodel.Cell; importorg.apache.poi.ss.usermodel.DateUtil; importorg.apache.poi.ss.usermodel.Row; importorg.apache.poi.ss.usermodel.Sheet; importorg.apache.poi.ss.usermodel.Workbook; importorg.apache.poi.ss.usermodel.WorkbookFactory; /** *封装对excel的操作,包括本地读写excel和流中输出excel,支持office2007。<br/> *依赖于poi-3.9-20121203.jar,poi-ooxml-3.9-20121203.jar,poi-ooxml-schemas-3.9- *20121203.jar,dom4j-1.6.1.jar<br/> *有参构造函数参数为excel的全路径<br/> * *@author宋立君 *@date2014年07月03日 */ publicclassExcelUtil{ //excel文件路径 privateStringpath=""; //写入excel时,是否自动扩展列宽度来符合内容。 privatebooleanautoColumnWidth=false; /** *无参构造函数默认 */ publicExcelUtil(){ } /** *有参构造函数 * *@parampath *excel路径 */ publicExcelUtil(Stringpath){ this.path=path; } /** *读取某个工作簿上的所有单元格的值。 * *@paramsheetOrder *工作簿序号,从0开始。 *@returnList<Object[]>所有单元格的值。 *@throwsIOException *加载excel文件IO异常。 *@throwsFileNotFoundException *excel文件没有找到异常。 *@throwsInvalidFormatException *@author宋立君 *@date2014年07月03日 */ publicList<Object[]>read(intsheetOrder)throwsFileNotFoundException, IOException,InvalidFormatException{ FileInputStreamfis=newFileInputStream(path); Workbookworkbook=WorkbookFactory.create(fis); if(fis!=null){ fis.close(); } Sheetsheet=workbook.getSheetAt(sheetOrder); //用来记录excel值 List<Object[]>valueList=newLinkedList<Object[]>(); //循环遍历每一行、每一列。 for(Rowrow:sheet){ //每一行 Object[]rowObject=null; for(Cellcell:row){ //cell.getCellType是获得cell里面保存的值的type switch(cell.getCellType()){ caseCell.CELL_TYPE_BOOLEAN: //得到Boolean对象的方法 rowObject=CollectionUtil.addObjectToArray(rowObject, cell.getBooleanCellValue()); break; caseCell.CELL_TYPE_NUMERIC: //先看是否是日期格式 if(DateUtil.isCellDateFormatted(cell)){ //读取日期格式 rowObject=CollectionUtil.addObjectToArray(rowObject, cell.getDateCellValue()); }else{ DecimalFormatdf=newDecimalFormat(); //单元格的值,替换掉, Stringvalue=df.format(cell.getNumericCellValue()) .replace(",",""); //读取数字 rowObject=CollectionUtil.addObjectToArray(rowObject, value); } break; caseCell.CELL_TYPE_FORMULA: //读取公式 rowObject=CollectionUtil.addObjectToArray(rowObject, cell.getCellFormula()); break; caseCell.CELL_TYPE_STRING: //读取String rowObject=CollectionUtil.addObjectToArray(rowObject,cell .getRichStringCellValue().toString()); break; } } //将这行添加到list。 valueList.add(rowObject); } returnvalueList; } /** *读取某个工作簿上的某个单元格的值。 * *@paramsheetOrder *工作簿序号,从0开始。 *@paramcolum *列数从1开始 *@paramrow *行数从1开始 *@return单元格的值。 *@throwsException *加载excel异常。 *@author宋立君 *@date2014年07月03日 */ publicStringread(intsheetOrder,intcolum,introw)throwsException{ FileInputStreamfis=newFileInputStream(path); Workbookworkbook=WorkbookFactory.create(fis); if(fis!=null){ fis.close(); } Sheetsheet=workbook.getSheetAt(sheetOrder); Rowrows=sheet.getRow(row-1); Cellcell=rows.getCell(colum-1); Stringcontent=cell.getStringCellValue(); returncontent; } /** *在指定的工作簿、行、列书写值。 * *@paramsheetOrder *工作簿序号,基于0. *@paramcolum *列基于1 *@paramrow *行基于1 *@paramcontent *将要被书写的内容。 *@throwsException *书写后保存异常。 *@author宋立君 *@date2014年07月03日 */ publicvoidwrite(intsheetOrder,intcolum,introw,Stringcontent) throwsException{ FileInputStreamfis=newFileInputStream(path); Workbookworkbook=WorkbookFactory.create(fis); if(fis!=null){ fis.close(); } Sheetsheet=workbook.getSheetAt(sheetOrder); Rowrows=sheet.createRow(row-1); Cellcell=rows.createCell(colum-1); cell.setCellValue(content); FileOutputStreamfileOut=newFileOutputStream(path); workbook.write(fileOut); fileOut.close(); } /** *得到一个工作区最后一条记录的序号,相当于这个工作簿共多少行数据。 * *@paramsheetOrder *工作区序号 *@returnint序号。 *@throwsIOException *根据excel路径加载excel异常。 *@throwsInvalidFormatException *@author宋立君 *@date2014年07月03日 */ publicintgetSheetLastRowNum(intsheetOrder)throwsIOException, InvalidFormatException{ FileInputStreamfis=newFileInputStream(path); Workbookworkbook=WorkbookFactory.create(fis); if(fis!=null){ fis.close(); } Sheetsheet=workbook.getSheetAt(sheetOrder); returnsheet.getLastRowNum(); } /** *在磁盘生成一个含有内容的excel,路径为path属性 * *@paramsheetName *导出的sheet名称 *@paramfieldName *列名数组 *@paramdata *数据组 *@throwsIOException *@author宋立君 *@date2014年07月03日 */ publicvoidmakeExcel(StringsheetName,String[]fieldName, List<Object[]>data)throwsIOException{ //在内存中生成工作薄 HSSFWorkbookworkbook=makeWorkBook(sheetName,fieldName,data); //截取文件夹路径 StringfilePath=path.substring(0,path.lastIndexOf("\\")); //如果路径不存在,创建路径 Filefile=newFile(filePath); //System.out.println(path+"-----------"+file.exists()); if(!file.exists()) file.mkdirs(); FileOutputStreamfileOut=newFileOutputStream(path); workbook.write(fileOut); fileOut.close(); } /** *在输出流中导出excel。 * *@paramexcelName *导出的excel名称包括扩展名 *@paramsheetName *导出的sheet名称 *@paramfieldName *列名数组 *@paramdata *数据组 *@paramresponse *response *@throwsIOException *转换流时IO错误 *@author宋立君 *@date2014年07月03日 */ publicvoidmakeStreamExcel(StringexcelName,StringsheetName, String[]fieldName,List<Object[]>data, HttpServletResponseresponse)throwsIOException{ OutputStreamos=null; response.reset();//清空输出流 os=response.getOutputStream();//取得输出流 response.setHeader("Content-disposition","attachment;filename=" +newString(excelName.getBytes(),"ISO-8859-1"));//设定输出文件头 response.setContentType("application/msexcel");//定义输出类型 //在内存中生成工作薄 HSSFWorkbookworkbook=makeWorkBook(sheetName,fieldName,data); os.flush(); workbook.write(os); } /** *根据条件,生成工作薄对象到内存。 * *@paramsheetName *工作表对象名称 *@paramfieldName *首列列名称 *@paramdata *数据 *@returnHSSFWorkbook *@author宋立君 *@date2014年07月03日 */ privateHSSFWorkbookmakeWorkBook(StringsheetName,String[]fieldName, List<Object[]>data){ //用来记录最大列宽,自动调整列宽。 Integercollength[]=newInteger[fieldName.length]; //产生工作薄对象 HSSFWorkbookworkbook=newHSSFWorkbook(); //产生工作表对象 HSSFSheetsheet=workbook.createSheet(); //为了工作表能支持中文,设置字符集为UTF_16 workbook.setSheetName(0,sheetName); //产生一行 HSSFRowrow=sheet.createRow(0); //产生单元格 HSSFCellcell; //写入各个字段的名称 for(inti=0;i<fieldName.length;i++){ //创建第一行各个字段名称的单元格 cell=row.createCell((short)i); //设置单元格内容为字符串型 cell.setCellType(HSSFCell.CELL_TYPE_STRING); //为了能在单元格中输入中文,设置字符集为UTF_16 //cell.setEncoding(HSSFCell.ENCODING_UTF_16); //给单元格内容赋值 cell.setCellValue(newHSSFRichTextString(fieldName[i])); //初始化列宽 collength[i]=fieldName[i].getBytes().length; } //临时单元格内容 StringtempCellContent=""; //写入各条记录,每条记录对应excel表中的一行 for(inti=0;i<data.size();i++){ Object[]tmp=data.get(i); //生成一行 row=sheet.createRow(i+1); for(intj=0;j<tmp.length;j++){ cell=row.createCell((short)j); //设置单元格字符类型为String cell.setCellType(HSSFCell.CELL_TYPE_STRING); tempCellContent=(tmp[j]==null)?"":tmp[j].toString(); cell.setCellValue(newHSSFRichTextString(tempCellContent)); //如果自动调整列宽度。 if(autoColumnWidth){ if(j>=collength.length){//标题列数小于数据列数时。 collength=CollectionUtil.addObjectToArray(collength, tempCellContent.getBytes().length); }else{ //如果这个内容的宽度大于之前最大的,就按照这个设置宽度。 if(collength[j]<tempCellContent.getBytes().length){ collength[j]=tempCellContent.getBytes().length; } } } } } //自动调整列宽度。 if(autoColumnWidth){ //调整列为这列文字对应的最大宽度。 for(inti=0;i<fieldName.length;i++){ sheet.setColumnWidth(i,collength[i]*2*256); } } returnworkbook; } /** *功能:设置写入excel时,是否自动扩展列宽度来符合内容,默认为false。 * *@author宋立君 *@date2014年07月03日 *@paramautoColumnWidth *true或者false */ publicvoidsetAutoColumnWidth(booleanautoColumnWidth){ this.autoColumnWidth=autoColumnWidth; } }