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

com.github.shaohj.sstool.poiexpand.common.util.ExcelCommonUtil Maven / Gradle / Ivy

package com.github.shaohj.sstool.poiexpand.common.util;

import com.github.shaohj.sstool.core.util.MapUtil;
import com.github.shaohj.sstool.core.util.StrUtil;
import com.github.shaohj.sstool.poiexpand.common.bean.write.MergeRegionParam;
import com.github.shaohj.sstool.poiexpand.common.consts.SaxExcelConst;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTMergeCell;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTMergeCells;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 编  号:
 * 名  称:ExcelCommonUtil
 * 描  述:
 * 完成日期:2019/6/19 23:53
 * @author:felix.shao
 */
@Slf4j
public class ExcelCommonUtil {

    /**
     * 获取Sheet最大的数据列数
     * @param sheet :
     * @return int  最大列数为3则返回3
     * @author SHJ
     */
    public static int getMaxCellNum(Sheet sheet){
        int rows = sheet.getPhysicalNumberOfRows();
        int maxCellNum = 0;

        for(int i=0; i< rows; i++){
            Row tRow = sheet.getRow(i);
            if(null != tRow){
                int tempNum = tRow.getLastCellNum();
                maxCellNum = tempNum > maxCellNum ? tempNum : maxCellNum;
            }
        }
        return maxCellNum;
    }

    /**
     * 获取excel所有的列宽
     * @param sheet
     * @param maxCellNum
     * @return
     */
    public static int[] getCellWidths(Sheet sheet, int maxCellNum){
        int[] cellWidths = new int[maxCellNum];

        for (int i = 0; i < maxCellNum; i++) {
            cellWidths[i] = sheet.getColumnWidth(i);
        }

        return cellWidths;
    }

    public static Object getCellValue(Cell cell){
        Object result = null;
        switch (cell.getCellTypeEnum()) {
            case BOOLEAN:
                result = cell.getBooleanCellValue(); break;
            case FORMULA:
                result = cell.getCellFormula(); break;
            case NUMERIC:
                result = cell.getNumericCellValue(); break;
            case STRING:
                result = cell.getStringCellValue(); break;
            default:
        }
        return result;
    }

    public static void setCellValue(Cell writeCell, Object value){
        if(null == value){
            writeCell.setCellValue("");
        } else {
            if ("java.lang.Integer".equals(value.getClass().getName())) {
                writeCell.setCellValue(Double.parseDouble(value.toString()));
            } else if ("java.lang.Double".equals(value.getClass().getName())) {
                writeCell.setCellValue(((Double) value).doubleValue());
            } else if ("java.util.Date".equals(value.getClass().getName())) {
                writeCell.setCellValue((Date) value);
            } else if ("java.lang.Boolean".equals(value.getClass().getName())) {
                writeCell.setCellValue(((Boolean) value).booleanValue());
            } else if ("java.lang.String".equals(value.getClass().getName())) {
                writeCell.setCellValue(value.toString());
            } else {
                writeCell.setCellValue(value.toString());
            }
        }
    }

    /**
     * 定制化的合并单元格优化
     * 对比原有合并单元格,去掉了验证逻辑和返回值
     * @param sxssfWorkbok
     * @param sheetName
     * @param region
     * @param mergeCellsCount
     */
    public static void addMergeRegion(SXSSFWorkbook sxssfWorkbok, String sheetName, CellRangeAddress region, int mergeCellsCount) {
        XSSFSheet sheet = sxssfWorkbok.getXSSFWorkbook().getSheet(sheetName);
        CTWorksheet ctWorksheet = sheet.getCTWorksheet();

        CTMergeCells ctMergeCells = mergeCellsCount > 0 ?ctWorksheet.getMergeCells():ctWorksheet.addNewMergeCells();
        CTMergeCell ctMergeCell = ctMergeCells.addNewMergeCell();

        ctMergeCell.setRef(region.formatAsString());
    }

    /**
     * 获取动态设置的合并单元格参数
     * @param rowData eq:#each ${model} mergeRegion=0,1,0,2|0,1,2,4  即第1行第1和2列合并,第1行第3和4列合并,多个用|隔开
     * @return MergeRegionParam
     */
    public static Map getMergeRegionParam(String rowData){
        if(StrUtil.isEmpty(rowData)){
            return new HashMap<>(0);
        }
        int idx = rowData.lastIndexOf(SaxExcelConst.MERGE_REGION_OPT);
        if(idx < 0){
            return new HashMap<>(0);
        }
        String params = rowData.substring(idx + SaxExcelConst.MERGE_REGION_OPT.length());
        if(StrUtil.isEmpty(params)){
            return new HashMap<>(0);
        }
        String[] mRegionParams = params.split("[|]");

        Map result = new HashMap<>(MapUtil.calMapSize(mRegionParams.length));

        for (int i = 0; i < mRegionParams.length; i++ ){
            String[] mrTemp = mRegionParams[i].split(",");
            if(4 != mrTemp.length){
                log.warn("mergeRegion param config error, ignore the str = {}", mRegionParams[i]);
            } else {
                MergeRegionParam mrParam = new MergeRegionParam();
                mrParam.setRelaStartRow(Integer.parseInt(mrTemp[0]));
                mrParam.setRelaEndRow(Integer.parseInt(mrTemp[1]));
                mrParam.setStartCol(Integer.parseInt(mrTemp[2]));
                mrParam.setEndCol(Integer.parseInt(mrTemp[3]));

                result.put("dy_" + i , mrParam);
            }
        }

        return result;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy