SpingBoot解析Excel数据


前言

在最近的工作中,由于导入模板除了前三列(姓名、手机号、实发工资)固定;其余的列不固定,并且可以做到两个模板的数据都能够正常入库进行对应业务处理。

一、数据模板数据展示:

(1)模板一

 (2)模板二

 二、处理思路

观察两个模板的数据;结合面向对象的编程思想设计;我可以将两模板需要的获取的字段属性归纳为5个属性点:
注意:标题头在以下中不算!!!
索引(index)-- 相当于excel中所在列的下标列索引 列名称(name)-- 相当于excel中所在列的名称 列值(value)-- 相当于excel中所在列的值 是否存在合并单元格(isGrossField)-- 相当于excel中所在列的是否有合并单元格 合并的子元素(child)-- 相当于excel中所在列的是否有合并单元格下所包含的列

三、编程准备

1、实体类创建:

/**
 * @project 
 * @Description
 * @Author songwp
 * @Date 2022/8/17 9:04
 * @Version 1.0.0
 **/
@Data
public class TreeExcel implements Serializable {

    private int index = 0;

    private String name;

    private String value;

    private boolean isGrossField;

    private List childs;
}

2、maven依赖的引入

<dependency>
    <groupId>com.alibabagroupId>
    <artifactId>easyexcelartifactId>
    <version>2.2.0-beta2version>
 dependency>

3、文件解析工具类的编写

import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.fastjson.JSONArray;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * @project
 * @Description
 * @Author songwp
 * @Date 2022/8/17 9:09
 * @Version 1.0.0
 **/
public class ExcelUtil {

    private String value = "empty";

    private List nodes;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public void createExcelJson(List treeExcelList, int valueQueueSize, Queue linkedValue, boolean firstStorey) {
        if (null != nodes && !firstStorey) {
            TreeExcel treeExcel = new TreeExcel();
            treeExcel.setGrossField(true);
            treeExcel.setName(treeExcel.getName());
            treeExcel.setIndex(valueQueueSize - linkedValue.size());

            List listElem = new ArrayList<>();
            treeExcel.setChilds(listElem);
            for (ExcelUtil tree : nodes) {
                tree.createExcelJson(listElem, valueQueueSize, linkedValue, false);
            }
            treeExcelList.add(treeExcel);
        } else {
            if (firstStorey) {
                for (ExcelUtil tree : nodes) {
                    tree.createExcelJson(treeExcelList, valueQueueSize, linkedValue, false);
                }
                return;
            }
            TreeExcel treeExcel = new TreeExcel();
            treeExcel.setIndex(valueQueueSize - linkedValue.size());
            treeExcel.setName(treeExcel.getName());
            treeExcel.setValue(linkedValue.poll());
            treeExcel.setGrossField(false);
            treeExcelList.add(treeExcel);
        }
    }

