DefaultCellHandler.java 5.2 KB
Newer Older
clevertension's avatar
clevertension 已提交
1 2
package com.alibaba.excel.analysis.v07.handlers;

Z
zhuangjiaju 已提交
3
import static com.alibaba.excel.constant.ExcelXmlConstants.CELL_FORMULA_TAG;
Z
zhuangjiaju 已提交
4
import static com.alibaba.excel.constant.ExcelXmlConstants.CELL_INLINE_STRING_VALUE_TAG;
clevertension's avatar
clevertension 已提交
5
import static com.alibaba.excel.constant.ExcelXmlConstants.CELL_TAG;
Z
zhuangjiaju 已提交
6 7
import static com.alibaba.excel.constant.ExcelXmlConstants.CELL_VALUE_TAG;
import static com.alibaba.excel.constant.ExcelXmlConstants.CELL_VALUE_TYPE_TAG;
clevertension's avatar
clevertension 已提交
8 9 10

import java.util.Arrays;

Z
zhuangjiaju 已提交
11
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
clevertension's avatar
clevertension 已提交
12 13 14 15 16 17
import org.xml.sax.Attributes;

import com.alibaba.excel.analysis.v07.XlsxCellHandler;
import com.alibaba.excel.analysis.v07.XlsxRowResultHolder;
import com.alibaba.excel.constant.ExcelXmlConstants;
import com.alibaba.excel.context.AnalysisContext;
Z
zhuangjiaju 已提交
18 19
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
20
import com.alibaba.excel.read.metadata.holder.ReadRowHolder;
Z
zhuangjiaju 已提交
21
import com.alibaba.excel.util.BooleanUtils;
clevertension's avatar
clevertension 已提交
22
import com.alibaba.excel.util.PositionUtils;
Z
zhuangjiaju 已提交
23
import com.alibaba.excel.util.StringUtils;
24 25 26 27 28
/**
 * Cell Handler
 *
 * @author jipengfei
 */
clevertension's avatar
clevertension 已提交
29 30
public class DefaultCellHandler implements XlsxCellHandler, XlsxRowResultHolder {
    private final AnalysisContext analysisContext;
Z
zhuangjiaju 已提交
31 32 33 34 35 36
    private String currentTag;
    private String currentCellIndex;
    private int curRow;
    private int curCol;
    private CellData[] curRowContent = new CellData[20];
    private CellData currentCellData;
clevertension's avatar
clevertension 已提交
37

Z
zhuangjiaju 已提交
38
    public DefaultCellHandler(AnalysisContext analysisContext) {
clevertension's avatar
clevertension 已提交
39 40
        this.analysisContext = analysisContext;
    }
Z
zhuangjiaju 已提交
41

clevertension's avatar
clevertension 已提交
42 43
    @Override
    public void clearResult() {
Z
zhuangjiaju 已提交
44
        curRowContent = new CellData[20];
clevertension's avatar
clevertension 已提交
45 46 47 48
    }

    @Override
    public boolean support(String name) {
Z
zhuangjiaju 已提交
49
        return CELL_VALUE_TAG.equals(name) || CELL_FORMULA_TAG.equals(name) || CELL_INLINE_STRING_VALUE_TAG.equals(name)
Z
zhuangjiaju 已提交
50
            || CELL_TAG.equals(name);
clevertension's avatar
clevertension 已提交
51 52 53 54
    }

    @Override
    public void startHandle(String name, Attributes attributes) {
Z
zhuangjiaju 已提交
55 56
        currentTag = name;
        // start a cell
clevertension's avatar
clevertension 已提交
57 58 59 60 61 62
        if (CELL_TAG.equals(name)) {
            currentCellIndex = attributes.getValue(ExcelXmlConstants.POSITION);
            int nextRow = PositionUtils.getRow(currentCellIndex);
            if (nextRow > curRow) {
                curRow = nextRow;
            }
63 64
            analysisContext
                .readRowHolder(new ReadRowHolder(curRow, analysisContext.readSheetHolder().getGlobalConfiguration()));
clevertension's avatar
clevertension 已提交
65 66
            curCol = PositionUtils.getCol(currentCellIndex);

Z
zhuangjiaju 已提交
67
            // t="s" ,it's means String
Z
zhuangjiaju 已提交
68
            // t="inlineStr" ,it's means String
Z
zhuangjiaju 已提交
69
            // t="b" ,it's means Boolean
Z
zhuangjiaju 已提交
70
            // t="e" ,it's means Error
Z
zhuangjiaju 已提交
71 72 73
            // t is null ,it's means Empty or Number
            CellDataTypeEnum type = CellDataTypeEnum.buildFromCellType(attributes.getValue(CELL_VALUE_TYPE_TAG));
            currentCellData = new CellData(type);
clevertension's avatar
clevertension 已提交
74
        }
Z
zhuangjiaju 已提交
75 76
        // cell is formula
        if (CELL_FORMULA_TAG.equals(name)) {
77
            currentCellData.setFormula(Boolean.TRUE);
clevertension's avatar
clevertension 已提交
78 79 80 81 82 83
        }
    }

    @Override
    public void endHandle(String name) {
        if (CELL_VALUE_TAG.equals(name)) {
Z
zhuangjiaju 已提交
84 85 86
            ensureSize();
            // Have to go "sharedStrings.xml" and get it
            if (currentCellData.getType() == CellDataTypeEnum.STRING) {
87
                currentCellData.setStringValue(analysisContext.readWorkbookHolder().getReadCache()
Z
zhuangjiaju 已提交
88
                    .get(Integer.valueOf(currentCellData.getStringValue())));
clevertension's avatar
clevertension 已提交
89
            }
Z
zhuangjiaju 已提交
90
            curRowContent[curCol] = currentCellData;
clevertension's avatar
clevertension 已提交
91
        }
Z
zhuangjiaju 已提交
92 93 94 95 96 97 98
        // This is a special form of string
        if (CELL_INLINE_STRING_VALUE_TAG.equals(name)) {
            ensureSize();
            XSSFRichTextString richTextString = new XSSFRichTextString(currentCellData.getStringValue());
            currentCellData.setStringValue(richTextString.toString());
            curRowContent[curCol] = currentCellData;
        }
clevertension's avatar
clevertension 已提交
99 100 101 102 103
    }

    private void ensureSize() {
        // try to size
        if (curCol >= curRowContent.length) {
Z
zhuangjiaju 已提交
104
            curRowContent = Arrays.copyOf(curRowContent, (int)(curCol * 1.5));
clevertension's avatar
clevertension 已提交
105 106 107 108 109
        }
    }

    @Override
    public void appendCurrentCellValue(String currentCellValue) {
Z
zhuangjiaju 已提交
110 111
        if (StringUtils.isEmpty(currentCellValue)) {
            return;
Z
zhuangjiaju 已提交
112 113 114
        }
        if (currentTag == null) {
            return;
Z
zhuangjiaju 已提交
115 116
        }
        if (CELL_FORMULA_TAG.equals(currentTag)) {
117
            currentCellData.setFormulaValue(currentCellValue);
Z
zhuangjiaju 已提交
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
            return;
        }
        CellDataTypeEnum oldType = currentCellData.getType();
        switch (oldType) {
            case STRING:
            case ERROR:
                currentCellData.setStringValue(currentCellValue);
                break;
            case BOOLEAN:
                currentCellData.setBooleanValue(BooleanUtils.valueOf(currentCellValue));
                break;
            case EMPTY:
                currentCellData.setType(CellDataTypeEnum.NUMBER);
                currentCellData.setDoubleValue(Double.valueOf(currentCellValue));
                break;
            default:
                throw new IllegalStateException("Cannot set values now");
        }
clevertension's avatar
clevertension 已提交
136 137 138
    }

    @Override
Z
zhuangjiaju 已提交
139
    public CellData[] getCurRowContent() {
clevertension's avatar
clevertension 已提交
140 141 142 143 144 145 146 147 148
        return this.curRowContent;
    }

    @Override
    public int getColumnSize() {
        return this.curCol;
    }

}