All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.zouzhiy.excel.handler.AbstractCellHandler Maven / Gradle / Ivy

The newest version!
/*
 * 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
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * 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 io.github.zouzhiy.excel.handler;

import io.github.zouzhiy.excel.context.RowContext;
import io.github.zouzhiy.excel.context.SheetContext;
import io.github.zouzhiy.excel.enums.ExcelType;
import io.github.zouzhiy.excel.exceptions.ExcelException;
import io.github.zouzhiy.excel.metadata.config.ExcelFieldConfig;
import io.github.zouzhiy.excel.metadata.result.CellResult;
import io.github.zouzhiy.excel.metadata.result.CellResultSet;
import io.github.zouzhiy.excel.utils.RegionUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * @author zouzhiy
 * @since 2022/7/2
 */
public abstract class AbstractCellHandler implements CellHandler {

    private final Class javaType;

    public AbstractCellHandler() {
        this.javaType = getSuperclassTypeParameter(this.getClass());
    }

    @Override
    public final Class getJavaType() {
        return javaType;
    }

    @Override
    public final T read(SheetContext sheetContext, ExcelFieldConfig excelFieldConfig, CellResultSet cellResultSet) {
        if (cellResultSet == null) {
            return null;
        }
        CellResult firstCellResult = cellResultSet.getFirstCellResult();
        if (cellResultSet.isNone() || firstCellResult.isNone()) {
            return null;
        } else if (firstCellResult.isBlank() && !this.getExcelType().equals(ExcelType.NONE)) {
            return this.getBlankValue();
        }
        return getCellValue(sheetContext, excelFieldConfig, firstCellResult);
    }

    @Override
    public final void write(RowContext rowContext, Integer columnIndex, ExcelFieldConfig excelFieldConfig, T value) {
        Row row = rowContext.getRowList().get(0);
        Cell cell = row.createCell(columnIndex);
        if (value != null) {
            this.setCellValue(rowContext, excelFieldConfig, cell, value);
        }

        SheetContext sheetContext = rowContext.getSheetContext();
        CellStyle cellStyle = sheetContext.getDataCellStyle(excelFieldConfig, this.getDefaultExcelFormat());
        cell.setCellStyle(cellStyle);

        int rowspan = rowContext.getRowspan();
        int colspan = excelFieldConfig.getColspan();
        int rowIndex = row.getRowNum();
        RegionUtils.addMergedRegionIfPresent(sheetContext, cellStyle, rowIndex, rowIndex + rowspan - 1, columnIndex, columnIndex + colspan - 1);
    }

    protected abstract T getCellValue(SheetContext sheetContext, ExcelFieldConfig excelFieldConfig, CellResult firstCellResult);

    protected abstract void setCellValue(RowContext rowContext, ExcelFieldConfig excelFieldConfig, Cell cell, T value);

    protected T getBlankValue() {
        return null;
    }

    private Class getSuperclassTypeParameter(Class clazz) {
        Type genericSuperclass = clazz.getGenericSuperclass();
        if (genericSuperclass instanceof Class) {
            // try to climb up the hierarchy until meet something useful
            if (AbstractCellHandler.class != genericSuperclass) {
                return getSuperclassTypeParameter(clazz.getSuperclass());
            }

            throw new ExcelException("'" + getClass() + "' extends TypeReference but misses the type parameter. "
                    + "Remove the extension or add a type parameter to it.");
        }

        Type rawType = ((ParameterizedType) genericSuperclass).getActualTypeArguments()[0];
        // TODO remove this when Reflector is fixed to return Types
        if (rawType instanceof ParameterizedType) {
            rawType = ((ParameterizedType) rawType).getRawType();
        }

        //noinspection unchecked
        return (Class) rawType;
    }

    protected String getJavaFormat(ExcelFieldConfig excelFieldConfig) {
        String javaFormat = excelFieldConfig.getJavaFormat();
        if (javaFormat == null || javaFormat.length() > 0) {
            return javaFormat;
        } else {
            return this.getDefaultJavaFormat();
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy