|
|
|
package com.alibaba.excel.analysis;
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
|
|
|
import com.alibaba.excel.analysis.v03.XlsSaxAnalyser;
|
|
|
|
import com.alibaba.excel.analysis.v07.XlsxSaxAnalyser;
|
|
|
|
import com.alibaba.excel.context.AnalysisContext;
|
|
|
|
import com.alibaba.excel.context.AnalysisContextImpl;
|
|
|
|
import com.alibaba.excel.exception.ExcelAnalysisException;
|
|
|
|
import com.alibaba.excel.read.metadata.ReadSheet;
|
|
|
|
import com.alibaba.excel.read.metadata.ReadWorkbook;
|
|
|
|
import com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder;
|
|
|
|
import com.alibaba.excel.support.ExcelTypeEnum;
|
|
|
|
import com.alibaba.excel.util.FileUtils;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @author jipengfei
|
|
|
|
*/
|
|
|
|
public class ExcelAnalyserImpl implements ExcelAnalyser {
|
|
|
|
|
|
|
|
private AnalysisContext analysisContext;
|
|
|
|
|
|
|
|
private ExcelExecutor excelExecutor;
|
|
|
|
|
|
|
|
public ExcelAnalyserImpl(ReadWorkbook readWorkbook) {
|
|
|
|
try {
|
|
|
|
analysisContext = new AnalysisContextImpl(readWorkbook);
|
|
|
|
choiceExcelExecutor();
|
|
|
|
} catch (RuntimeException e) {
|
|
|
|
finish();
|
|
|
|
throw e;
|
|
|
|
} catch (Throwable e) {
|
|
|
|
finish();
|
|
|
|
throw new ExcelAnalysisException(e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void choiceExcelExecutor() throws Exception {
|
|
|
|
ExcelTypeEnum excelType = analysisContext.readWorkbookHolder().getExcelType();
|
|
|
|
if (excelType == null) {
|
|
|
|
excelExecutor = new XlsxSaxAnalyser(analysisContext);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
switch (excelType) {
|
|
|
|
case XLS:
|
|
|
|
excelExecutor = new XlsSaxAnalyser(analysisContext);
|
|
|
|
break;
|
|
|
|
case XLSX:
|
|
|
|
excelExecutor = new XlsxSaxAnalyser(analysisContext);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void analysis(ReadSheet readSheet) {
|
|
|
|
try {
|
|
|
|
analysisContext.currentSheet(excelExecutor, readSheet);
|
|
|
|
excelExecutor.execute();
|
|
|
|
analysisContext.readSheetHolder().notifyAfterAllAnalysed(analysisContext);
|
|
|
|
} catch (RuntimeException e) {
|
|
|
|
finish();
|
|
|
|
throw e;
|
|
|
|
} catch (Throwable e) {
|
|
|
|
finish();
|
|
|
|
throw new ExcelAnalysisException(e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void finish() {
|
|
|
|
if (analysisContext == null || analysisContext.readWorkbookHolder() == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
ReadWorkbookHolder readWorkbookHolder = analysisContext.readWorkbookHolder();
|
|
|
|
try {
|
|
|
|
if (readWorkbookHolder.getReadCache() != null) {
|
|
|
|
readWorkbookHolder.getReadCache().destroy();
|
|
|
|
}
|
|
|
|
if (analysisContext.readWorkbookHolder().getAutoCloseStream()
|
|
|
|
&& readWorkbookHolder.getInputStream() != null) {
|
|
|
|
readWorkbookHolder.getInputStream().close();
|
|
|
|
}
|
|
|
|
if (readWorkbookHolder.getTempFile() != null) {
|
|
|
|
FileUtils.delete(readWorkbookHolder.getTempFile());
|
|
|
|
}
|
|
|
|
} catch (IOException e) {
|
|
|
|
throw new ExcelAnalysisException("Can not close IO", e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public com.alibaba.excel.analysis.ExcelExecutor excelExecutor() {
|
|
|
|
return excelExecutor;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public AnalysisContext analysisContext() {
|
|
|
|
return analysisContext;
|
|
|
|
}
|
|
|
|
}
|