Luckysheet将excel导入生成对应的格式文件静态方法

使用开源Luckysheet表格,需要读取xls或者xlsx文件为luckysheet的json格式,java版本,项目中已使用。 

package com.util.excel;



import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Color;
import org.apache.poi.xssf.usermodel.XSSFColor;


/**
 * @author Administrator
 */
@Slf4j
public class ColorUtil {

    private static final String S = "0123456789ABCDEF";

    public static Short getColorByStr(String colorStr){
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFPalette palette = workbook.getCustomPalette();

        if(colorStr.toLowerCase().startsWith("rgb")){
            colorStr=colorStr.toLowerCase().replace("rgb(","").replace(")","");
            String[] colors=colorStr.split(",");
            if(colors.length==3){
                try{
                    int red = Integer.parseInt(colors[0].trim(),16);
                    int green = Integer.parseInt(colors[1].trim(),16);
                    int blue = Integer.parseInt(colors[2].trim(),16);

                    HSSFColor hssfColor=palette.findSimilarColor(red,green,blue);
                    return hssfColor.getIndex();
                }catch (Exception ex){
                    log.error(ex.toString());
                    return null;
                }
            }
            return null;
        }

        if(colorStr.equals("#000")){
            colorStr="#000000";
        }
        if(colorStr!=null && colorStr.length()>=6){
            try{
                if(colorStr.length()==8){
                    colorStr=colorStr.substring(2);
                }
                if(colorStr.length()==7){
                    colorStr=colorStr.substring(1);
                }
                String str2 = colorStr.substring(0,2);
                String str3 = colorStr.substring(2,4);
                String str4 = colorStr.substring(4,6);
                int red = Integer.parseInt(str2,16);
                int green = Integer.parseInt(str3,16);
                int blue = Integer.parseInt(str4,16);

                HSSFColor hssfColor=palette.findSimilarColor(red,green,blue);
                return hssfColor.getIndex();
            }catch (Exception ex){
                log.error(ex.toString());
                return null;
            }
        }
        return null;
    }

    /**
     * RGB转换成十六进制
     *
     * @param r
     * @param g
     * @param b
     * @return
     */
    public static String convertRGBToHex(short r, short g, short b) {
        String hex = "";
        if (r >= 0 && r < 256 && g >= 0 && g < 256 && b >= 0 && b < 256) {
            int x, y, z;
            x = r % 16;
            r = (short) ((r - x) / 16);
            y = g % 16;
            g = (short) ((g - y) / 16);
            z = b % 16;
            b = (short) ((b - z) / 16);
            hex = "#" + S.charAt(r) + S.charAt(x) + S.charAt(g) + S.charAt(y) + S.charAt(b) + S.charAt(z);
        }
        return hex;
    }

    /**
     * @param cell 单元格
     * @return 转换RGB颜色值
     * @description tint转换RBG
     * @author zhouhang
     * @date 2021/4/26
     */
    public static String getFillColorHex(Cell cell) {
        String fillColorString = null;
        if (cell != null) {
            CellStyle cellStyle = cell.getCellStyle();
            Color color = cellStyle.getFillForegroundColorColor();
            if (color instanceof XSSFColor) {
                XSSFColor xssfColor = (XSSFColor) color;
                byte[] argb = xssfColor.getARGB();
                fillColorString = convertRGBToHex((short) (argb[1] & 0xFF), (short) (argb[2] & 0xFF), (short) (argb[3] & 0xFF));
                // TODO: 2021/4/26 添加透明度
//                if (xssfColor.hasTint()) {
//                    fillColorString += " * " + xssfColor.getTint();
//                    byte[] rgb = xssfColor.getRGBWithTint();
//                    fillColorString += " = [" + (argb[0] & 0xFF) + ", " + (rgb[0] & 0xFF) + ", " + (rgb[1] & 0xFF) + ", " + (rgb[2] & 0xFF) + "]";
//                }
            } else if (color instanceof HSSFColor) {
                HSSFColor hssfColor = (HSSFColor) color;
                short[] rgb = hssfColor.getTriplet();
                fillColorString = convertRGBToHex((short) (rgb[0] & 0xFF), (short) (rgb[1] & 0xFF), (short) (rgb[2] & 0xFF));
                //去除黑色背景
                if (StringUtils.equals("#000000", fillColorString)) {
                    return null;
                }
            }
        }
        return fillColorString;
    }

}
package com.util.excel;


import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 *
 * @author cr
 */
public class ConstantUtil {
    /**
     * 导出。字体转换
     */
    public static Map<Integer,String> ff_IntegerToName=new HashMap<Integer,String>();
    /**
     * 导入。字体转换
     */
    public static Map<String,Integer> ff_NameToInteger=new HashMap<String,Integer>();

    /**
     * 导入 36种数字格式。注意官方文档的编号不是连续的,22后面直接是37,所以数组中间补14个空值
     */
    public static String[] number_type=null;
    /**
     * 导入 36种格式的定义字符串
     */
    public static String[] number_format=null;
    /**
     * 数据类型
     */
    public static Map<String,Integer> number_format_map=new HashMap<String,Integer>();

    static{
        //格式
        nf();
        //字体
        ff();
    }

    private static void nf(){
        number_type = new String[] {
                "General","Decimal","Decimal","Decimal","Decimal","Currency","Currency","Currency","Currency",
                "Percentage","Percentage","Scientific","Fraction","Fraction","Date","Date","Date","Date",
                "Time","Time","Time","Time","Time",
                "","","","","","","","","","","","","","",
                "Accounting","Accounting","Accounting","Accounting","Accounting",
                "Currency","Accounting","Currency","Time","Time","Time","Scientific","Text"
        };

        number_format = new String[] {
                "General","0","0.00","#,##0","#,##0.00","$#,##0;($#,##0)","$#,##0;[Red]($#,##0)","$#,##0.00;($#,##0.00)","$#,##0.00;[Red]($#,##0.00)",
                "0%","0.00%","0.00E+00","# ?/?","# ??/??","m/d/yyyy","d-mmm-yy","d-mmm","mmm-yy",
                "h:mm AM/PM","h:mm:ss AM/PM","h:mm","h:mm:ss","m/d/yyyy h:mm",
                "","","","","","","","","","","","","","",
                "#,##0;(#,##0)","#,##0;[Red](#,##0)","#,##0.00;(#,##0.00)","#,##0.00;[Red](#,##0.00)","_ * #,##0_ ;_ * (#,##0)_ ;_ * \"-\"_ ;_ @_",
                "_ $* #,##0_ ;_ $* (#,##0)_ ;_ $* \"-\"_ ;_ @_","_ * #,##0.00_ ;_ * (#,##0.00)_ ;_ * \"-\"??_ ;_ @_","_ $* #,##0.00_ ;_ $* (#,##0.00)_ ;_ $* \"-\"??_ ;_ @_","mm:ss","[h]:mm:ss","mm:ss.0","##0.0E+00","@"
        };
        for(int x=0;x<number_format.length;x++){
            if(number_format[x].length()>0){
                number_format_map.put(number_format[x].toLowerCase(),x);
            }
        }
    }

    private static void ff(){
        //0 微软雅黑、1 宋体(Song)、2 黑体(ST Heiti)、3 楷体(ST Kaiti)、 4仿宋(ST FangSong)、 5 新宋体(ST Song)、
        // 6 华文新魏、 7华文行楷、 8 华文隶书、 9 Arial、 10 Times New Roman 、11 Tahoma 、12 Verdana
        ff_IntegerToName.put(0,"微软雅黑");
        ff_IntegerToName.put(1,"宋体");
        ff_IntegerToName.put(2,"黑体");
        ff_IntegerToName.put(3,"楷体");
        ff_IntegerToName.put(4,"仿宋");
        ff_IntegerToName.put(5,"新宋体");
        ff_IntegerToName.put(6,"华文新魏");
        ff_IntegerToName.put(7,"华文行楷");
        ff_IntegerToName.put(8,"华文隶书");
        ff_IntegerToName.put(9,"Arial");
        ff_IntegerToName.put(10,"Times New Roman");
        ff_IntegerToName.put(11,"Tahoma");
        ff_IntegerToName.put(12,"Verdana");

        //0 微软雅黑、1 宋体(Song)、2 黑体(ST Heiti)、3 楷体(ST Kaiti)、 4仿宋(ST FangSong)、 5 新宋体(ST Song)、
        // 6 华文新魏、 7华文行楷、 8 华文隶书、 9 Arial、 10 Times New Roman 、11 Tahoma 、12 Verdana
        ff_NameToInteger.put("微软雅黑",0);
        ff_NameToInteger.put("宋体",1);ff_NameToInteger.put("Song",1);
        ff_NameToInteger.put("黑体",2); ff_NameToInteger.put("ST Heiti",2);
        ff_NameToInteger.put("楷体",3); ff_NameToInteger.put("ST Kaiti",3);
        ff_NameToInteger.put("仿宋",4); ff_NameToInteger.put("ST FangSong",4);
        ff_NameToInteger.put("新宋体",5); ff_NameToInteger.put("ST Song",5);
        ff_NameToInteger.put("华文新魏",6);
        ff_NameToInteger.put("华文行楷",7);
        ff_NameToInteger.put("华文隶书",8);
        ff_NameToInteger.put("Arial",9);
        ff_NameToInteger.put("Times New Roman",10);
        ff_NameToInteger.put("Tahoma",11);
        ff_NameToInteger.put("Verdana",12);
    }



