DefaultCellHandler.java 5.0 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 20
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.util.BooleanUtils;
clevertension's avatar
clevertension 已提交
21
import com.alibaba.excel.util.PositionUtils;
Z
zhuangjiaju 已提交
22
import com.alibaba.excel.util.StringUtils;
clevertension's avatar
clevertension 已提交
23 24 25

public class DefaultCellHandler implements XlsxCellHandler, XlsxRowResultHolder {
    private final AnalysisContext analysisContext;
Z
zhuangjiaju 已提交
26 27 28 29 30 31
    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 已提交
32

Z
zhuangjiaju 已提交
33
    public DefaultCellHandler(AnalysisContext analysisContext) {
clevertension's avatar
clevertension 已提交
34 35
        this.analysisContext = analysisContext;
    }
Z
zhuangjiaju 已提交
36

clevertension's avatar
clevertension 已提交
37 38
    @Override
    public void clearResult() {
Z
zhuangjiaju 已提交
39
        curRowContent = new CellData[20];
clevertension's avatar
clevertension 已提交
40 41 42 43
    }

    @Override
    public boolean support(String name) {
Z
zhuangjiaju 已提交
44
        return CELL_VALUE_TAG.equals(name) || CELL_FORMULA_TAG.equals(name) || CELL_INLINE_STRING_VALUE_TAG.equals(name)
Z
zhuangjiaju 已提交
45
            || CELL_TAG.equals(name);
clevertension's avatar
clevertension 已提交
46 47 48 49
    }

    @Override
    public void startHandle(String name, Attributes attributes) {
Z
zhuangjiaju 已提交
50 51
        currentTag = name;
        // start a cell
clevertension's avatar
clevertension 已提交
52 53 54 55 56 57 58 59 60
        if (CELL_TAG.equals(name)) {
            currentCellIndex = attributes.getValue(ExcelXmlConstants.POSITION);
            int nextRow = PositionUtils.getRow(currentCellIndex);
            if (nextRow > curRow) {
                curRow = nextRow;
            }
            analysisContext.setCurrentRowNum(curRow);
            curCol = PositionUtils.getCol(currentCellIndex);

Z
zhuangjiaju 已提交
61
            // t="s" ,it's means String
Z
zhuangjiaju 已提交
62
            // t="inlineStr" ,it's means String
Z
zhuangjiaju 已提交
63
            // t="b" ,it's means Boolean
Z
zhuangjiaju 已提交
64
            // t="e" ,it's means Error
Z
zhuangjiaju 已提交
65 66 67
            // 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 已提交
68
        }
Z
zhuangjiaju 已提交
69 70 71
        // cell is formula
        if (CELL_FORMULA_TAG.equals(name)) {
            currentCellData.setReadIsFormula(Boolean.TRUE);
clevertension's avatar
clevertension 已提交
72 73 74 75 76 77
        }
    }

    @Override
    public void endHandle(String name) {
        if (CELL_VALUE_TAG.equals(name)) {
Z
zhuangjiaju 已提交
78 79 80
            ensureSize();
            // Have to go "sharedStrings.xml" and get it
            if (currentCellData.getType() == CellDataTypeEnum.STRING) {
Z
zhuangjiaju 已提交
81 82
                currentCellData.setStringValue(analysisContext.currentWorkbookHolder().getReadCache()
                    .get(Integer.valueOf(currentCellData.getStringValue())));
clevertension's avatar
clevertension 已提交
83
            }
Z
zhuangjiaju 已提交
84
            curRowContent[curCol] = currentCellData;
clevertension's avatar
clevertension 已提交
85
        }
Z
zhuangjiaju 已提交
86 87 88 89 90 91 92
        // 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 已提交
93 94 95 96 97
    }

    private void ensureSize() {
        // try to size
        if (curCol >= curRowContent.length) {
Z
zhuangjiaju 已提交
98
            curRowContent = Arrays.copyOf(curRowContent, (int)(curCol * 1.5));
clevertension's avatar
clevertension 已提交
99 100 101 102 103
        }
    }

    @Override
    public void appendCurrentCellValue(String currentCellValue) {
Z
zhuangjiaju 已提交
104 105
        if (StringUtils.isEmpty(currentCellValue)) {
            return;
Z
zhuangjiaju 已提交
106 107 108
        }
        if (currentTag == null) {
            return;
Z
zhuangjiaju 已提交
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
        }
        if (CELL_FORMULA_TAG.equals(currentTag)) {
            currentCellData.setReadFormula(currentCellValue);
            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 已提交
130 131 132
    }

    @Override
Z
zhuangjiaju 已提交
133
    public CellData[] getCurRowContent() {
clevertension's avatar
clevertension 已提交
134 135 136 137 138 139 140 141 142
        return this.curRowContent;
    }

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

}