网上很多都是介绍如何读取内容,没有读取sheet页名称的方法
大数据量需要用到sax模式,但是没有讲如何获取sheet名称
先上结论代码
/**
* 获取sheet名称列表
* @param file
* @return
*/
public List<String> getSheetName(File file){
List<String> sheetNames=new ArrayList<>();
XSSFReader reader = null;
try (OPCPackage opcPackage = OPCPackage.open(file, PackageAccess.READ)){
reader = new XSSFReader(opcPackage);
XSSFReader.SheetIterator sheets = (XSSFReader.SheetIterator)reader.getSheetsData();
while (sheets.hasNext()) {
sheets.next();
String sheetName = sheets.getSheetName();
sheetNames.add(sheetName);
}
} catch (IOException e) {
log.error("IO异常",e);
e.printStackTrace();
} catch (OpenXML4JException e) {
log.error("文件读取异常",e);
e.printStackTrace();
}
return sheetNames;
}
String sheetName = sheets.getSheetName();
为什么不是获取List。
XSSFReader.SheetIterator只有获取单个sheetName的方法
所以我当时也是懵的,所以,我看了下源码
public String getSheetName() {
return ctSheet.getName();
}
似乎陷入僵局,大胆猜想下ctSheet会在next的时候重新设置
/**
* Returns input stream of the next sheet in the iteration
*
* @return input stream of the next sheet in the iteration
*/
public InputStream next() {
ctSheet = sheetIterator.next();
String sheetId = ctSheet.getId();
try {
PackagePart sheetPkg = sheetMap.get(sheetId);
return sheetPkg.getInputStream();
} catch(IOException e) {
throw new POIXMLException(e);
}
}
证实是正确的
所以,每次next的时候sheet都会重新复制,getSheetName也是获取当前sheet的名称。所以问题解决
注意:开始时候ctSheet 是空,必须要经过一次next才有值