    /**
     * 按自定义格式
     * @param fa
     * @return
     */
    public static Integer getNumberFormatMap(String fa){
        if(number_format_map.containsKey(fa.toLowerCase())){
            return number_format_map.get(fa.toLowerCase());
        }
        return -1;
    }

    /**
     * 获取poi表格垂直对齐  0 中间、1 上、2下
     * @param i
     * @return
     */
    public static VerticalAlignment getVerticalType(int i){
        if(0==i){
            return VerticalAlignment.CENTER;
        }else if(1==i){
            return VerticalAlignment.TOP;
        }else if(2==i){
            return VerticalAlignment.BOTTOM;
        }
        //默认居中
        return VerticalAlignment.CENTER;
    }

    /**
     * 获取poi表格水平对齐 0 居中、1 左、2右
     * @param i
     * @return
     */
    public static HorizontalAlignment getHorizontaltype(int i){
        if(2==i){
            return HorizontalAlignment.RIGHT;
        }else if(1==i){
            return HorizontalAlignment.LEFT;
        }else if(0==i){
            return HorizontalAlignment.CENTER;
        }
        //默认右
        return HorizontalAlignment.RIGHT;
    }

    /**
     * 文字旋转
     * 文字旋转角度(0=0,1=45,2=-45,3=竖排文字,4=90,5=-90)
     * @param i
     * @return
     */
    public static short getRotation(int i){
        short t=0;
        switch (i){
            case 1:
                t=45;break;
            case 2:
                t=-45;break;
            case 3:
                t=255;break;
            case 4:
                t=90;break;
            case 5:
                t=-90;break;

                default:
                    t=0;
        }
        return t;
    }




    private static SimpleDateFormat df_DateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public static Date stringToDateTime(String date){
        if(date==null || date.length()==0){
            return null;
        }
        try {
            return df_DateTime.parse(date);
        } catch (ParseException e) {
            return null;
        }
    }
    private static SimpleDateFormat df_Date = new SimpleDateFormat("yyyy-MM-dd");
    public static Date stringToDate(String date){
        if(date==null || date.length()==0){
            return null;
        }
        try {
            return df_Date.parse(date);
        } catch (ParseException e) {
            return null;
        }
    }
    public static Date toDate(String numberString) {
        try{
            Double _d=Double.parseDouble(numberString);
            String _s=toDate(_d,"yyyy-MM-dd HH:mm:ss");
            if(numberString.indexOf(".")>-1){
                return stringToDate(_s);
            }else{
                return stringToDateTime(_s);
            }

        }catch (Exception ex){
            System.out.println(ex.toString()+" "+numberString);
        }
        return null;
    }
    private static final int SECONDS_PER_MINUTE = 60;
    private static final int MINUTES_PER_HOUR = 60;
    private static final int HOURS_PER_DAY = 24;
    private static final int SECONDS_PER_DAY = (HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE);
    /**
     一天的毫秒数
     **/
    private static final long DAY_MILLISECONDS = SECONDS_PER_DAY * 1000L;
    /**
     转换方法
     @parma numberString 要转换的浮点数
     @parma format 要获得的格式 例如"hh:mm:ss"
     **/
    public static String toDate(double numberString, String format) {
        SimpleDateFormat sdFormat = new SimpleDateFormat(format);
        int wholeDays = (int)Math.floor(numberString);
        int millisecondsInday = (int)((numberString - wholeDays) * DAY_MILLISECONDS + 0.5);
        Calendar calendar = new GregorianCalendar();
        setCalendar(calendar, wholeDays, millisecondsInday, false);
        return sdFormat.format(calendar.getTime());
    }
    private static void setCalendar(Calendar calendar, int wholeDays,
                                    int millisecondsInDay, boolean use1904windowing) {
        int startYear = 1900;
        int dayAdjust = -1; // Excel thinks 2/29/1900 is a valid date, which it isn't
        if (use1904windowing) {
            startYear = 1904;
            dayAdjust = 1; // 1904 date windowing uses 1/2/1904 as the first day
        }
        else if (wholeDays < 61) {
            // Date is prior to 3/1/1900, so adjust because Excel thinks 2/29/1900 exists
            // If Excel date == 2/29/1900, will become 3/1/1900 in Java representation
            dayAdjust = 0;
        }
        calendar.set(startYear,0, wholeDays + dayAdjust, 0, 0, 0);
        calendar.set(GregorianCalendar.MILLISECOND, millisecondsInDay);
    }
}
package com.util.excel;

/**
 * @author zhouhang
 * @description 禁用状态
 * @date 2021/2/1
 */
public enum DisabledTypeEnum {

    /**
     * 启用
     */
    ENABLE(0, "启用"),
    /**
     * 禁用
     */
    DISABLE(1, "禁用"),
    ;

    DisabledTypeEnum(Integer index, String name) {
        this.index = index;
        this.name = name;
    }

    /**
     * index
     */
    private final Integer index;

    /**
     * 名称
     */
    private final String name;

    public Integer getIndex() {
        return index;
    }

    public String getName() {
        return name;
    }
}
package com.util.excel;

/**
 * @author zhouhang
 * @description EXCEL居中方式
 * @date 2021/4/26
 */
public enum ExcelCenterStyleEnum {
    /**
     * 左对齐
     */
    LEFT((short) 1, 1, "左对齐"),
    /**
     * 右对齐
     */
    RIGHT((short) 3, 2, "右对齐"),
    /**
     * 居中
     */
    CENTER((short) 2, 0, "居中"),
    ;

    /**
     * excel居中code
     */
    private final short excelCode;

    /**
     * 在线文档居中code
     */
    private final Integer onlineExcelCode;

    /**
     * 名称
     */
    private final String name;


    public Integer getOnlineExcelCode() {
        return onlineExcelCode;
    }

    public String getName() {
        return name;
    }

    public short getExcelCode() {
        return excelCode;
    }

    ExcelCenterStyleEnum(short excelCode, Integer onlineExcelCode, String name) {
        this.excelCode = excelCode;
        this.onlineExcelCode = onlineExcelCode;
        this.name = name;
    }

    /**
     * @param code excel居中样式code
     * @return Enum_ExcelCenterStyle
     * @description 根据excel居中样式获取在线文档居中样式
     * @author zhouhang
     * @date 2021/4/26
     */
    public static ExcelCenterStyleEnum getExcelCenterStyleByExcelCenterCode(short code) {
        for (ExcelCenterStyleEnum value : ExcelCenterStyleEnum.values()) {
            if (code == value.getExcelCode()) {
                return value;
            }
        }
        return CENTER;
    }

}
package com.util.excel;

import com.alibaba.fastjson.JSONObject;
import com.taiji.common.result.TaijiResultException;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;

/**
 * @author: hbf
 * @Date: 2021/12/16 15:53
 */
public class excelUtils {

/*    public static void main(String[] args) {
        File file = new File("D://132624109350848131.xlsx");
        JSONObject jsonObject = parseExcel(file);
        System.out.println(jsonObject);
    }*/

