java如何读取Excel简单模板
场景:对于经常需要导入Excel模板或数据来解析后加以应用的,使用频率非常之高,做了一个比较稳定的版本,体现在这些地方
工具:org.apache.poi
使用前必须了解这些:
1、要解析,那肯定先判断是不是Excel
2、xls后缀的Excel,是03版及以前的用HSSFWorkbook类
xlsx后缀的Excel,是07版及以后的用XSSFWorkbook解析
3、getWorkbook这个方法是我自己乱造各种Excel数据不断测试搜索修正得出的结果,其他的像简单的判断后缀xls还是xlsx来决定用HSSH还是XSSF是不保险的,比如你可能没遇过org.apache.poi.openxml4j.exceptions.InvalidFormatException这样的异常,当然这个异常仍然是因为Excel类型导致获取workbook时出错,然而我查到的结果是,Excel最底层是xml实现的,类型问题出在这儿,看异常的描述也可以稍微看出来openxml4j.exceptions
4、可能出现空行,空的单元格,或者单元格值为空的情况,这些情况,在我的readExcel()方法里都考虑到了,为什么我不用迭代器,或者加强的foreach循环?就是因为这些坑爹的空单元格或者空行啊,迭代器内部在取cell单元格对象时跳过这些空的对象,whoknowswhy?我也不知道,反正我测试过,跳过去了,本来5个单元格,一个空的,结果就只得到4个数据,即使用cell.isEmpty()和cell!=null来判断,也没卵用,因为遍历的时候直接跳过去了,都没有判断的机会
5、取单元格数据,这个就比较简单了,判断单元格类型,根据类型做相应的处理取出来,但是我觉得我这个getCellValue()的方法应该有漏洞,先这么用着
下面上代码,简单描述下关键部位
importjava.io.File; importjava.io.FileInputStream; importjava.io.FileNotFoundException; importjava.io.IOException; importjava.io.InputStream; importjava.io.PushbackInputStream; importjava.util.ArrayList; importjava.util.HashMap; importjava.util.Map; importjava.util.List; importorg.apache.poi.POIXMLDocument; importorg.apache.poi.openxml4j.exceptions.InvalidFormatException; importorg.apache.poi.openxml4j.opc.OPCPackage; importorg.apache.poi.poifs.filesystem.POIFSFileSystem; importorg.apache.poi.ss.usermodel.Cell; importorg.apache.poi.ss.usermodel.Row; importorg.apache.poi.ss.usermodel.Sheet; importorg.apache.poi.ss.usermodel.Workbook; importorg.apache.poi.xssf.usermodel.XSSFWorkbook; importorg.apache.poi.hssf.usermodel.HSSFCell; importorg.apache.poi.hssf.usermodel.HSSFWorkbook; importorg.apache.xmlbeans.impl.piccolo.io.FileFormatException; /** *yanbiao2016.10.25 */ publicclassExcelUtil{ privatestaticfinalStringEXTENSION_XLS="xls"; privatestaticfinalStringEXTENSION_XLSX="xlsx"; /** *文件检查 */ privatevoidpreReadCheck(StringfilePath)throwsFileNotFoundException,FileFormatException{ Filefile=newFile(filePath); if(!file.exists()){ thrownewFileNotFoundException("导入的文件不存在:"+filePath); } if(!(filePath.endsWith(EXTENSION_XLS)||filePath.endsWith(EXTENSION_XLSX))){ thrownewFileFormatException("传入的文件不是excel"); } } /** *取得WorkBook对象 *xls:HSSFWorkbook,03版 *xlsx:XSSFWorkbook,07版 */ privateWorkbookgetWorkbook(StringfilePath)throwsIOException,InvalidFormatException{ //直接判断后缀来返回相应的Workbook对象多数情况没问题,但是这个更保险,第3条已经说明 Workbookwb=null; InputStreamis=newFileInputStream(filePath); if(!is.markSupported()){ is=newPushbackInputStream(is,8); } if(POIFSFileSystem.hasPOIFSHeader(is)){ returnnewHSSFWorkbook(is); } if(POIXMLDocument.hasOOXMLHeader(is)){ returnnewXSSFWorkbook(OPCPackage.open(is)); } thrownewIllegalArgumentException("您的excel版本目前不支持poi解析"); } /** *读取excel文件内容 */ publicMap>readExcel(StringfilePath)throwsFileNotFoundException,FileFormatException{ //检查和获取workbook对象 this.preReadCheck(filePath); Workbookwb=null; Map >map=newHashMap >(); try{ wb=this.getWorkbook(filePath); //默认只读取第一个sheet Sheetsheet=wb.getSheetAt(0); introwcount=sheet.getLastRowNum();//逻辑行,包括空行 intcellcount=sheet.getRow(0).getLastCellNum();//第一行(将来作为字段的行)有多少个单元格 for(inti=0;i list=newArrayList (); Rowrow=sheet.getRow(i); if(null!=row){ for(intj=0;j 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。