Java tutorial
/** * Copyright 2013-2015 JueYue (qrb.jueyue@gmail.com) * <p> * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package cn.afterturn.easypoi.excel.imports.sax; import cn.afterturn.easypoi.excel.entity.enmus.CellValueType; import cn.afterturn.easypoi.excel.entity.sax.SaxReadCellEntity; import cn.afterturn.easypoi.excel.imports.sax.parse.ISaxRowRead; import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.xssf.model.SharedStringsTable; import org.apache.poi.xssf.model.StylesTable; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import static cn.afterturn.easypoi.excel.entity.sax.SaxConstant.*; /** * ? * * @author JueYue * 20141229 ?9:50:09 */ public class SheetHandler extends DefaultHandler { private SharedStringsTable sharedStringsTable; private StylesTable stylesTable; private String lastContents; /** ?**/ private int curRow = 0; /**? **/ private int curCol = 0; private CellValueType type; private ISaxRowRead read; private List<SaxReadCellEntity> rowList = new ArrayList<>(); public SheetHandler(SharedStringsTable sharedStringsTable, StylesTable stylesTable, ISaxRowRead rowRead) { this.sharedStringsTable = sharedStringsTable; this.stylesTable = stylesTable; this.read = rowRead; } @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { // lastContents = ""; if (COL.equals(name)) { String cellType = attributes.getValue(TYPE); if (STRING.equals(cellType)) { type = CellValueType.String; return; } if (BOOLEAN.equals(cellType)) { type = CellValueType.Boolean; return; } if (DATE.equals(cellType)) { type = CellValueType.Date; return; } if (INLINE_STR.equals(cellType)) { type = CellValueType.InlineStr; return; } if (FORMULA.equals(cellType)) { type = CellValueType.Formula; return; } if (NUMBER.equals(cellType)) { type = CellValueType.Number; return; } try { short nfId = (short) stylesTable.getCellXfAt(Integer.parseInt(attributes.getValue(STYLE))) .getNumFmtId(); String numberFormat = stylesTable.getNumberFormats().get(nfId).toUpperCase(); if (StringUtils.isNotEmpty(numberFormat)) { if (numberFormat.contains("Y") || numberFormat.contains("M") || numberFormat.contains("D") || numberFormat.contains("H") || numberFormat.contains("S") || numberFormat.contains("") || numberFormat.contains("") || numberFormat.contains("") || numberFormat.contains("") || numberFormat.contains("") || numberFormat.contains("")) { type = CellValueType.Date; return; } } } catch (Exception e) { } // type = CellValueType.Number; } else if (T_ELEMENT.equals(name)) { type = CellValueType.TElement; } } @Override public void endElement(String uri, String localName, String name) throws SAXException { // ?SST?? // characters()? if (CellValueType.String.equals(type)) { try { int idx = Integer.parseInt(lastContents); lastContents = sharedStringsTable.getItemAt(idx).getString(); } catch (Exception e) { } } //t? if (CellValueType.TElement.equals(type)) { String value = lastContents.trim(); rowList.add(curCol, new SaxReadCellEntity(CellValueType.String, value)); curCol++; type = CellValueType.None; // v => ??vSST // ?rowlist??? } else if (VALUE.equals(name)) { String value = lastContents.trim(); value = "".equals(value) ? " " : value; if (CellValueType.Date.equals(type)) { Date date = HSSFDateUtil.getJavaDate(Double.valueOf(value)); rowList.add(curCol, new SaxReadCellEntity(CellValueType.Date, date)); } else if (CellValueType.Number.equals(type)) { BigDecimal bd = new BigDecimal(value); rowList.add(curCol, new SaxReadCellEntity(CellValueType.Number, bd)); } else if (CellValueType.String.equals(type) || CellValueType.InlineStr.equals(type)) { rowList.add(curCol, new SaxReadCellEntity(CellValueType.String, value)); } curCol++; //?? row optRows() } else if (COL.equals(name) && StringUtils.isEmpty(lastContents)) { rowList.add(curCol, new SaxReadCellEntity(CellValueType.String, "")); curCol++; } else if (ROW.equals(name)) { read.parse(curRow, rowList); rowList.clear(); curRow++; curCol = 0; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { //? lastContents += new String(ch, start, length); } }