    public static JSONObject parseExcel(File file) {
        List<GridRecordDataModel> modelList;
        JSONObject result = new JSONObject();
        String fileName = file.getName();
        try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file))) {
            String suffix = fileName.substring(fileName.lastIndexOf("."));
            if (Objects.requireNonNull(suffix).endsWith(".xls") || suffix.endsWith(".xlsx")) {
                Workbook workbook = WorkbookFactory.create(bufferedInputStream);
                //读取EXCEL
                modelList = XlsUtil.readExcel(workbook);
                // 获取文件名称
                String docCode = TimeUtil.getTodayBeginTime() + "#-" + (int) (Math.random() * 100) + "#-" + UUID.randomUUID().toString().replace("-", "");
                //插入文档数据
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("name",fileName);
                result.put("info",jsonObject);
                result.put("sheets",modelList);
                initParseExcel(modelList, docCode);
            } else {
                throw new TaijiResultException("文件无效");
            }
        } catch (IOException | InvalidFormatException e) {
            e.printStackTrace();
            throw new TaijiResultException("Excel 文件解析失败,请检查文件!");
        }
        return result;
    }

    private static void initParseExcel(List<GridRecordDataModel> modelList, String docCode) {
        int index = 1;
        List<GridRecordDataModel> addList = new ArrayList<>();
        for (GridRecordDataModel model : modelList) {
            model.setList_id(docCode);
            if (CollectionUtils.isNotEmpty(model.getCelldata())) {
                Map<String, List<JSONObject>> map = new HashMap<>(model.getCelldata().size() / 5);
                for (JSONObject data : model.getCelldata()) {
                    String blockId = JfGridConfigModel.getRange(data.getIntValue("r"), data.getIntValue("c"), model.getRow_col());
                    List<JSONObject> list = map.get(blockId);
                    if (Objects.isNull(list)) {
                        list = new ArrayList<>();
                        list.add(data);
                        map.put(blockId, list);
                    } else {
                        list.add(data);
                    }
                }
                //生成GridRecordDataModel对象
                for (Map.Entry<String, List<JSONObject>> entry : map.entrySet()) {
                    GridRecordDataModel newDataModel = new GridRecordDataModel();
                    newDataModel.setList_id(docCode);
                    newDataModel.setBlock_id(entry.getKey());
                    newDataModel.setIndex(index + "");
                    newDataModel.setStatus(0);
                    newDataModel.setIs_delete(DisabledTypeEnum.ENABLE.getIndex());
                    JSONObject jsonObject = new JSONObject();
                    jsonObject.put("celldata", entry.getValue());
                    newDataModel.setJson_data(jsonObject);
                    addList.add(newDataModel);
                }
            }
            index++;
        }
        //插入数据
        addList.addAll(modelList);
    }
}
package com.util.excel;


import com.alibaba.fastjson.JSONObject;
import lombok.Data;

import java.util.List;

/**
 * 存储对象类
 * @author Administrator
 */
@Data
public class GridRecordDataModel {
    /**
     * 记录序列
     */
    Long id;
    /**
     * 文档ID
     */
    String list_id;
    /**
     * sheet名称
     */
    String name;
    /**
     * 本记录的行_列
     */
    String row_col;
    /**
     * sheet序号
     */
    String index;
    /**
     * 状态是否当前sheet页
     */
    Integer status;
    /**
     * 块编号 第一块 fblock
     */
    String block_id;
    /**
     * json串
     */
    JSONObject json_data;
    /**
     * 排序位置
     */
    Integer order;
    /**
     * 是否删除
     */
    Integer is_delete;

    /**
     * sheet页数据 未编号分组
     */
    List<JSONObject> celldata;

    Integer rh_height;

    Integer ch_width;

    Integer defaultColWidth;

    Integer defaultRowHeight;

    JSONObject config;
}
package com.piweb.util.excel;

import java.util.Calendar;
import java.util.Date;

/**
 * @author zhouhang
 * @description TimeUtil
 * @date 2021/5/10
 */
public class TimeUtil {

    public static int getTodayBeginTime() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        return (int) (calendar.getTime().getTime() / 1000);
    }

}
package com.util.excel;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

import java.util.*;

/**
 * sheet操作
 *
 * @author Administrator
 */
@Slf4j
public class XlsSheetUtil {
    /**
     * 导出sheet
     *
     * @param wb
     * @param sheetNum
     * @param dbObject
     */
    public static void exportSheet(Workbook wb, int sheetNum, JSONObject dbObject) {
        Sheet sheet = wb.createSheet();

        //设置sheet位置,名称
        if (dbObject.containsKey("name") && dbObject.get("name") != null) {
            wb.setSheetName(sheetNum, dbObject.get("name").toString());
        } else {
            wb.setSheetName(sheetNum, "sheet" + sheetNum);
        }
        //是否隐藏
        if (dbObject.containsKey("hide") && dbObject.get("hide").toString().equals("1")) {
            wb.setSheetHidden(sheetNum, true);
        }
        //是否当前选中页
        if (dbObject.containsKey("status") && dbObject.get("status").toString().equals("1")) {
            sheet.setSelected(true);
        }


        //循环数据
        if (dbObject.containsKey("celldata") && dbObject.get("celldata") != null) {
            //取到所有单元格集合
            List<JSONObject> cells_json = (List<JSONObject>) dbObject.get("celldata");
            Map<Integer, List<JSONObject>> cellMap = cellGroup(cells_json);
            //循环每一行
            for (Integer r : cellMap.keySet()) {
                Row row = sheet.createRow(r);
                //循环每一列
                for (JSONObject col : cellMap.get(r)) {
                    createCell(wb, sheet, row, col);
                }
            }
        }

        setColumAndRow(dbObject, sheet);

    }

    /**
     * 每一个单元格
     *
     * @param row
     * @param dbObject
     */
    private static void createCell(Workbook wb, Sheet sheet, Row row, JSONObject dbObject) {
        if (dbObject.containsKey("c")) {
            Integer c = getStrToInt(dbObject.get("c"));
            if (c != null) {
                Cell cell = row.createCell(c);
                //取单元格中的v_json
                if (dbObject.containsKey("v")) {
                    //获取v对象
                    Object obj = dbObject.get("v");
                    if (obj == null) {
                        //没有内容
                        return;
                    }
                    //如果v对象直接是字符串
                    if (obj instanceof String) {
                        if (((String) obj).length() > 0) {
                            cell.setCellValue(obj.toString());
                        }
                        return;
                    }

                    //转换v为对象(v是一个对象)
                    JSONObject v_json = (JSONObject) obj;
                    //样式
                    CellStyle style = wb.createCellStyle();
                    cell.setCellStyle(style);

                    //bs 边框样式 //bc 边框颜色
                    setBorderStyle(style, v_json, "bs", "bc");
                    //bs_t 上边框样式   bc_t  上边框颜色
                    setBorderStyle(style, v_json, "bs_t", "bc_t");
                    //bs_b 下边框样式   bc_b  下边框颜色
                    setBorderStyle(style, v_json, "bs_b", "bc_b");
                    //bs_l 左边框样式   bc_l  左边框颜色
                    setBorderStyle(style, v_json, "bs_l", "bc_l");
                    //bs_r 右边框样式   bc_r  右边框颜色
                    setBorderStyle(style, v_json, "bs_r", "bc_r");


                    //合并单元格
                    //参数1:起始行 参数2:终止行 参数3:起始列 参数4:终止列
                    //CellRangeAddress region1 = new CellRangeAddress(rowNumber, rowNumber, (short) 0, (short) 11);

                    //mc 合并单元格
                    if (v_json.containsKey("mc")) {
                        //是合并的单元格
                        JSONObject mc = v_json.getJSONObject("mc");
                        if (mc.containsKey("rs") && mc.containsKey("cs")) {
                            //合并的第一个单元格
                            if (mc.containsKey("r") && mc.containsKey("c")) {
                                Integer _rs = getIntByDBObject(mc, "rs") - 1;
                                Integer _cs = getIntByDBObject(mc, "cs") - 1;
                                Integer _r = getIntByDBObject(mc, "r");
                                Integer _c = getIntByDBObject(mc, "c");

                                CellRangeAddress region = new CellRangeAddress(_r.shortValue(), (_r.shortValue() + _rs.shortValue()), _c.shortValue(), (_c.shortValue() + _cs.shortValue()));
                                sheet.addMergedRegion(region);
                            }
                        } else {
                            //不是合并的第一个单元格
                            return;
                        }
                    }


                    //取v值 (在数据类型中处理)
                    //ct 单元格值格式 (fa,t)
                    setFormatByCt(wb, cell, style, v_json);

                    //font设置
                    setCellStyleFont(wb, style, v_json);

                    //bg 背景颜色
                    if (v_json.containsKey("bg")) {
                        String _v = getByDBObject(v_json, "bg");
                        Short _color = ColorUtil.getColorByStr(_v);
                        if (_color != null) {
                            style.setFillBackgroundColor(_color);
                        }
                    }

                    //vt 垂直对齐    垂直对齐方式(0=居中,1=上,2=下)
                    if (v_json.containsKey("vt")) {
                        Integer _v = getIntByDBObject(v_json, "vt");
                        if (_v != null && _v >= 0 && _v <= 2) {
                            style.setVerticalAlignment(ConstantUtil.getVerticalType(_v));
                        }
                    }

                    //ht 水平对齐   水平对齐方式(0=居中,1=左对齐,2=右对齐)
                    if (v_json.containsKey("ht")) {
                        Integer _v = getIntByDBObject(v_json, "ht");
                        if (_v != null && _v >= 0 && _v <= 2) {
                            style.setAlignment(ConstantUtil.getHorizontaltype(_v));
                        }
                    }

                    //tr 文字旋转 文字旋转角度(0=0,1=45,2=-45,3=竖排文字,4=90,5=-90)
                    if (v_json.containsKey("tr")) {
                        Integer _v = getIntByDBObject(v_json, "tr");
                        if (_v != null) {
                            style.setRotation(ConstantUtil.getRotation(_v));
                        }
                    }

                    //tb  文本换行    0 截断、1溢出、2 自动换行
                    //   2:setTextWrapped     0和1:IsTextWrapped = true
                    if (v_json.containsKey("tb")) {
                        Integer _v = getIntByDBObject(v_json, "tb");
                        if (_v != null) {
                            if (_v >= 0 && _v <= 1) {
                                style.setWrapText(false);
                            } else {
                                style.setWrapText(true);
                            }
                        }
                    }

                    //f  公式
                    if (v_json.containsKey("f")) {
                        String _v = getByDBObject(v_json, "f");
                        if (_v.length() > 0) {
                            try {
                                if (_v.startsWith("=")) {
                                    cell.setCellFormula(_v.substring(1));
                                } else {
                                    cell.setCellFormula(_v);
                                }
                            } catch (Exception ex) {
                                log.error("公式 {};Error:{}", _v, ex.toString());
                            }
                        }
                    }


                }

            }
        }
    }

