开头介绍
Apache POI是用Java编写的免费开源的跨平台的Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能,更多使用POI操作Excel表格。
excel有两个版本,2003版:.xls,2007版:.xlsx。所以在解析表格数据的时候,通过不同的对象操作:
- HSSF - 提供读写Microsoft Excel XLS格式档案的功能
- XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能
重中之重
所以,代码中就要对传过来的excel文件版本进行判断,以选择合适的对象操作对于的excel。
博主知道的判断方式有两种:
一、以filename的方法判断后缀
public static Workbook getWorkBook(MultipartFile file) {
//获得文件名
String fileName = file.getOriginalFilename();
//创建Workbook工作薄对象,表示整个excel
Workbook workbook = null;
try {
//获取excel文件的io流
InputStream is = file.getInputStream();
//根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
if(fileName.endsWith(xls)){
//2003
workbook = new HSSFWorkbook(is);
}else if(fileName.endsWith(xlsx)){
//2007
workbook = new XSSFWorkbook(is);
}
} catch (IOException e) {
e.printStackTrace();
}
return workbook;
}
注意:这种方式有可能报异常,如下图所示
此时,可以使用第二种方式
二、用POI自带的方法对版本进行判断
public static Workbook getWorkBook(MultipartFile file) {
//获得文件名
String fileName = file.getOriginalFilename();
//创建Workbook工作薄对象,表示整个excel
Workbook workbook = null;
try {
//获取excel文件的io流
BufferedInputStream is = new BufferedInputStream(file.getInputStream());
//根据文件不同(xls和xlsx)获得不同的Workbook实现类对象
if(POIFSFileSystem.hasPOIFSHeader(is)){
//通过POI自带方法判断版本是否是2003,xls
workbook = new HSSFWorkbook(is);
}else if (POIXMLDocument.hasOOXMLHeader(is)){
//2007,xlsx
workbook = new XSSFWorkbook(is);
}
} catch (IOException e) {
e.printStackTrace();
}
return workbook;
}
注意:传入的InputStream需要用BufferedInputStream装饰一层,如果直接传入InputStream,InputStream流不支持mark/reset机制,会抛出java.io.IOException: mark/reset not supported