    /**
     * 获取树状数据结构
     *
     * @param inputStream
     * @return
     * @throws Exception
     */
    public static JSONArray getExcelParseJSON(InputStream inputStream) throws Exception {
        List read = EasyExcelFactory.read(inputStream, new Sheet(1, 0));
        Map data = new HashMap<>();
        int startDataLine = 0;
        ExcelTreeUtils tree = new ExcelTreeUtils();
        Queue queue = new LinkedBlockingQueue<>();
        for (int i = 0; i < read.size(); i++) {
            Object line = read.get(i);
            ArrayList lineList = (ArrayList) line;

            if (i > 0 && null != lineList.get(0) && startDataLine == 0) {
                startDataLine = i;
                break;
            }
            Queue nextQueue = new LinkedBlockingQueue<>();
            for (int j = 0; j < lineList.size(); j++) {
                String elem = lineList.get(j);
                if (null != elem) {
                    if (i == 0) {
                        List nodes = tree.getNodes();
                        if (null == nodes) {
                            nodes = new ArrayList<>();
                            tree.setNodes(nodes);
                        }
                        ExcelTreeUtils currentTree = new ExcelTreeUtils(elem, j);
                        nodes.add(currentTree);
                        queue.add(currentTree);
                    } else {
                        ExcelTreeUtils currentQueueTree = queue.peek();
                        while (j >= queue.peek().getExcelColumnIndex()) {
                            nextQueue.add(queue.poll());
                            currentQueueTree = queue.peek();
                        }
                        List nodes = currentQueueTree.getNodes();
                        if (null == nodes) {
                            nodes = new ArrayList<>();
                            currentQueueTree.setNodes(nodes);
                        }
                        ExcelTreeUtils currentTree = new ExcelTreeUtils(elem, j);
                        nodes.add(currentTree);
                        nextQueue.add(currentTree);
                    }
                }
            }
            if (i > 0) {
                queue = nextQueue;
            }
            Queue newQueue = new LinkedBlockingQueue<>();
            while (null != queue.peek()) {
                ExcelTreeUtils poll = queue.poll();
                if (null != queue.peek()) {
                    poll.setExcelColumnIndex(queue.peek().getExcelColumnIndex());
                } else {
                    poll.setExcelColumnIndex(i);
                }
                newQueue.add(poll);
            }
            queue = newQueue;
        }
        Queue valueQueue = new LinkedBlockingQueue<>();
        JSONArray resultJsonArray = new JSONArray();
        for (int i = startDataLine; i < read.size(); i++) {
            Object line = read.get(i);
            ArrayList lineList = (ArrayList) line;
            for (int j = 0; j < lineList.size(); j++) {
                String elem = lineList.get(j);
                if (null == elem) elem = "";
                valueQueue.add(elem);
            }
            JSONArray jsonArray = new JSONArray();
            tree.createStructeddJson(jsonArray, valueQueue.size(), valueQueue, true);
            resultJsonArray.add(jsonArray);
        }
        return resultJsonArray;
    }
}

4、测试类的编写

 public static void main(String[] args) throws Exception {
        InputStream fis = new FileInputStream("C:\\Users\\Lenovo\\Desktop\\工作簿1.xlsx");
        JSONArray jsonArray = getExcelParseJSON(fis);
        System.out.println(jsonArray);
        TreeExcel treeExcel = new TreeExcel();
        for (Object salaryObject : jsonArray) {
            JSONArray salaryInfo = (JSONArray) salaryObject;
            treeExcel.setIndex(Integer.parseInt(((Map) salaryInfo.get(0)).get("index").toString()));
            treeExcel.setName(((Map) salaryInfo.get(0)).get("name").toString());
            treeExcel.setValue(((Map) salaryInfo.get(0)).get("value").toString());
            treeExcel.setGrossField(Boolean.getBoolean(((Map) salaryInfo.get(0)).get("isGrossField").toString()));
        }
        System.out.println(treeExcel);
    }

5、日志输出展示

 注意:因为自己的实体在循环外面展示;所以循环里面赋值存在覆盖;所以获取到的是最后一条数据对应信息

(1)模板一:

(2)模板二:

 6、返回的json展示:

(1)模板一:

[
    [
        {
            "name":"姓名",
            "index":0,
            "isGrossField":false,
            "value":"张三"
        },
        {
            "name":"手机号",
            "index":1,
            "isGrossField":false,
            "value":"18710000000"
        },
        {
            "name":"实发工资",
            "index":2,
            "isGrossField":false,
            "value":"200000"
        },
        {
            "name":"1高级专家补贴",
            "index":3,
            "isGrossField":false,
            "value":"2000"
        },
        {
            "name":"话费补贴1",
            "index":4,
            "isGrossField":false,
            "value":"300"
        },
        {
            "name":"薪级薪档",
            "index":5,
            "isGrossField":false,
            "value":"五档"
        },
        {
            "name":"考核系数",
            "index":6,
            "isGrossField":false,
            "value":"25%"
        },
        {
            "name":"参与绩效奖金计算的岗位工资",
            "index":7,
            "isGrossField":false,
            "value":"1231"
        },
        {
            "name":"工资说明",
            "index":8,
            "isGrossField":false,
            "value":""
        },
        {
            "name":"温馨提示",
            "index":9,
            "isGrossField":false,
            "value":"无"
        }
    ],
    [
        {
            "name":"姓名",
            "index":0,
            "isGrossField":false,
            "value":"李四"
        },
        {
            "name":"手机号",
            "index":1,
            "isGrossField":false,
            "value":"18710000001"
        },
        {
            "name":"实发工资",
            "index":2,
            "isGrossField":false,
            "value":"200001"
        },
        {
            "name":"1高级专家补贴",
            "index":3,
            "isGrossField":false,
            "value":"2001"
        },
        {
            "name":"话费补贴1",
            "index":4,
            "isGrossField":false,
            "value":"301"
        },
        {
            "name":"薪级薪档",
            "index":5,
            "isGrossField":false,
            "value":"五档"
        },
        {
            "name":"考核系数",
            "index":6,
            "isGrossField":false,
            "value":"125%"
        },
        {
            "name":"参与绩效奖金计算的岗位工资",
            "index":7,
            "isGrossField":false,
            "value":"1232"
        },
        {
            "name":"工资说明",
            "index":8,
            "isGrossField":false,
            "value":"无"
        },
        {
            "name":"温馨提示",
            "index":9,
            "isGrossField":false,
            "value":"无"
        }
    ],
    [
        {
            "name":"姓名",
            "index":0,
            "isGrossField":false,
            "value":"王五"
        },
        {
            "name":"手机号",
            "index":1,
            "isGrossField":false,
            "value":"18710000002"
        },
        {
            "name":"实发工资",
            "index":2,
            "isGrossField":false,
            "value":"200002"
        },
        {
            "name":"1高级专家补贴",
            "index":3,
            "isGrossField":false,
            "value":"2002"
        },
        {
            "name":"话费补贴1",
            "index":4,
            "isGrossField":false,
            "value":"302"
        },
        {
            "name":"薪级薪档",
            "index":5,
            "isGrossField":false,
            "value":"五档"
        },
        {
            "name":"考核系数",
            "index":6,
            "isGrossField":false,
            "value":""
        },
        {
            "name":"参与绩效奖金计算的岗位工资",
            "index":7,
            "isGrossField":false,
            "value":"1233"
        },
        {
            "name":"工资说明",
            "index":8,
            "isGrossField":false,
            "value":"无"
        },
        {
            "name":"温馨提示",
            "index":9,
            "isGrossField":false,
            "value":"无"
        }
    ],
    [
        {
            "name":"姓名",
            "index":0,
            "isGrossField":false,
            "value":"赵老六"
        },
        {
            "name":"手机号",
            "index":1,
            "isGrossField":false,
            "value":"18710000003"
        },
        {
            "name":"实发工资",
            "index":2,
            "isGrossField":false,
            "value":"200003"
        },
        {
            "name":"1高级专家补贴",
            "index":3,
            "isGrossField":false,
            "value":"2003"
        },
        {
            "name":"话费补贴1",
            "index":4,
            "isGrossField":false,
            "value":"303"
        },
        {
            "name":"薪级薪档",
            "index":5,
            "isGrossField":false,
            "value":"五档"
        },
        {
            "name":"考核系数",
            "index":6,
            "isGrossField":false,
            "value":"325%"
        },
        {
            "name":"参与绩效奖金计算的岗位工资",
            "index":7,
            "isGrossField":false,
            "value":"1234"
        },
        {
            "name":"工资说明",
            "index":8,
            "isGrossField":false,
            "value":"无"
        },
        {
            "name":"温馨提示",
            "index":9,
            "isGrossField":false,
            "value":"无"
        }
    ],
    [
        {
            "name":"姓名",
            "index":0,
            "isGrossField":false,
            "value":"小明"
        },
        {
            "name":"手机号",
            "index":1,
            "isGrossField":false,
            "value":"18710000004"
        },
        {
            "name":"实发工资",
            "index":2,
            "isGrossField":false,
            "value":"200004"
        },
        {
            "name":"1高级专家补贴",
            "index":3,
            "isGrossField":false,
            "value":"2004"
        },
        {
            "name":"话费补贴1",
            "index":4,
            "isGrossField":false,
            "value":"304"
        },
        {
            "name":"薪级薪档",
            "index":5,
            "isGrossField":false,
            "value":"五档"
        },
        {
            "name":"考核系数",
            "index":6,
            "isGrossField":false,
            "value":"425%"
        },
        {
            "name":"参与绩效奖金计算的岗位工资",
            "index":7,
            "isGrossField":false,
            "value":"1235"
        },
        {
            "name":"工资说明",
            "index":8,
            "isGrossField":false,
            "value":"无"
        },
        {
            "name":"温馨提示",
            "index":9,
            "isGrossField":false,
            "value":"无"
        }
    ]
]