    /**
     * 设置单元格,宽、高
     *
     * @param dbObject
     * @param sheet
     */
    private static void setColumAndRow(JSONObject dbObject, Sheet sheet) {
        if (dbObject.containsKey("config")) {
            JSONObject config = dbObject.getJSONObject("config");

            if (config.containsKey("columlen")) {
                JSONObject columlen = config.getJSONObject("columlen");
                if (columlen != null) {
                    for (String k : columlen.keySet()) {
                        Integer _i = getStrToInt(k);
                        Integer _v = getStrToInt(columlen.get(k).toString());
                        if (_i != null && _v != null) {
                            //sheet.setColumnWidth(_i,MSExcelUtil.heightUnits2Pixel(_v.shortValue()))
                            sheet.setColumnWidth(_i, _v.shortValue());
                        }
                    }
                }
            }
            if (config.containsKey("rowlen")) {
                JSONObject rowlen = config.getJSONObject("rowlen");
                if (rowlen != null) {
                    for (String k : rowlen.keySet()) {
                        Integer _i = getStrToInt(k);
                        Integer _v = getStrToInt(rowlen.get(k).toString());
                        if (_i != null && _v != null) {
                            Row row = sheet.getRow(_i);
                            if (row != null) {
                                //row.setHeightInPoints(MSExcelUtil.pixel2WidthUnits(_v.shortValue()))
                                row.setHeightInPoints(_v.shortValue());
                            }
                        }
                    }
                }
            }
        }
    }

    /**
     * 单元格字体相关样式
     *
     * @param wb
     * @param style
     * @param dbObject
     */
    private static void setCellStyleFont(Workbook wb, CellStyle style, JSONObject dbObject) {
        Font font = wb.createFont();
        style.setFont(font);

        //ff 字体
        if (dbObject.containsKey("ff")) {
            if (dbObject.get("ff") instanceof Integer) {
                Integer _v = getIntByDBObject(dbObject, "ff");
                if (_v != null && ConstantUtil.ff_IntegerToName.containsKey(_v)) {
                    font.setFontName(ConstantUtil.ff_IntegerToName.get(_v));
                }
            } else if (dbObject.get("ff") instanceof String) {
                font.setFontName(getByDBObject(dbObject, "ff"));
            }
        }
        //fc 字体颜色
        if (dbObject.containsKey("fc")) {
            String _v = getByDBObject(dbObject, "fc");
            Short _color = ColorUtil.getColorByStr(_v);
            if (_color != null) {
                font.setColor(_color);
            }
        }
        //bl 粗体
        if (dbObject.containsKey("bl")) {
            Integer _v = getIntByDBObject(dbObject, "bl");
            if (_v != null) {
                if (_v.equals(1)) {
                    //是否粗体显示
                    font.setBold(true);
                } else {
                    font.setBold(false);
                }
            }
        }
        //it 斜体
        if (dbObject.containsKey("it")) {
            Integer _v = getIntByDBObject(dbObject, "it");
            if (_v != null) {
                if (_v.equals(1)) {
                    font.setItalic(true);
                } else {
                    font.setItalic(false);
                }
            }
        }
        //fs 字体大小
        if (dbObject.containsKey("fs")) {
            Integer _v = getStrToInt(getObjectByDBObject(dbObject, "fs"));
            if (_v != null) {
                font.setFontHeightInPoints(_v.shortValue());
            }
        }
        //cl 删除线 (导入没有)   0 常规 、 1 删除线
        if (dbObject.containsKey("cl")) {
            Integer _v = getIntByDBObject(dbObject, "cl");
            if (_v != null) {
                if (_v.equals(1)) {
                    font.setStrikeout(true);
                }
            }
        }
        //ul 下划线
        if (dbObject.containsKey("ul")) {
            Integer _v = getIntByDBObject(dbObject, "ul");
            if (_v != null) {
                if (_v.equals(1)) {
                    font.setUnderline(Font.U_SINGLE);
                } else {
                    font.setUnderline(Font.U_NONE);
                }
            }
        }

    }

    /**
     * 设置cell边框颜色样式
     *
     * @param style    样式
     * @param dbObject json对象
     * @param bs       样式
     * @param bc       样式
     */
    private static void setBorderStyle(CellStyle style, JSONObject dbObject, String bs, String bc) {
        //bs 边框样式
        if (dbObject.containsKey(bs)) {
            Integer _v = getStrToInt(getByDBObject(dbObject, bs));
            if (_v != null) {
                //边框没有,不作改变
                if (bs.equals("bs") || bs.equals("bs_t")) {
                    style.setBorderTop(BorderStyle.valueOf(_v.shortValue()));
                }
                if (bs.equals("bs") || bs.equals("bs_b")) {
                    style.setBorderBottom(BorderStyle.valueOf(_v.shortValue()));
                }
                if (bs.equals("bs") || bs.equals("bs_l")) {
                    style.setBorderLeft(BorderStyle.valueOf(_v.shortValue()));
                }
                if (bs.equals("bs") || bs.equals("bs_r")) {
                    style.setBorderRight(BorderStyle.valueOf(_v.shortValue()));
                }

                //bc 边框颜色
                String _vcolor = getByDBObject(dbObject, bc);
                if (_vcolor != null) {
                    Short _color = ColorUtil.getColorByStr(_vcolor);
                    if (_color != null) {
                        if (bc.equals("bc") || bc.equals("bc_t")) {
                            style.setTopBorderColor(_color);
                        }
                        if (bc.equals("bc") || bc.equals("bc_b")) {
                            style.setBottomBorderColor(_color);
                        }
                        if (bc.equals("bc") || bc.equals("bc_l")) {
                            style.setLeftBorderColor(_color);
                        }
                        if (bc.equals("bc") || bc.equals("bc_r")) {
                            style.setRightBorderColor(_color);
                        }
                    }
                }
            }
        }
    }


