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;ilist=newArrayList();
Rowrow=sheet.getRow(i);
if(null!=row){
for(intj=0;j
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。