Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,13 @@ public void finish() {
} catch (Throwable t) {
throwable = t;
}
try {
if (excelReadExecutor != null) {
excelReadExecutor.close();
}
} catch (Throwable t) {
throwable = t;
}
try {
if ((readWorkbookHolder instanceof XlsxReadWorkbookHolder)
&& ((XlsxReadWorkbookHolder) readWorkbookHolder).getOpcPackage() != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,12 @@ public interface ExcelReadExecutor {
* Read the sheet.
*/
void execute();

/**
* Release resources held by this executor. Invoked when the reader is finished.
*
* <p>XLSX sheet streams are opened up front and may be consumed across multiple
* {@link #execute()} calls, so leftover streams must not be closed until this method runs.
*/
default void close() {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ public XlsxSaxAnalyser(XlsxReadContext xlsxReadContext, InputStream decryptedStr
String sheetName = ite.getSheetName();
CTSheet ctSheet = ctSheetMap.get(sheetName);
if (ctSheet == null) {
closeSheetInputStream(inputStream, "sheetName=" + sheetName);
continue;
}
ReadSheet readSheet = new ReadSheet(index, sheetName);
Expand Down Expand Up @@ -204,14 +205,15 @@ private void analysisUse1904WindowDate(XSSFReader xssfReader, XlsxReadWorkbookHo
if (xlsxReadWorkbookHolder.getReadWorkbook().getUse1904windowing() != null) {
return;
}
InputStream workbookXml = xssfReader.getWorkbookData();
WorkbookDocument ctWorkbook = WorkbookDocument.Factory.parse(workbookXml);
CTWorkbook wb = ctWorkbook.getWorkbook();
CTWorkbookPr prefix = wb.getWorkbookPr();
if (prefix != null && prefix.getDate1904()) {
xlsxReadWorkbookHolder.getGlobalConfiguration().setUse1904windowing(Boolean.TRUE);
} else {
xlsxReadWorkbookHolder.getGlobalConfiguration().setUse1904windowing(Boolean.FALSE);
try (InputStream workbookXml = xssfReader.getWorkbookData()) {
WorkbookDocument ctWorkbook = WorkbookDocument.Factory.parse(workbookXml);
CTWorkbook wb = ctWorkbook.getWorkbook();
CTWorkbookPr prefix = wb.getWorkbookPr();
if (prefix != null && prefix.getDate1904()) {
xlsxReadWorkbookHolder.getGlobalConfiguration().setUse1904windowing(Boolean.TRUE);
} else {
xlsxReadWorkbookHolder.getGlobalConfiguration().setUse1904windowing(Boolean.FALSE);
}
}
}

Expand All @@ -224,13 +226,14 @@ private void analysisSharedStringsTable(

private void analysisCtSheetMap(XSSFReader xssfReader, XlsxReadWorkbookHolder xlsxReadWorkbookHolder)
throws Exception {
CTWorkbook wb =
WorkbookDocument.Factory.parse(xssfReader.getWorkbookData()).getWorkbook();
for (CTSheet ctSheet : wb.getSheets().getSheetList()) {
boolean isHidden =
(ctSheet.getState() == STSheetState.HIDDEN) || (ctSheet.getState() == STSheetState.VERY_HIDDEN);
if (Boolean.FALSE.equals(xlsxReadWorkbookHolder.getIgnoreHiddenSheet()) || !isHidden) {
ctSheetMap.put(ctSheet.getName(), ctSheet);
try (InputStream workbookXml = xssfReader.getWorkbookData()) {
CTWorkbook wb = WorkbookDocument.Factory.parse(workbookXml).getWorkbook();
for (CTSheet ctSheet : wb.getSheets().getSheetList()) {
boolean isHidden =
(ctSheet.getState() == STSheetState.HIDDEN) || (ctSheet.getState() == STSheetState.VERY_HIDDEN);
if (Boolean.FALSE.equals(xlsxReadWorkbookHolder.getIgnoreHiddenSheet()) || !isHidden) {
ctSheetMap.put(ctSheet.getName(), ctSheet);
}
}
}
}
Expand Down Expand Up @@ -313,13 +316,13 @@ private void parseXmlSource(InputStream inputStream, ContentHandler handler) {
@Override
public void execute() {
for (ReadSheet readSheet : sheetList) {
readSheet = SheetUtils.match(readSheet, xlsxReadContext);
if (readSheet != null) {
ReadSheet matchedSheet = SheetUtils.match(readSheet, xlsxReadContext);
if (matchedSheet != null) {
try {
xlsxReadContext.currentSheet(readSheet);
parseXmlSource(sheetMap.get(readSheet.getSheetNo()), new XlsxRowHandler(xlsxReadContext));
xlsxReadContext.currentSheet(matchedSheet);
parseXmlSource(sheetMap.get(matchedSheet.getSheetNo()), new XlsxRowHandler(xlsxReadContext));
// Read comments
readComments(readSheet);
readComments(matchedSheet);
} catch (ExcelAnalysisStopSheetException e) {
if (log.isDebugEnabled()) {
log.debug("Custom stop!", e);
Expand All @@ -331,6 +334,31 @@ public void execute() {
}
}

@Override
public void close() {
closeRemainingSheetStreams();
}

private void closeRemainingSheetStreams() {
for (Map.Entry<Integer, InputStream> entry : sheetMap.entrySet()) {
closeSheetInputStream(entry.getValue(), "sheetNo=" + entry.getKey());
}
}

/**
* Package-private so tests can assert skipped-sheet streams are closed.
*/
void closeSheetInputStream(InputStream inputStream, String description) {
if (inputStream == null) {
return;
}
try {
inputStream.close();
} catch (IOException e) {
log.warn("Failed to close sheet input stream, {}", description, e);
}
}

private void readComments(ReadSheet readSheet) {
if (!xlsxReadContext.readWorkbookHolder().getExtraReadSet().contains(CellExtraTypeEnum.COMMENT)) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
package org.apache.fesod.sheet.cache.selector;

import java.io.IOException;
import java.io.InputStream;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
Expand Down Expand Up @@ -98,8 +99,8 @@ public SimpleReadCacheSelector(Long maxUseMapCacheSize, Integer maxCacheActivate
public ReadCache readCache(PackagePart sharedStringsTablePackagePart) {
long size = sharedStringsTablePackagePart.getSize();
if (size < 0) {
try {
size = sharedStringsTablePackagePart.getInputStream().available();
try (InputStream inputStream = sharedStringsTablePackagePart.getInputStream()) {
size = inputStream.available();
} catch (IOException e) {
log.warn("Unable to get file size, default used MapCache");
return new MapCache();
Expand Down
Loading
Loading