    /**
     * 设置单元格格式  ct 单元格值格式 (fa,t)
     *
     * @param cell
     * @param style
     * @param dbObject
     */
    private static void setFormatByCt(Workbook wb, Cell cell, CellStyle style, JSONObject dbObject) {

        if (!dbObject.containsKey("v") && dbObject.containsKey("ct")) {
            /* 处理以下数据结构
             {
                "celldata": [{
                    "c": 0,
                    "r": 8,
                    "v": {
                        "ct": {
                            "s": [{
                                "v": "sdsdgdf\r\ndfgdfg\r\ndsfgdfgdf\r\ndsfgdfg"
                            }],
                            "t": "inlineStr",
                            "fa": "General"
                        }
                    }
                }]
            }
             */
            JSONObject ct = dbObject.getJSONObject("ct");
            if (ct.containsKey("s")) {
                Object s = ct.get("s");
                if (s instanceof List && ((List) s).size() > 0) {
                    JSONObject _s1 = (JSONObject) ((List) s).get(0);
                    if (_s1.containsKey("v") && _s1.get("v") instanceof String) {
                        dbObject.put("v", _s1.get("v"));
                        style.setWrapText(true);
                    }
                }

            }
        }

        //String v = "";  //初始化
        if (dbObject.containsKey("v")) {
            //v = v_json.get("v").toString();
            //取到v后,存到poi单元格对象
            //设置该单元格值
            //cell.setValue(v);

            //String v=getByDBObject(v_json,"v");
            //cell.setValue(v);
            Object obj = getObjectByDBObject(dbObject, "v");
            if (obj instanceof Number) {
                cell.setCellValue(Double.valueOf(obj.toString()));
            } else if (obj instanceof Double) {
                cell.setCellValue((Double) obj);
            } else if (obj instanceof Date) {
                cell.setCellValue((Date) obj);
            } else if (obj instanceof Calendar) {
                cell.setCellValue((Calendar) obj);
            } else if (obj instanceof RichTextString) {
                cell.setCellValue((RichTextString) obj);
            } else if (obj instanceof String) {
                cell.setCellValue((String) obj);
            } else {
                cell.setCellValue(obj.toString());
            }

        }

        if (dbObject.containsKey("ct")) {
            JSONObject ct = dbObject.getJSONObject("ct");
            if (ct.containsKey("fa") && ct.containsKey("t")) {
                //t 0=bool,1=datetime,2=error,3=null,4=numeric,5=string,6=unknown
                String fa = getByDBObject(ct, "fa"); //单元格格式format定义串
                String t = getByDBObject(ct, "t"); //单元格格式type类型

                Integer _i = ConstantUtil.getNumberFormatMap(fa);
                switch (t) {
                    case "s": {
                        //字符串
                        if (_i >= 0) {
                            style.setDataFormat(_i.shortValue());
                        } else {
                            style.setDataFormat((short) 0);
                        }
                        cell.setCellType(CellType.STRING);
                        break;
                    }
                    case "d": {
                        //日期
                        Date _d = null;
                        String v = getByDBObject(dbObject, "m");
                        if (v.length() == 0) {
                            v = getByDBObject(dbObject, "v");
                        }
                        if (v.length() > 0) {
                            if (v.indexOf("-") > -1) {
                                if (v.indexOf(":") > -1) {
                                    _d = ConstantUtil.stringToDateTime(v);
                                } else {
                                    _d = ConstantUtil.stringToDate(v);
                                }
                            } else {
                                _d = ConstantUtil.toDate(v);
                            }
                        }
                        if (_d != null) {
                            //能转换为日期
                            cell.setCellValue(_d);
                            DataFormat format = wb.createDataFormat();
                            style.setDataFormat(format.getFormat(fa));

                        } else {
                            //不能转换为日期
                            if (_i >= 0) {
                                style.setDataFormat(_i.shortValue());
                            } else {
                                style.setDataFormat((short) 0);
                            }
                        }
                        break;
                    }
                    case "b": {
                        //逻辑
                        cell.setCellType(CellType.BOOLEAN);
                        if (_i >= 0) {
                            style.setDataFormat(_i.shortValue());
                        } else {
                            DataFormat format = wb.createDataFormat();
                            style.setDataFormat(format.getFormat(fa));
                        }
                        break;
                    }
                    case "n": {
                        //数值
                        cell.setCellType(CellType.NUMERIC);
                        if (_i >= 0) {
                            style.setDataFormat(_i.shortValue());
                        } else {
                            DataFormat format = wb.createDataFormat();
                            style.setDataFormat(format.getFormat(fa));
                        }
                        break;
                    }
                    case "u":
                    case "g": {
                        //general 自动类型
                        //cell.setCellType(CellType._NONE);
                        if (_i >= 0) {
                            style.setDataFormat(_i.shortValue());
                        } else {
                            DataFormat format = wb.createDataFormat();
                            style.setDataFormat(format.getFormat(fa));
                        }
                        break;
                    }
                    case "e": {
                        //错误
                        cell.setCellType(CellType.ERROR);
                        if (_i >= 0) {
                            style.setDataFormat(_i.shortValue());
                        } else {
                            DataFormat format = wb.createDataFormat();
                            style.setDataFormat(format.getFormat(fa));
                        }
                        break;
                    }

                }

            }

        }
    }

    /**
     * 内容按行分组
     *
     * @param cells
     * @return
     */
    private static Map<Integer, List<JSONObject>> cellGroup(List<JSONObject> cells) {
        Map<Integer, List<JSONObject>> cellMap = new HashMap<>(100);
        for (JSONObject dbObject : cells) {
            //行号
            if (dbObject.containsKey("r")) {
                Integer r = getStrToInt(dbObject.get("r"));
                if (r != null) {
                    if (cellMap.containsKey(r)) {
                        cellMap.get(r).add(dbObject);
                    } else {
                        List<JSONObject> list = new ArrayList<>(10);
                        list.add(dbObject);
                        cellMap.put(r, list);
                    }
                }
            }

        }
        return cellMap;
    }


    /**
     * 获取一个k的值
     *
     * @param b
     * @param k
     * @return
     */
    public static String getByDBObject(JSONObject b, String k) {
        if (b.containsKey(k)) {
            if (b.get(k) != null && b.get(k) instanceof String) {
                return b.getString(k);
            }
        }
        return null;
    }

    /**
     * 获取一个k的值
     *
     * @param b
     * @param k
     * @return
     */
    public static Object getObjectByDBObject(JSONObject b, String k) {
        if (b.containsKey(k)) {
            if (b.get(k) != null) {
                return b.get(k);
            }
        }
        return "";
    }

    /**
     * 没有/无法转换 返回null
     *
     * @param b
     * @param k
     * @return
     */
    public static Integer getIntByDBObject(JSONObject b, String k) {
        if (b.containsKey(k)) {
            if (b.get(k) != null) {
                try {
                    String _s = b.getString(k).replace("px", "");
                    Double _d = Double.parseDouble(_s);
                    return _d.intValue();
                } catch (Exception ex) {
                    log.error(ex.getMessage());
                    return null;
                }
            }
        }
        return null;
    }

    /**
     * 转int
     *
     * @param str
     * @return
     */
    private static Integer getStrToInt(Object str) {
        try {
            if (str != null) {
                return Integer.parseInt(str.toString());
            }
            return null;
        } catch (Exception ex) {
            log.error("String:{};Error:{}", str, ex.getMessage());
            return null;
        }
    }

    private static Short getStrToShort(Object str) {
        try {
            if (str != null) {
                return Short.parseShort(str.toString());
            }
            return null;
        } catch (Exception ex) {
            log.error("String:{};Error:{}", str, ex.getMessage());
            return null;
        }
    }
}
package com.util.excel;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.jetbrains.annotations.NotNull;

import java.io.IOException;
import java.io.OutputStream;
import java.util.*;

/**
 * 使用poi导出xls
 *
 * @author Administrator
 */
public class XlsUtil {

    private final static String MODEL = "{\"c\":0,\"r\":0,\"v\":{\"m\":\"模板\",\"v\":\"模板\",\"bl\":1,\"ct\":{\"t\":\"g\",\"fa\":\"General\"}}}";
    private final static String BORDER_MODEL = "{\"rangeType\":\"cell\",\"value\":{\"b\":{\"color\":\"rgb(0, 0, 0)\",\"style\":1},\"r\":{\"color\":\"rgb(0, 0, 0)\",\"style\":1},\"col_index\":5,\"t\":{\"color\":\"rgb(0, 0, 0)\",\"style\":1},\"row_index\":7,\"l\":{\"color\":\"rgb(0, 0, 0)\",\"style\":1}}}";
    /**
     * 默认行数
     */
    private static final int DEFAULT_ROW_INDEX = 84;
    /**
     * 默认列数
     */
    private static final int DEFAULT_COLUMN_INDEX = 64;

    /**
     * 输出文件流
     *
     * @param outputStream 流
     * @param isXlsx       是否是xlsx
     * @param dbObjectList 数据
     */
    public static void exportXlsFile(OutputStream outputStream, Boolean isXlsx, List<JSONObject> dbObjectList) throws IOException {
        Workbook wb = null;
        if (isXlsx) {
            wb = new XSSFWorkbook();
        } else {
            wb = new HSSFWorkbook();
        }
        if (dbObjectList != null && dbObjectList.size() > 0) {
            for (int x = 0; x < dbObjectList.size(); x++) {
                XlsSheetUtil.exportSheet(wb, x, dbObjectList.get(x));
            }
        }
        wb.write(outputStream);
    }

    /**
     * @param workbook 工作簿
     * @return Map
     * @description 读取excel
     * @author zhouhang
     * @date 2021/4/20
     */
    public static List<GridRecordDataModel> readExcel(Workbook workbook) {
        List<GridRecordDataModel> list = new ArrayList<>();
        Iterator<Sheet> sheetIterator = workbook.sheetIterator();
        int sheetIndex = 0;
        while (sheetIterator.hasNext()) {
            Sheet sheet = sheetIterator.next();
            //生成默认MODEL
            GridRecordDataModel model;
            if (Objects.equals(0, sheetIndex)) {
                model = strToModel("", (sheetIndex + 1) + "", 1, sheetIndex);
            } else {
                model = strToModel("", (sheetIndex + 1) + "", 0, sheetIndex);
            }
            sheetIndex++;
            //读取sheet页
            readSheet(sheet, model, workbook);
            model.setName(sheet.getSheetName());
            model.setConfig(model.getJson_data().getJSONObject("config"));
            model.setJson_data(null);
            list.add(model);
        }
        return list;
    }

    public static GridRecordDataModel strToModel(String list_id, String index, int status, int order) {
        String strSheet = "{\"row\":84,\"name\":\"reSheetName\",\"chart\":[],\"color\":\"\",\"index\":\"reIndex\",\"order\":reOrder,\"column\":60,\"config\":{},\"status\":reStatus,\"celldata\":[],\"ch_width\":4347,\"rowsplit\":[],\"rh_height\":2048,\"scrollTop\":0,\"scrollLeft\":0,\"visibledatarow\":[],\"visibledatacolumn\":[],\"jfgird_select_save\":[],\"jfgrid_selection_range\":{}}";
        strSheet = strSheet.replace("reSheetName", "Sheet" + index).replace("reIndex", index).replace("reOrder", order + "").replace("reStatus", status + "");

        JSONObject bson = JSONObject.parseObject(strSheet);
        GridRecordDataModel model = new GridRecordDataModel();
        model.setBlock_id("fblock");
        model.setRow_col("5_5");
        model.setIndex(index);
        model.setIs_delete(0);
        model.setJson_data(bson);
        model.setStatus(status);
        model.setOrder(order);
        model.setList_id(list_id);
        model.setCh_width(4347);
        model.setRh_height(2048);
        model.setDefaultColWidth(70);
        model.setDefaultRowHeight(18);
        return model;
    }

    /**
     * @param sheet    sheet页
     * @param model    数据存储
     * @param workbook excel
     * @description 读取单个sheet页
     * @author zhouhang
     * @date 2021/4/20
     */
    private static void readSheet(Sheet sheet, GridRecordDataModel model, Workbook workbook) {
        //excel数据集合
        List<JSONObject> dataList = new ArrayList<>();
        model.setCelldata(dataList);
        //获取行迭代器
        Iterator<Row> rowIterator = sheet.rowIterator();
        //获取合并单元格信息
        Map<String, String> rangeMap = getRangeMap(sheet);
        //记录最大列
        int maxCellNumber = 0;
        int maxRowNumber = 0;
        //列宽
        JSONObject columnLenObj = new JSONObject();
        //行高
        JSONObject rowLenObj = new JSONObject();
        //读取文档
        while (rowIterator.hasNext()) {
            Row row = rowIterator.next();
            int rowLen = ((int) row.getHeight()) / 20;
            if (rowLen == 0) {
                rowLen = 30;
            }
            rowLenObj.put(row.getRowNum() + "", rowLen);
            Iterator<Cell> cellIterator = row.cellIterator();
            maxRowNumber = row.getRowNum();
            while (cellIterator.hasNext()) {
                //"{\"c\":0,\"r\":0,\"v\":{\"m\":\"模板\",\"v\":\"模板\",\"bl\":1,\"ct\":{\"t\":\"g\",\"fa\":\"General\"}}}";
                JSONObject dataModel = JSONObject.parseObject(MODEL);
                //初始化默认单元格内容
                Cell cell = cellIterator.next();
                int columnLen = sheet.getColumnWidth(cell.getColumnIndex()) / 25;
                if (columnLen == 0) {
                    columnLen = 73;
                }
                columnLenObj.put(cell.getColumnIndex() + "", columnLen);
                //修改最大列
                maxCellNumber = Math.max(cell.getColumnIndex(), maxCellNumber);
                //设置行列
                dataModel.put("c", cell.getColumnIndex());
                dataModel.put("r", row.getRowNum());
                //获取单元格内容
                switch (cell.getCellTypeEnum()) {
                    case STRING:
                        dataModel.getJSONObject("v").put("m", cell.getStringCellValue());
                        dataModel.getJSONObject("v").put("v", cell.getStringCellValue());
                        break;
                    case NUMERIC:
                        dataModel.getJSONObject("v").put("m", cell.getNumericCellValue());
                        dataModel.getJSONObject("v").put("v", cell.getNumericCellValue());
                        break;
                    case BLANK:
                        dataModel.getJSONObject("v").put("m", "");
                        dataModel.getJSONObject("v").put("v", "");
                        break;
                    case BOOLEAN:
                        dataModel.getJSONObject("v").put("m", cell.getBooleanCellValue());
                        dataModel.getJSONObject("v").put("v", cell.getBooleanCellValue());
                        break;
                    case ERROR:
                        dataModel.getJSONObject("v").put("m", cell.getErrorCellValue());
                        dataModel.getJSONObject("v").put("v", cell.getErrorCellValue());
                        break;
                    default:
                        dataModel.getJSONObject("v").put("m", "");
                        dataModel.getJSONObject("v").put("v", "");
                }
                //设置单元格合并标记
                dealWithCellMarge(rangeMap, row, cell, dataModel);
                //设置单元格样式、合并单元格信息
                dealWithExcelStyle(model, dataModel, cell, sheet, workbook);
                dataList.add(dataModel);
            }
        }
        //设置最大行、列
        model.getJson_data().put("column", Math.max(maxCellNumber, DEFAULT_COLUMN_INDEX));
        model.getJson_data().put("row", Math.max(maxRowNumber, DEFAULT_ROW_INDEX));
        //设置行高、列宽
        model.getJson_data().getJSONObject("config").put("columnlen", columnLenObj);
        model.getJson_data().getJSONObject("config").put("rowlen", rowLenObj);
    }

    /**
     * @param sheet sheet页信息
     * @return Map<String, String> 单元格合并信息
     * @description 获取合并单元格信息 所有合并单元的MAP
     * @author zhouhang
     * @date 2021/4/21
     */
    @NotNull
    private static Map<String, String> getRangeMap(Sheet sheet) {
        List<CellRangeAddress> rangeAddressList = sheet.getMergedRegions();
        Map<String, String> rangeMap = new HashMap<>(rangeAddressList.size() * 5);
        for (CellRangeAddress cellAddresses : rangeAddressList) {
            for (int i = cellAddresses.getFirstRow(); i <= cellAddresses.getLastRow(); i++) {
                for (int j = cellAddresses.getFirstColumn(); j <= cellAddresses.getLastColumn(); j++) {
                    if (i == cellAddresses.getFirstRow() && j == cellAddresses.getFirstColumn()) {
                        //单元格合并初始值特殊标记
                        rangeMap.put(i + "_" + j, cellAddresses.getFirstRow() + "_" + cellAddresses.getFirstColumn() + "_" + cellAddresses.getLastRow() + "_" + cellAddresses.getLastColumn());
                    } else {
                        rangeMap.put(i + "_" + j, cellAddresses.getFirstRow() + "_" + cellAddresses.getFirstColumn());
                    }
                }
            }
        }
        return rangeMap;
    }

