class ExcelImportUtil extends DefaultHandler {
private ExcelImportParse importExcel;
private StylesTable stylesTable;
private SharedStringsTable sst;
private String lastContents;
private boolean nextIsString;
private List<String> rowlist = new ArrayList<>();
private HashMap<Integer, String> rowMap = new HashMap<Integer, String>();
private int curRow = 0;
// private int curCol = 0;
// 定义前一个元素和当前元素的位置,用来计算其中空的单元格数量,如A6和A8等
private String preRef = null, ref = null;
// 定义该文档一行最大的单元格数,用来补全一行最后可能缺失的单元格
private String maxRef = null;
private CellDataType nextDataType = CellDataType.SSTINDEX;
private final DataFormatter formatter = new DataFormatter();
private short formatIndex;
private String formatString;
private Logger logger = LoggerFactory.getLogger(getClass());
private int sheetIndex = -1;
private Long headerIs = null;
// 用一个enum表示单元格可能的数据类型
enum CellDataType {
BOOL, ERROR, FORMULA, INLINESTR, SSTINDEX, NUMBER, DATE, NULL
}
public ExcelImportUtil(ExcelImportParse importExcel) {
this.importExcel = importExcel;
}
public void process(InputStream is,Long headerIs) throws Exception {
if (null == importExcel) {
throw new ValidationException(new ValidationError("importExcel","需要rowStrategy"));
}
this.headerIs=headerIs;
OPCPackage pkg = OPCPackage.open(is);
XSSFReader r = new XSSFReader(pkg);
stylesTable = r.getStylesTable();
SharedStringsTable sst = r.getSharedStringsTable();
XMLReader parser = fetchSheetParser(sst);
Iterator<InputStream> sheets = r.getSheetsData();
while (sheets.hasNext()) {
sheetIndex++;
InputStream sheet = sheets.next();
InputSource sheetSource = new InputSource(sheet);
parser.parse(sheetSource);
sheet.close();
}
importExcel.doService();
}
public XMLReader fetchSheetParser(SharedStringsTable sst)
throws SAXException {
XMLReader parser = XMLReaderFactory
.createXMLReader("org.apache.xerces.parsers.SAXParser");