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

com.github.shaohj.sstool.poiexpand.common.bean.write.tag.EachTagData Maven / Gradle / Ivy

package com.github.shaohj.sstool.poiexpand.common.bean.write.tag;

import com.github.shaohj.sstool.core.util.ExprUtil;
import com.github.shaohj.sstool.core.util.MapUtil;
import com.github.shaohj.sstool.core.util.StrUtil;
import com.github.shaohj.sstool.poiexpand.common.bean.read.CellData;
import com.github.shaohj.sstool.poiexpand.common.bean.read.RowData;
import com.github.shaohj.sstool.poiexpand.common.bean.write.WriteSheetData;
import com.github.shaohj.sstool.poiexpand.common.consts.SaxExcelConst;
import com.github.shaohj.sstool.poiexpand.common.consts.TagEnum;
import com.github.shaohj.sstool.poiexpand.common.util.write.TagUtil;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.DynaProperty;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFSheet;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import java.util.StringTokenizer;

/**
 * 编  号:
 * 名  称:EachTagData
 * 描  述:迭代object的属性输出每个属性值,解决动态列模板导出
 * 完成日期:2019/6/19 23:45
 * @author:felix.shao
 */
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@Slf4j
public class EachTagData extends TagData{

    private String expr;

    private String modelName;

    /** 只遍历指定的属性 */
    private String onkeys;

    protected RowData readRowData;

    public EachTagData(RowData readRowData) {
        this.readRowData = readRowData;
    }

    @Override
    public String getRealExpr() {
        return null != value ?
                String.valueOf(value).replace(SaxExcelConst.TAG_KEY + TagEnum.EACH_TAG.getKey(), "").trim()
                : "";
    }

    @Override
    public void writeTagData(Workbook writeWb, SXSSFSheet writeSheet, WriteSheetData writeSheetData,
                             Map params, Map writeCellStyleCache) {
        int curWriteRowNum = writeSheetData.getCurWriteRowNum();

        initExpr();
        initReadRowData(params);
        TagUtil.writeTagData(writeWb, writeSheet, writeSheetData, Arrays.asList(readRowData), params, writeCellStyleCache);

        TagUtil.writeTagMergeRegion(allCellRangeAddress, curWriteRowNum, writeWb, writeSheet, writeSheetData);
    }

    /**
     * each标签将根据数据动态初始化需要写入的数据
     *   只会读取第一个RowData的第一个列数据,然后根据数据以第一列复制多个列
     * @param params
     */
    private void initReadRowData(Map params){
        Map cellDataMap = readRowData.getCellDatas();
        if (!MapUtil.isEmpty(cellDataMap)){
            CellData eachCellData = cellDataMap.get("0");

            Object iteratorObj = ExprUtil.getExprStrValue(params, expr);
            if(null == iteratorObj){
                return;
            }
            Iterator iterator;
            if(iteratorObj instanceof Map){
                iterator =  ExprUtil.getIterator(iteratorObj);
            } else {
                iterator =  ExprUtil.getIterator(ExprUtil.getBeanProperties(iteratorObj.getClass()));
            }

            int colNum = 0;
            while (iterator.hasNext()) {
                Object o = iterator.next();

                String property = "";
                if (o instanceof Field) {
                    property = ((Field) o).getName();
                } else if (o instanceof Map.Entry) {
                    property = ((Map.Entry) o).getKey().toString();
                } else if (o instanceof DynaProperty) {
                    property = ((DynaProperty) o).getName();
                } else {
                    property = o.toString();
                }

                property = SaxExcelConst.EXPR_START + modelName + "." + property + SaxExcelConst.EXPR_END;

                CellData colCellData = new CellData(colNum, property, eachCellData.getCellStyle(), eachCellData.getCellType());
                cellDataMap.put(String.valueOf(colNum ++), colCellData);
            }
        }
    }

    private void initExpr(){
        String realExpr = getRealExpr();
        if(StrUtil.isEmpty(realExpr)){
            return;
        }
        StringTokenizer st = new StringTokenizer(realExpr, " ");
        int pos = 0;
        while (st.hasMoreTokens()) {
            String str = st.nextToken();
            if (pos == 0) {
                expr = str;
            }
            if (pos == 1 && !"on".equals(str)) {
                onkeys = str;
            }
            if (pos == 2) {
                onkeys = str;
            }
            pos++;
        }

        modelName = expr.substring(SaxExcelConst.EXPR_START.length(), expr.length() - SaxExcelConst.EXPR_END.length());
    };

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy