fix read by sheetName bug

This commit is contained in:
Looly 2021-05-25 00:08:34 +08:00
parent edd0449187
commit c5887344e9
3 changed files with 37 additions and 13 deletions

View File

@ -21,6 +21,7 @@
* 【core 】 修复XmlUtil中omitXmlDeclaration参数无效问题issue#1581@Github
* 【core 】 修复NumberUtil.decimalFormat参数传错的问题issue#I3SDS3@Gitee
* 【json 】 修复JSONArray.put方法不能覆盖值的问题
* 【poi 】 修复sax方式读取xls无法根据sheet名称获取数据issue#I3S4NH@Gitee
-------------------------------------------------------------------------------------------------------------
# 5.6.5 (2021-05-08)

View File

@ -96,18 +96,18 @@ public class Excel03SaxReader implements HSSFListener, ExcelSaxReader<Excel03Sax
// ------------------------------------------------------------------------------ Read start
@Override
public Excel03SaxReader read(File file, String idOrRid) throws POIException {
public Excel03SaxReader read(File file, String idOrRidOrSheetName) throws POIException {
try {
return read(new POIFSFileSystem(file), idOrRid);
return read(new POIFSFileSystem(file), idOrRidOrSheetName);
} catch (IOException e) {
throw new POIException(e);
}
}
@Override
public Excel03SaxReader read(InputStream excelStream, String idOrRid) throws POIException {
public Excel03SaxReader read(InputStream excelStream, String idOrRidOrSheetName) throws POIException {
try {
return read(new POIFSFileSystem(excelStream), idOrRid);
return read(new POIFSFileSystem(excelStream), idOrRidOrSheetName);
} catch (IOException e) {
throw new POIException(e);
}
@ -117,12 +117,12 @@ public class Excel03SaxReader implements HSSFListener, ExcelSaxReader<Excel03Sax
* 读取
*
* @param fs {@link POIFSFileSystem}
* @param id sheet序号从0开始
* @param idOrRidOrSheetName sheet id或者rid编号或sheet名称从0开始rid必须加rId前缀例如rId0如果为-1处理所有编号的sheet
* @return this
* @throws POIException IO异常包装
*/
public Excel03SaxReader read(POIFSFileSystem fs, String id) throws POIException {
this.rid = getSheetIndex(id);
public Excel03SaxReader read(POIFSFileSystem fs, String idOrRidOrSheetName) throws POIException {
this.rid = getSheetIndex(idOrRidOrSheetName);
formatListener = new FormatTrackingHSSFListener(new MissingRecordAwareHSSFListener(this));
final HSSFRequest request = new HSSFRequest();
@ -365,9 +365,32 @@ public class Excel03SaxReader implements HSSFListener, ExcelSaxReader<Excel03Sax
final int sheetIndex;
try {
return Integer.parseInt(idOrRidOrSheetName);
} catch (NumberFormatException ignore) {
throw new IllegalArgumentException("Invalid sheet id: " + idOrRidOrSheetName);
} catch (NumberFormatException e) {
// 非数字可能为sheet名称
sheetIndex = getSheetIndexByName(idOrRidOrSheetName);
if(sheetIndex > 0){
return sheetIndex;
}
}
throw new IllegalArgumentException("Invalid rId or id or sheetName: " + idOrRidOrSheetName);
}
/**
* 通过sheet名称获取其位置rid
* @param sheetName sheet名称
* @return 位置-1表示未找到
* @since 5.6.6
*/
private int getSheetIndexByName(String sheetName){
final List<BoundSheetRecord> boundSheetRecords = this.boundSheetRecords;
final int size = boundSheetRecords.size();
for(int i = 0; i < size; i++){
if(StrUtil.equals(sheetName, boundSheetRecords.get(i).getSheetname())){
return i;
}
}
return -1;
}
// ---------------------------------------------------------------------------------------------- Private method end
}

View File

@ -22,21 +22,21 @@ public interface ExcelSaxReader<T> {
* 开始读取Excel
*
* @param file Excel文件
* @param idOrRid Excel中的sheet id或者rid编号rid必须加rId前缀例如rId1如果为-1处理所有编号的sheet
* @param idOrRidOrSheetName Excel中的sheet id或者rid编号或sheet名称rid必须加rId前缀例如rId1如果为-1处理所有编号的sheet
* @return this
* @throws POIException POI异常
*/
T read(File file, String idOrRid) throws POIException;
T read(File file, String idOrRidOrSheetName) throws POIException;
/**
* 开始读取Excel读取结束后并不关闭流
*
* @param in Excel流
* @param idOrRid Excel中的sheet id或者rid编号rid必须加rId前缀例如rId1如果为-1处理所有编号的sheet
* @param idOrRidOrSheetName Excel中的sheet id或者rid编号rid必须加rId前缀例如rId1如果为-1处理所有编号的sheet
* @return this
* @throws POIException POI异常
*/
T read(InputStream in, String idOrRid) throws POIException;
T read(InputStream in, String idOrRidOrSheetName) throws POIException;
/**
* 开始读取Excel读取所有sheet