    /**
     * @param rangeMap  合并信息
     * @param row       行信息
     * @param cell      单元格
     * @param dataModel 单元格数据存储信息
     * @description 设置单元格合并标记
     * @author zhouhang
     * @date 2021/4/21
     */
    private static void dealWithCellMarge(Map<String, String> rangeMap, Row row, Cell cell, JSONObject dataModel) {
        if (rangeMap.containsKey(row.getRowNum() + "_" + cell.getColumnIndex())) {
            String margeValue = rangeMap.get(row.getRowNum() + "_" + cell.getColumnIndex());
            JSONObject mcData = new JSONObject();
            String[] s = margeValue.split("_");
            mcData.put("r", Integer.parseInt(s[0]));
            mcData.put("c", Integer.parseInt(s[1]));
            if (s.length == 4) {
                mcData.put("rs", Integer.parseInt(s[2]) - Integer.parseInt(s[0]) + 1);
                mcData.put("cs", Integer.parseInt(s[3]) - Integer.parseInt(s[1]) + 1);
            }
            dataModel.getJSONObject("v").put("mc", mcData);
        }
    }

    /**
     * @param model     sheet页信息
     * @param dataModel 单元格信息
     * @param cell      单元格
     * @param sheet     sheet页数据
     * @param workbook  excel
     * @description 获取单元格样式,设置单元格样式
     * @author zhouhang
     * @date 2021/4/21
     */
    private static void dealWithExcelStyle(GridRecordDataModel model, JSONObject dataModel, Cell cell, Sheet sheet, Workbook workbook) {
        //设置单元格合并信息
        dealWithExcelMerge(model, sheet);
        //设置字体样式
        setFontStyle(dataModel, workbook, cell);
        //设置单元格样式
        dealWithBorderStyle(model, cell, workbook);
    }

    /**
     * @param model    在线表格存储单元
     * @param cell     cell
     * @param workbook workbook
     * @description 设置单元格样式
     * @author zhouhang
     * @date 2021/4/22
     */
    private static void dealWithBorderStyle(GridRecordDataModel model, Cell cell, Workbook workbook) {
        CellStyle cellStyle = cell.getCellStyle();
        //判断是否存在边框
        if (cellStyle.getBorderBottomEnum().getCode() > 0 || cellStyle.getBorderBottomEnum().getCode() > 0 ||
                cellStyle.getBorderRightEnum().getCode() > 0 || cellStyle.getBorderRightEnum().getCode() > 0) {
            JSONObject border = JSONObject.parseObject(BORDER_MODEL);
            border.getJSONObject("value").put("row_index", cell.getRowIndex());
            border.getJSONObject("value").put("col_index", cell.getColumnIndex());
            //xlsx
            if (cellStyle instanceof XSSFCellStyle) {
                XSSFCellStyle xssfCellStyle = (XSSFCellStyle) cellStyle;
                if (Objects.equals((short) 0, cellStyle.getBorderTopEnum().getCode())) {
                    border.getJSONObject("value").remove("t");
                } else {
                    border.getJSONObject("value").getJSONObject("t").put("color", dealWithRbg(xssfCellStyle.getTopBorderXSSFColor().getRGB()));
                }
                if (Objects.equals((short) 0, cellStyle.getBorderRightEnum().getCode())) {
                    border.getJSONObject("value").remove("r");
                } else {
                    border.getJSONObject("value").getJSONObject("r").put("color", dealWithRbg(xssfCellStyle.getRightBorderXSSFColor().getRGB()));
                }
                if (Objects.equals((short) 0, cellStyle.getBorderLeftEnum().getCode())) {
                    border.getJSONObject("value").remove("l");
                } else {
                    border.getJSONObject("value").getJSONObject("l").put("color", dealWithRbg(xssfCellStyle.getLeftBorderXSSFColor().getRGB()));
                }
                if (Objects.equals((short) 0, cellStyle.getBorderBottomEnum().getCode())) {
                    border.getJSONObject("value").remove("b");
                } else {
                    border.getJSONObject("value").getJSONObject("b").put("color", dealWithRbg(xssfCellStyle.getBottomBorderXSSFColor().getRGB()));
                }
            } else if (cellStyle instanceof HSSFCellStyle) {
                //xls
                HSSFWorkbook hssfWorkbook = (HSSFWorkbook) workbook;
                HSSFCellStyle hssfCellStyle = (HSSFCellStyle) cellStyle;
                if (Objects.equals((short) 0, cellStyle.getBorderTopEnum().getCode())) {
                    border.getJSONObject("value").remove("t");
                } else {
                    HSSFColor color = hssfWorkbook.getCustomPalette().getColor(hssfCellStyle.getTopBorderColor());
                    border.getJSONObject("value").getJSONObject("t").put("color", dealWithRbgShort(color.getTriplet()));
                }
                if (Objects.equals((short) 0, cellStyle.getBorderRightEnum().getCode())) {
                    border.getJSONObject("value").remove("r");
                } else {
                    HSSFColor color = hssfWorkbook.getCustomPalette().getColor(hssfCellStyle.getRightBorderColor());
                    border.getJSONObject("value").getJSONObject("r").put("color", dealWithRbgShort(color.getTriplet()));
                }
                if (Objects.equals((short) 0, cellStyle.getBorderLeftEnum().getCode())) {
                    border.getJSONObject("value").remove("l");
                } else {
                    HSSFColor color = hssfWorkbook.getCustomPalette().getColor(hssfCellStyle.getLeftBorderColor());
                    border.getJSONObject("value").getJSONObject("l").put("color", dealWithRbgShort(color.getTriplet()));
                }
                if (Objects.equals((short) 0, cellStyle.getBorderBottomEnum().getCode())) {
                    border.getJSONObject("value").remove("b");
                } else {
                    HSSFColor color = hssfWorkbook.getCustomPalette().getColor(hssfCellStyle.getBottomBorderColor());
                    border.getJSONObject("value").getJSONObject("b").put("color", dealWithRbgShort(color.getTriplet()));
                }
            }
            JSONArray borderInfo = model.getJson_data().getJSONObject("config").getJSONArray("borderInfo");
            if (Objects.isNull(borderInfo)) {
                borderInfo = new JSONArray();
                model.getJson_data().getJSONObject("config").put("borderInfo", borderInfo);
            }
            borderInfo.add(border);
        }
    }

    /**
     * @param rgb RBG short
     * @return rbg(0, 0, 0)
     * @description 转换RBG rbg(0,0,0)
     * @author zhouhang
     * @date 2021/4/26
     */
    private static String dealWithRbgShort(short[] rgb) {
        return getRbg(Objects.nonNull(rgb), rgb[0], rgb[1], rgb[2]);
    }

    @NotNull
    private static String getRbg(boolean b2, short r, short b, short g) {
        if (b2) {
            return "rgb(" + (r & 0xFF) + ", " + (b & 0xFF) + ", " + (g & 0xFF) + ")";
        } else {
            return "rgb(0, 0, 0)";
        }
    }

    /**
     * @param rgb RBG byte
     * @return rbg(0, 0, 0)
     * @description 转换RBG rbg(0,0,0)
     * @author zhouhang
     * @date 2021/4/26
     */
    private static String dealWithRbg(byte[] rgb) {
        if (Objects.isNull(rgb)) {
            return "rgb(0, 0, 0)";
        }
        short[] shorts = new short[]{rgb[0], rgb[1], rgb[2]};
        return getRbg(true, shorts[0], shorts[1], shorts[2]);
    }

