DefaultCellHandler.java 4.9 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;
clevertension's avatar
clevertension 已提交
4
import static com.alibaba.excel.constant.ExcelXmlConstants.CELL_TAG;
Z
zhuangjiaju 已提交
5
import static com.alibaba.excel.constant.ExcelXmlConstants.CELL_VALUE_TAG;
clevertension's avatar
clevertension 已提交
6
import static com.alibaba.excel.constant.ExcelXmlConstants.CELL_VALUE_TAG_1;
Z
zhuangjiaju 已提交
7
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.ss.usermodel.RichTextString;
clevertension's avatar
clevertension 已提交
12 13 14 15 16 17 18
import org.apache.poi.xssf.model.SharedStringsTable;
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 已提交
19
import com.alibaba.excel.enums.CellDataTypeEnum;
clevertension's avatar
clevertension 已提交
20
import com.alibaba.excel.event.AnalysisEventRegistryCenter;
Z
zhuangjiaju 已提交
21 22
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.util.BooleanUtils;
clevertension's avatar
clevertension 已提交
23
import com.alibaba.excel.util.PositionUtils;
Z
zhuangjiaju 已提交
24
import com.alibaba.excel.util.StringUtils;
clevertension's avatar
clevertension 已提交
25 26 27 28 29

public class DefaultCellHandler implements XlsxCellHandler, XlsxRowResultHolder {
    private final AnalysisContext analysisContext;
    private final AnalysisEventRegistryCenter registerCenter;
    private final SharedStringsTable sst;
Z
zhuangjiaju 已提交
30 31 32 33 34 35
    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 已提交
36

Z
zhuangjiaju 已提交
37 38
    public DefaultCellHandler(AnalysisContext analysisContext, AnalysisEventRegistryCenter registerCenter,
        SharedStringsTable sst) {
clevertension's avatar
clevertension 已提交
39 40 41 42
        this.analysisContext = analysisContext;
        this.registerCenter = registerCenter;
        this.sst = sst;
    }
Z
zhuangjiaju 已提交
43

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

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

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

Z
zhuangjiaju 已提交
69 70 71 72 73
            // t="s" ,it's means String
            // t="b" ,it's means Boolean
            // 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 77
        // cell is formula
        if (CELL_FORMULA_TAG.equals(name)) {
            currentCellData.setReadIsFormula(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 87 88
            ensureSize();
            // Have to go "sharedStrings.xml" and get it
            if (currentCellData.getType() == CellDataTypeEnum.STRING) {
                RichTextString richTextString = sst.getItemAt(Integer.parseInt(currentCellData.getStringValue()));
                currentCellData.setStringValue(richTextString.toString());
clevertension's avatar
clevertension 已提交
89
            }
Z
zhuangjiaju 已提交
90
            curRowContent[curCol] = currentCellData;
clevertension's avatar
clevertension 已提交
91 92 93 94 95 96
        }
    }

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

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

    @Override
Z
zhuangjiaju 已提交
129
    public CellData[] getCurRowContent() {
clevertension's avatar
clevertension 已提交
130 131 132 133 134 135 136 137 138
        return this.curRowContent;
    }

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

}