(2)模板二:

[
    [
        {
            "name":"姓名",
            "index":0,
            "isGrossField":false,
            "value":"张三"
        },
        {
            "name":"手机号",
            "index":1,
            "isGrossField":false,
            "value":"18700000000"
        },
        {
            "name":"实发工资",
            "index":2,
            "isGrossField":false,
            "value":"25000"
        },
        {
            "name":"应发工资",
            "isGrossField":true,
            "child":[
                {
                    "name":"出勤\n天数",
                    "index":3,
                    "isGrossField":false,
                    "value":"22"
                },
                {
                    "name":"岗位工资系数",
                    "index":4,
                    "isGrossField":false,
                    "value":"3500"
                },
                {
                    "name":"岗位工\n资标准",
                    "index":5,
                    "isGrossField":false,
                    "value":"13000"
                },
                {
                    "name":"岗位工资",
                    "index":6,
                    "isGrossField":false,
                    "value":"3500"
                },
                {
                    "name":"绩效系数",
                    "index":7,
                    "isGrossField":false,
                    "value":"150"
                },
                {
                    "name":"绩效奖金标准",
                    "index":8,
                    "isGrossField":false,
                    "value":"100"
                },
                {
                    "name":"个人绩效分数",
                    "index":9,
                    "isGrossField":false,
                    "value":"100"
                },
                {
                    "name":"绩效奖金",
                    "index":10,
                    "isGrossField":false,
                    "value":"1000"
                },
                {
                    "name":"工龄补贴",
                    "index":11,
                    "isGrossField":false,
                    "value":"1000"
                },
                {
                    "name":"职称津贴",
                    "index":12,
                    "isGrossField":false,
                    "value":""
                },
                {
                    "name":"话费补贴",
                    "index":13,
                    "isGrossField":false,
                    "value":"100"
                },
                {
                    "name":"证书津贴",
                    "index":14,
                    "isGrossField":false,
                    "value":"1000"
                },
                {
                    "name":"保密津贴",
                    "index":15,
                    "isGrossField":false,
                    "value":"100"
                },
                {
                    "name":"午餐补贴",
                    "index":16,
                    "isGrossField":false,
                    "value":""
                },
                {
                    "name":"医疗补贴",
                    "index":17,
                    "isGrossField":false,
                    "value":"1000"
                },
                {
                    "name":"交通补贴",
                    "index":18,
                    "isGrossField":false,
                    "value":"1000"
                },
                {
                    "name":"降温费",
                    "index":19,
                    "isGrossField":false,
                    "value":"100"
                },
                {
                    "name":"差额",
                    "index":20,
                    "isGrossField":false,
                    "value":"100"
                },
                {
                    "name":"小计",
                    "index":21,
                    "isGrossField":false,
                    "value":"1000"
                }
            ]
        },
        {
            "name":"应扣款项",
            "isGrossField":true,
            "child":[
                {
                    "name":"旷工\n天数",
                    "index":22,
                    "isGrossField":false,
                    "value":"1"
                },
                {
                    "name":"旷工扣款",
                    "index":23,
                    "isGrossField":false,
                    "value":"100"
                },
                {
                    "name":"事假\n天数",
                    "index":24,
                    "isGrossField":false,
                    "value":"1"
                },
                {
                    "name":"事假扣款",
                    "index":25,
                    "isGrossField":false,
                    "value":"100"
                },
                {
                    "name":"病假\n天数",
                    "index":26,
                    "isGrossField":false,
                    "value":"1"
                },
                {
                    "name":"病假扣款",
                    "index":27,
                    "isGrossField":false,
                    "value":"100"
                },
                {
                    "name":"小计",
                    "index":28,
                    "isGrossField":false,
                    "value":"300"
                }
            ]
        },
        {
            "name":"应发合计",
            "index":29,
            "isGrossField":false,
            "value":"40000"
        },
        {
            "name":"07月社保、06月医疗及07月公积金扣款",
            "isGrossField":true,
            "child":[
                {
                    "name":"月养老保险",
                    "index":30,
                    "isGrossField":false,
                    "value":"500"
                },
                {
                    "name":"月医疗保险",
                    "index":31,
                    "isGrossField":false,
                    "value":"600"
                },
                {
                    "name":"月大额补充",
                    "index":32,
                    "isGrossField":false,
                    "value":"700"
                },
                {
                    "name":"月失业保险",
                    "index":33,
                    "isGrossField":false,
                    "value":"800"
                },
                {
                    "name":"社保补缴养老",
                    "index":34,
                    "isGrossField":false,
                    "value":"900"
                },
                {
                    "name":"社保补缴大额",
                    "index":35,
                    "isGrossField":false,
                    "value":"100"
                },
                {
                    "name":"社保补缴\n医疗",
                    "index":36,
                    "isGrossField":false,
                    "value":"110"
                },
                {
                    "name":"公积金",
                    "index":37,
                    "isGrossField":false,
                    "value":"120"
                }
            ]
        },
        {
            "name":"社保公积当月合计",
            "index":38,
            "isGrossField":false,
            "value":"130"
        },
        {
            "name":"六项附加当月",
            "index":39,
            "isGrossField":false,
            "value":"140"
        },
        {
            "name":"个税",
            "index":40,
            "isGrossField":false,
            "value":"150"
        },
        {
            "name":"补偿",
            "index":41,
            "isGrossField":false,
            "value":"1600"
        }
    ],
    [
        {
            "name":"姓名",
            "index":0,
            "isGrossField":false,
            "value":"李四"
        },
        {
            "name":"手机号",
            "index":1,
            "isGrossField":false,
            "value":"18710000000"
        },
        {
            "name":"实发工资",
            "index":2,
            "isGrossField":false,
            "value":"20000"
        },
        {
            "name":"应发工资",
            "isGrossField":true,
            "child":[
                {
                    "name":"出勤\n天数",
                    "index":3,
                    "isGrossField":false,
                    "value":"21"
                },
                {
                    "name":"岗位工资系数",
                    "index":4,
                    "isGrossField":false,
                    "value":"3500"
                },
                {
                    "name":"岗位工\n资标准",
                    "index":5,
                    "isGrossField":false,
                    "value":"13000"
                },
                {
                    "name":"岗位工资",
                    "index":6,
                    "isGrossField":false,
                    "value":"3500"
                },
                {
                    "name":"绩效系数",
                    "index":7,
                    "isGrossField":false,
                    "value":"200"
                },
                {
                    "name":"绩效奖金标准",
                    "index":8,
                    "isGrossField":false,
                    "value":"200"
                },
                {
                    "name":"个人绩效分数",
                    "index":9,
                    "isGrossField":false,
                    "value":"200"
                },
                {
                    "name":"绩效奖金",
                    "index":10,
                    "isGrossField":false,
                    "value":"2000"
                },
                {
                    "name":"工龄补贴",
                    "index":11,
                    "isGrossField":false,
                    "value":""
                },
                {
                    "name":"职称津贴",
                    "index":12,
                    "isGrossField":false,
                    "value":"2000"
                },
                {
                    "name":"话费补贴",
                    "index":13,
                    "isGrossField":false,
                    "value":"200"
                },
                {
                    "name":"证书津贴",
                    "index":14,
                    "isGrossField":false,
                    "value":"2000"
                },
                {
                    "name":"保密津贴",
                    "index":15,
                    "isGrossField":false,
                    "value":"200"
                },
                {
                    "name":"午餐补贴",
                    "index":16,
                    "isGrossField":false,
                    "value":"2000"
                },
                {
                    "name":"医疗补贴",
                    "index":17,
                    "isGrossField":false,
                    "value":"2000"
                },
                {
                    "name":"交通补贴",
                    "index":18,
                    "isGrossField":false,
                    "value":"2000"
                },
                {
                    "name":"降温费",
                    "index":19,
                    "isGrossField":false,
                    "value":"200"
                },
                {
                    "name":"差额",
                    "index":20,
                    "isGrossField":false,
                    "value":"200"
                },
                {
                    "name":"小计",
                    "index":21,
                    "isGrossField":false,
                    "value":"2000"
                }
            ]
        },
        {
            "name":"应扣款项",
            "isGrossField":true,
            "child":[
                {
                    "name":"旷工\n天数",
                    "index":22,
                    "isGrossField":false,
                    "value":"2"
                },
                {
                    "name":"旷工扣款",
                    "index":23,
                    "isGrossField":false,
                    "value":"200"
                },
                {
                    "name":"事假\n天数",
                    "index":24,
                    "isGrossField":false,
                    "value":"2"
                },
                {
                    "name":"事假扣款",
                    "index":25,
                    "isGrossField":false,
                    "value":"200"
                },
                {
                    "name":"病假\n天数",
                    "index":26,
                    "isGrossField":false,
                    "value":"2"
                },
                {
                    "name":"病假扣款",
                    "index":27,
                    "isGrossField":false,
                    "value":"200"
                },
                {
                    "name":"小计",
                    "index":28,
                    "isGrossField":false,
                    "value":"400"
                }
            ]
        },
        {
            "name":"应发合计",
            "index":29,
            "isGrossField":false,
            "value":"50000"
        },
        {
            "name":"07月社保、06月医疗及07月公积金扣款",
            "isGrossField":true,
            "child":[
                {
                    "name":"月养老保险",
                    "index":30,
                    "isGrossField":false,
                    "value":"600"
                },
                {
                    "name":"月医疗保险",
                    "index":31,
                    "isGrossField":false,
                    "value":"700"
                },
                {
                    "name":"月大额补充",
                    "index":32,
                    "isGrossField":false,
                    "value":"800"
                },
                {
                    "name":"月失业保险",
                    "index":33,
                    "isGrossField":false,
                    "value":"900"
                },
                {
                    "name":"社保补缴养老",
                    "index":34,
                    "isGrossField":false,
                    "value":"1000"
                },
                {
                    "name":"社保补缴大额",
                    "index":35,
                    "isGrossField":false,
                    "value":"110"
                },
                {
                    "name":"社保补缴\n医疗",
                    "index":36,
                    "isGrossField":false,
                    "value":"120"
                },
                {
                    "name":"公积金",
                    "index":37,
                    "isGrossField":false,
                    "value":"130"
                }
            ]
        },
        {
            "name":"社保公积当月合计",
            "index":38,
            "isGrossField":false,
            "value":"140"
        },
        {
            "name":"六项附加当月",
            "index":39,
            "isGrossField":false,
            "value":"150"
        },
        {
            "name":"个税",
            "index":40,
            "isGrossField":false,
            "value":"160"
        },
        {
            "name":"补偿",
            "index":41,
            "isGrossField":false,
            "value":"1700"
        }
    ]
]