    /**
     * @param dataModel 单元格内容
     * @param workbook  workbook
     * @param cell      cell
     * @description s设置字体样式
     * @author zhouhang
     * @date 2021/4/21
     */
    private static void setFontStyle(JSONObject dataModel, Workbook workbook, Cell cell) {
        CellStyle cellStyle = cell.getCellStyle();
        Font font = workbook.getFontAt(cellStyle.getFontIndex());
        JSONObject v = dataModel.getJSONObject("v");
        //ht 水平对齐   水平对齐方式(0=居中,1=左对齐,2=右对齐)   excel:左:1  中:2  右:3 未设置:0
        v.put("ht", ExcelCenterStyleEnum.getExcelCenterStyleByExcelCenterCode(cellStyle.getAlignmentEnum().getCode()).getOnlineExcelCode());
        //bl 字体加粗设置
        v.put("bl", font.getBold() ? 1 : 0);
        //lt 斜体
        v.put("it", font.getItalic() ? 1 : 0);
        //ff 字体
        v.put("ff", font.getFontName());
        //fc 字体颜色
        if (font instanceof HSSFFont) {
            HSSFFont hssfFont = (HSSFFont) font;
            HSSFColor hssfColor = hssfFont.getHSSFColor((HSSFWorkbook) workbook);
            if (Objects.nonNull(hssfColor)) {
                v.put("fc", ColorUtil.convertRGBToHex(hssfColor.getTriplet()[0], hssfColor.getTriplet()[1], hssfColor.getTriplet()[2]));
            }
        } else {
            XSSFFont xssfFont = (XSSFFont) font;
            XSSFColor xssfColor = xssfFont.getXSSFColor();
            if (Objects.nonNull(xssfColor)) {
                v.put("fc", "#" + xssfColor.getARGBHex().substring(2));
            }
        }
        //fs 字体大小
        v.put("fs", font.getFontHeightInPoints());
        //cl 删除线
        v.put("cl", font.getStrikeout() ? 1 : 0);
        //ul 下划线
        v.put("un", font.getUnderline());
        //背景色
        String fillColorHex = ColorUtil.getFillColorHex(cell);
        if (Objects.nonNull(fillColorHex)) {
            v.put("bg", fillColorHex);
        }
    }

    /**
     * @param model sheet页信息
     * @param sheet sheet页
     * @description 设置单元格合并信息
     * @author zhouhang
     * @date 2021/4/21
     */
    private static void dealWithExcelMerge(GridRecordDataModel model, Sheet sheet) {
        if (CollectionUtils.isNotEmpty(sheet.getMergedRegions())) {
            //{"color":"","list_id":"","column":60,"index":"1","jfgird_select_save":[],"rh_height":1790,"visibledatacolumn":[],"scrollTop":0,"block_id":"fblock","rowsplit":[],"visibledatarow":[],"jfgrid_selection_range":{},"name":"Sheet1","celldata":[],"ch_width":4748,"row":84,"scrollLeft":0,"id":364598,"chart":[],"config":{},"order":0,"status":1}
            JSONObject jsonObject = model.getJson_data();
            JSONObject config = jsonObject.getJSONObject("config");
            JSONObject merge = new JSONObject();
            for (CellRangeAddress mergedRegion : sheet.getMergedRegions()) {
                JSONObject mergeBase = new JSONObject();
                mergeBase.put("r", mergedRegion.getFirstRow());
                mergeBase.put("c", mergedRegion.getFirstColumn());
                mergeBase.put("rs", mergedRegion.getLastRow() - mergedRegion.getFirstRow() + 1);
                mergeBase.put("cs", mergedRegion.getLastColumn() - mergedRegion.getFirstColumn() + 1);
                merge.put(mergedRegion.getFirstRow() + "_" + mergedRegion.getFirstColumn(), mergeBase);
            }
            config.put("merge", merge);
        }
    }
}
package com.util.excel;


import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Administrator
 */
@Slf4j
public class JfGridConfigModel {

    /**
     * 表名
     */
    public static final String TABLENAME="luckysheet";

    /**
     * 每一块的行、列范围
     */
    public static Integer row_size;
    public static Integer col_size;
    /**
     * 第一块只保存二维数据以外的东西,其他“列号_行号”
     */
    public static final String FirstBlockID="fblock";


    /**
     * 默认第一块的编号
     */
    private static String FirstBlockId="";

    static {
        try {
            //获取默认第一块的编号
            FirstBlockId=JfGridConfigModel.FirstBlockID;
        } catch (Exception e) {
            log.error(e.getMessage());
        }
    }

    /**
     * 返回设置的块范围
     * @return
     */
    public static String getRowCol(){
        return row_size+"_"+col_size;
    }
    private static Integer getRow(String rowCol){
        if(StringUtils.isBlank(rowCol)){
            return row_size;
        }
        try{
            return Integer.parseInt(rowCol.split("_")[0]);
        }catch (Exception ex){
            return row_size;
        }
    }
    private static Integer getCol(String rowCol){
        if(StringUtils.isBlank(rowCol)){
            return col_size;
        }
        try{
            return Integer.parseInt(rowCol.split("_")[1]);
        }catch (Exception ex){
            return col_size;
        }
    }



    /**
     * 获取块的范围
     * @param r 当前行
     * @param c 当前列
     * @param rowSize 行范围
     * @param colSize 列范围
     * @return
     */
    public static String getRange(Integer r,Integer c,Integer rowSize,Integer colSize){
        String _r=r/rowSize+"";
        String _c=c/colSize+"";
        String _result=_r+"_"+_c;
        return _result;
    }
    public static String getRange(Integer r,Integer c,String rowCol){
        return getRange(r,c,getRow(rowCol),getCol(rowCol));
    }

    /**
     * 获取块的范围
     * @param bson
     * @param rowSize
     * @param colSize
     * @return
     */
    private static String getRange(JSONObject bson, Integer rowSize, Integer colSize){
        if(bson.containsKey("r") && bson.containsKey("c")){
            try{
                //单元格的行号
                Integer _r=Integer.parseInt(bson.get("r").toString());
                //单元格的列号
                Integer _c=Integer.parseInt(bson.get("c").toString());
                return getRange(_r,_c,rowSize,colSize);
            }catch (Exception ex){
                log.error(ex.toString());
                return null;
            }
        }
        return null;
    }

    /**
     * 单个sheet数据拆分成多个(使用默认块大小)
     * @param sheet 一个sheet
     */
    public static List<JSONObject> toDataSplit(String rowCol, JSONObject sheet) {
        return toDataSplit(getRow(rowCol),getCol(rowCol),sheet);
    }

    public static Integer getSheetCount(List<JSONObject> dbObject){
        int i=0;
        if(dbObject!=null && dbObject.size()>0){
            for(JSONObject b:dbObject){
                if(b.containsKey("block_id") && FirstBlockID.equals(b.get("block_id"))){
                    i++;
                }
            }
        }
        return i;
    }

    /**
     * 单个sheet数据拆分成多个
     * @param rowSize 行数量
     * @param colSize 列数量
     * @param sheet 一个sheet
     */
    private static List<JSONObject> toDataSplit(Integer rowSize,Integer colSize,JSONObject sheet){
        List<JSONObject> list=new ArrayList<JSONObject>();
        if(sheet!=null && sheet.containsKey("celldata")){
            //单元格数据
            List<JSONObject> celldata=(List<JSONObject>)sheet.get("celldata");
            //相同的索引
            Object index=sheet.get("index");
            //序号
            Object list_id=null;
            if(sheet.containsKey("list_id")){
                list_id=sheet.get("list_id");
            }
            //Object order=sheet.get("order");//相同的位置

            //k 行号+列号 v 位置_datas下标
            Map<String,Integer> pos=new HashMap<String, Integer>();
            //分组的数据
            List<List<JSONObject>> datas=new ArrayList<List<JSONObject>>();

            if(celldata!=null && celldata.size()>0){
                for(JSONObject bson:celldata){
                    //获取到位置
                    String _pos=getRange(bson,rowSize,colSize);
                    if(_pos!=null){
                        //获取到数据集合
                        List<JSONObject> _data=null;
                        if(pos.containsKey(_pos)){
                            //获取对应集合
                            _data=datas.get(pos.get(_pos));
                        }else{
                            _data=new ArrayList<JSONObject>();
                            //保存位置信息
                            pos.put(_pos,datas.size());
                            //添加集合
                            datas.add(_data);
                        }
                        //添加新数据
                        _data.add(bson);
                    }
                }
            }

            //替换原始的数据
            //if(pos.containsKey(FirstBlockID)){
            //    sheet.put("celldata",datas.get(pos.get(FirstBlockID)));
            //}
            if(sheet.containsKey("_id")){
                sheet.remove("_id");
            }
            sheet.put("celldata",new ArrayList());
            list.add(sheet);

            for(String _pos:pos.keySet()){
                //if(_pos.equals(FirstBlockID)){
                //    continue;
                //}
                //获取对应集合
                List<JSONObject> _data=datas.get(pos.get(_pos));
                JSONObject _sheet=new JSONObject();
                _sheet.put("block_id",_pos);
                _sheet.put("celldata",_data);
                _sheet.put("index",index);
                if(list_id!=null){
                    _sheet.put("list_id",list_id);
                }
                list.add(_sheet);
                //_sheet.put("order",order);
            }

        }else{
            list.add(sheet);
        }
        return  list;

    }


}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值