根据数据字典,将excle中的数据转换成json,删除excle中的列,将excle中的数据做替换

需求介绍

为了处理数据,我对之前之前处理普遍的数据java脚本,做了一个更改,之前的程序主要还是对表格的数据进行替换,需要耗费一定的时间整理表格,进行一些数字的替换。

具体链接在这里(对excle直接生成json):https://blog.csdn.net/xiucai5211314/article/details/123917264

为了在大量关键字,例如 姓名,年龄,性别,…等一百个关键字中找出50个并且对于单元格中关键字进行替换为数值,如 男:0 女:1 是:1 否:0,之前我都用以上的程序在excle表中进行替换,单元格中的内容替换并不难,关键难得是,从众多关键字中找出五十列.

上边描述了这么多,那主要说下需求, 将excle中得数据表,按照一定数据字典,进行输出json数据

即按照以下数据字典

image-20220427200717251

从以下带有多个列得表中

image-20220427200921266

得到如下对应关系得json

image-20220427201002126

细分代码功能

1.得到数据字典的数据

//尝试思路
//将数据字典表的所有值都加入到一个数组中
//将每一行都存储为一个map集合
/*
 * map中的第一个元素的key值,作为判断这一列,其中的value值为json的属性名
 * 然后的属性每个单元格去比较,如果在遍历过程中单元格的内容等于就取出其中的值来
 * 存在一些原有的数字,在数据字典中写上文本或者数字
 */

建立数组:用于存储数据字典每一行的内容,

MAP_ARR_MAX:代表有几个属性值,这个值是必须要改的
image-20220427202340794

得到表对象,以及行列,单元格

//得到具体的表的对象
workbook = Workbook.getWorkbook(new File(dataDictionaryPath));

//由于只有一页sheet即属性值,就不做循环直接取到这一页
Sheet sheet = null;
sheet = workbook.getSheet(0);
//得到这个表中的记录数,有多少行
int rows = 0;
rows = sheet.getRows();
//得到表中的数据有多少列
int column = 0;
column = sheet.getColumns();

将单元格数据切分,并且放入map中,将每一行对应的map放在数组中

image-20220427202728978

image-20220427203945120

这一部分代码

    /**
     * 得到数据字典的map数组
     * @return
     */



    public  static  Object[] getMaps( String dataDictionaryPath) {
        //尝试思路2:将属性表的所有值都加入到一个map集合中,而且要有序,
        /** list中存储map
         * map中的第一个元素的key值,作为判断这一列,其中的value值为json的属性名
         * 然后的属性每个单元格去比较,如果在遍历过程中单元格的内容等于就取出其中的值来
         * 由于一些为数字,不等于就直接输出原有的数字
         */

        //  获取关键字文件  只支持.xls格式
        Workbook workbook = null;
        Object[] mapArr = new Object[0];
        try {
            //得到具体的表的对象
            workbook = Workbook.getWorkbook(new File(dataDictionaryPath));

            //由于只有一页sheet即属性值,就不做循环直接取到这一页
            Sheet sheet = null;
            sheet = workbook.getSheet(0);
            //得到这个表中的记录数,有多少行
            int rows = 0;
            rows = sheet.getRows();
            //得到表中的数据有多少列
            int column = 0;
            column = sheet.getColumns();

            //新建存储每一行的map
            mapArr = new Object[MAP_ARR_MAX];


            //从第二行开始往里边存储数据,每一行的对象试一个map,每一行存储在一个数组中
            for (int q = 1; q < rows; q++) {
                //每一行都是一个新建对象
                 Map rowMap = new LinkedHashMap();
//                因为只有两列所以循环两次就行
                for (int j = 0; j < 2; j++) {
                    //获取单元格 sheet.getCell(列,行);
                    Cell cell = null;
                    cell = sheet.getCell(j, q);
                    //得到单元格的内容
                    String contents = cell.getContents();
//                    当处于第一列的时候,只有"A:B"的属性值,不用判断有几个属性值

                    if (j == 0) {
                        String[] splitArr = DataSparate.getSplitArr(contents, ":");
                        rowMap.put(splitArr[0], splitArr[1]);
                    } else {
                        //当处于其他列的时候,现需要得到有几个"A:B"
                        String[] arr = DataSparate.getSplitArr(contents, ",");
                        //有几个属性值,往里边放几个Map
                        for (int i = 0; i < arr.length; i++) {
                            //将分割后的"A:b",再次进行分割
                            if (!contents.equals("数值")&& !contents.equals("文本")) {
                                String[] splitArr = DataSparate.getSplitArr(arr[i], ":");
                                rowMap.put(splitArr[0],Integer.parseInt(splitArr[1]) );
                            }

                        }


                    }
                    mapArr[q - 1] = rowMap;


                }
            }


           

            return mapArr;

        } catch (IOException e) {
            e.printStackTrace();

        } catch (BiffException e) {
            e.printStackTrace();
        }
        return mapArr;
    }

2 得到json

image-20220427205732572

image-20220427205841899

image-20220427205916447

    /**
     * 得到json
     */

    public  static void getJson(String inFileXlsPath,String outJsonPath,String dataDictionaryPath){

//        得到数据字典的map集合
        Object[] maps = getMaps(dataDictionaryPath);
        //获取一个Excel文件  只支持.xls格式
        Workbook workbook = null;
        //创建json对象
        JSONArray jsons = new JSONArray();
        Sheet sheet = null;
        //sheettall,代表总页数
        int sheettall;
        //rows:代表行,column代表列,rows是总行数,从0开始,由于第一行
        int rows = 0;
        int column = 0;

        Cell cell= null;
        //cellTitle:表示第一行数据
        Cell cellTitle= null;
        //表示备注单元格
        Cell cellRemark= null;
        //先得到要处理的xls表格

        try {
            workbook = Workbook.getWorkbook(new File(inFileXlsPath));

            //代表执行第几页
            for (int i = 0; i < 1; i++) {
                sheet = workbook.getSheet(i);
                rows = sheet.getRows();
                column = sheet.getColumns();
                //从第二行开始便利
                for (int q = 1; q < rows; q++) {
                    JSONObject object = new JSONObject(new LinkedHashMap());
                    for(int j = 0; j < sheet.getColumns(); j++){
                        //sheet.getCell(列,行);
                        cell = sheet.getCell(j , q);
                        cellTitle = sheet.getCell(j , 0);
                        String  dataTitle=cellTitle.getContents();
                        String dataCell=cell.getContents();
                        //然后进行判断标题是否存在于我们的数据表单中,这里循环,应当看数据字典数组内有几个map
                        //有几个属性值:这个值等会需要考表格传上来我们暂时认为是2

                        for (int k = 0; k < MAP_ARR_MAX; k++) {

                            //取maps中的相关数据,得到每一行的
                            Map map= (Map) maps[k];
                            Set set =map.entrySet();
                            Iterator iterator=set.iterator();
                            Map.Entry titleMap= (Map.Entry) iterator.next();
                            //得到数据字典中的属性名
                            String title= (String) titleMap.getKey();
                            //得到数据字典中的属性的英文名
                            String englishTitle= (String) titleMap.getValue();
                            System.out.println(title);


                            //如果数据的标题等于传回来的map数组,的每一行的第一个key,那就将其value加入json,
                            // 然后去便利这一行map中之后的内容
                            if (!dataTitle.equals(title)){
                                continue;
                            }






                            //如果后边有属性值,才执行这些东西
                            if (iterator.hasNext()){

                                Map.Entry contentMap= (Map.Entry) iterator.next();
                                //如果往下的单元格的值不等于map里边某个key的值,那就往下一直循环
                                while(!dataCell.equals(contentMap.getKey())){
                                    //不相等就往下走
                                    if (iterator.hasNext()){
                                        contentMap= (Map.Entry) iterator.next();
                                    }else{
                                        break;
                                    }


                                }
                                //得到数据字典中替换的值
                                int content= (int) contentMap.getValue();
                                //相等了就往json数组里送
                                switch (cell.getType().toString()){
                                    case "Label":

                                        object.put(englishTitle, content);
                                        break;
                                    case  "Number":

                                        Double number=new Double(cell.getContents());
                                        //  System.out.println("观察cell.getContents():"+cellTitle.getContents());
//                                object.put(title, "替换前"+number+"替换"+remarks);
                                        object.put(englishTitle, number);
                                        break;
                                    case "Empty":
                                        //  System.out.println("这是一个空数据");
                                        object.put(englishTitle,"NaN");

                                        break;
                                    default:
                                        String scontent=cell.getContents();
                                        // System.out.println("观察cell.getContents():"+cellTitle.getContents());
//                                object.put(title, scontent+"替换"+remarks);
                                        object.put(englishTitle, scontent);
                                }
                            }else{  //如果后边没有属性值
                                //相等了就往json数组里送
                                switch (cell.getType().toString()){
                                    case "Label":

                                        object.put(englishTitle, cell.getContents());
                                        break;
                                    case  "Number":

                                        Double number=new Double(cell.getContents());
                                        //  System.out.println("观察cell.getContents():"+cellTitle.getContents());
//                                object.put(title, "替换前"+number+"替换"+remarks);
                                        object.put(englishTitle, number);
                                        break;
                                    case "Empty":
                                        //  System.out.println("这是一个空数据");
                                        object.put(englishTitle,"NaN");

                                        break;
                                    default:
                                        String scontent=cell.getContents();
                                        // System.out.println("观察cell.getContents():"+cellTitle.getContents());
//                                object.put(title, scontent+"替换"+remarks);
                                        object.put(englishTitle, scontent);
                                }



                            }















                        }

                    }

                    jsons.add(object);


                }



            }
            System.out.println(jsons);
            createJsonFile(jsons,outJsonPath);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (BiffException e) {
            e.printStackTrace();
        }

    }

3.数组截切代码

//symbol代表切割的字符
public static String[] getSplitArr (String data,String symbol){

    String[] strArr =data.split(symbol);

    return strArr;
}

4.数组写出json代码

public static boolean createJsonFile(Object jsonData, String filePath) {
    String content = JSON.toJSONString(jsonData, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue,
            SerializerFeature.WriteDateUseDateFormat);
    // 标记文件生成是否成功
    boolean flag = true;
    // 生成json格式文件
    try {
        // 保证创建一个新文件
        File file = new File(filePath);
        if (!file.getParentFile().exists()) { // 如果父目录不存在,创建父目录
            file.getParentFile().mkdirs();
        }
        if (file.exists()) { // 如果已存在,删除旧文件
            file.delete();
        }
        file.createNewFile();
        // 将格式化后的字符串写入文件
        Writer write = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
        write.write(content);
        write.flush();
        write.close();
    } catch (Exception e) {
        flag = false;
        e.printStackTrace();
    }
    return flag;
}

整体代码

git地址:https://gitee.com/huang-zhihang/untils.git

如果直接复制其中需要一如上边写的数组切割代码与写出json代码

package com.xiucai.untils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

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

import static com.xiucai.untils.ExcleToJsonUntils.createJsonFile;

/**
 * 需要数据字典,对数据处理转换称对应的内容
 * 
 */
public class AutoExcleToJsonUntils {

    /**
     * 这里需要修改:数据字典中几个属性
     */
    private final static int MAP_ARR_MAX = 4;

    public static void main(String[] args) {

        String inFileXlsPath = "C:\\Users\\HuangZhihang\\Desktop\\testage.xls";
        String outJsonPath = "C:\\Users\\HuangZhihang\\Desktop\\测试.json";
        String dataDictionaryPath = "C:\\\\Users\\\\HuangZhihang\\\\Desktop\\\\select测试数据.xls";
        getJson(inFileXlsPath, outJsonPath, dataDictionaryPath);


    }

    /**
     * 得到数据字典的map数组
     *
     * @return
     */


    public static Object[] getMaps(String dataDictionaryPath) {
        //尝试思路2:将属性表的所有值都加入到一个map集合中,而且要有序,
        /** list中存储map
         * map中的第一个元素的key值,作为判断这一列,其中的value值为json的属性名
         * 然后的属性每个单元格去比较,如果在遍历过程中单元格的内容等于就取出其中的值来
         * 由于一些为数字,不等于就直接输出原有的数字
         */

        //  获取关键字文件  只支持.xls格式
        Workbook workbook = null;
        Object[] mapArr = new Object[0];
        try {
            //得到具体的表的对象
            workbook = Workbook.getWorkbook(new File(dataDictionaryPath));

            //由于只有一页sheet即属性值,就不做循环直接取到这一页
            Sheet sheet = null;
            sheet = workbook.getSheet(0);
            //得到这个表中的记录数,有多少行
            int rows = 0;
            rows = sheet.getRows();
            //得到表中的数据有多少列
            int column = 0;
            column = sheet.getColumns();

            //新建存储每一行的map
            mapArr = new Object[MAP_ARR_MAX];


            //从第二行开始往里边存储数据,每一行的对象试一个map,每一行存储在一个数组中
            for (int q = 1; q < rows; q++) {
                //每一行都是一个新建对象
                Map rowMap = new LinkedHashMap();
//                因为只有两列所以循环两次就行
                for (int j = 0; j < 2; j++) {
                    //获取单元格 sheet.getCell(列,行);
                    Cell cell = null;
                    cell = sheet.getCell(j, q);
                    //得到单元格的内容
                    String contents = cell.getContents();
//                    当处于第一列的时候,只有"A:B"的属性值,不用判断有几个属性值

                    if (j == 0) {
                        String[] splitArr = DataSparate.getSplitArr(contents, ":");
                        rowMap.put(splitArr[0], splitArr[1]);
                    } else {
                        //当处于其他列的时候,现需要得到有几个"A:B"
                        String[] arr = DataSparate.getSplitArr(contents, ",");
                        //有几个属性值,往里边放几个Map
                        for (int i = 0; i < arr.length; i++) {
                            //将分割后的"A:b",再次进行分割
                            if (!contents.equals("数值") && !contents.equals("文本")) {
                                String[] splitArr = DataSparate.getSplitArr(arr[i], ":");
                                rowMap.put(splitArr[0], Integer.parseInt(splitArr[1]));
                            }

                        }


                    }
                    mapArr[q - 1] = rowMap;


                }
            }


            return mapArr;

        } catch (IOException e) {
            e.printStackTrace();

        } catch (BiffException e) {
            e.printStackTrace();
        }
        return mapArr;
    }

    /**
     * 得到json
     */

    public static void getJson(String inFileXlsPath, String outJsonPath, String dataDictionaryPath) {

//        得到数据字典的map集合
        Object[] maps = getMaps(dataDictionaryPath);
        //获取一个Excel文件  只支持.xls格式
        Workbook workbook = null;
        //创建json对象
        JSONArray jsons = new JSONArray();
        Sheet sheet = null;
        //sheettall,代表总页数
        int sheettall;
        //rows:代表行,column代表列,rows是总行数,从0开始,由于第一行
        int rows = 0;
        int column = 0;

        Cell cell = null;
        //cellTitle:表示第一行数据
        Cell cellTitle = null;
        //表示备注单元格
        Cell cellRemark = null;
        //先得到要处理的xls表格

        try {
            workbook = Workbook.getWorkbook(new File(inFileXlsPath));

            //代表执行第几页
            for (int i = 0; i < 1; i++) {
                sheet = workbook.getSheet(i);
                rows = sheet.getRows();
                column = sheet.getColumns();
                //从第二行开始便利
                for (int q = 1; q < rows; q++) {
                    JSONObject object = new JSONObject(new LinkedHashMap());
                    for (int j = 0; j < sheet.getColumns(); j++) {
                        //sheet.getCell(列,行);
                        cell = sheet.getCell(j, q);
                        cellTitle = sheet.getCell(j, 0);
                        String dataTitle = cellTitle.getContents();
                        String dataCell = cell.getContents();
                        //然后进行判断标题是否存在于我们的数据表单中,这里循环,应当看数据字典数组内有几个map
                        //有几个属性值:这个值等会需要考表格传上来我们暂时认为是2

                        for (int k = 0; k < MAP_ARR_MAX; k++) {

                            //取maps中的相关数据,得到每一行的
                            Map map = (Map) maps[k];
                            Set set = map.entrySet();
                            Iterator iterator = set.iterator();
                            Map.Entry titleMap = (Map.Entry) iterator.next();
                            //得到数据字典中的属性名
                            String title = (String) titleMap.getKey();
                            //得到数据字典中的属性的英文名
                            String englishTitle = (String) titleMap.getValue();
                            System.out.println(title);


                            //如果数据的标题等于传回来的map数组,的每一行的第一个key,那就将其value加入json,
                            // 然后去便利这一行map中之后的内容
                            if (!dataTitle.equals(title)) {
                                continue;
                            }


                            //如果后边有属性值,才执行这些东西
                            if (iterator.hasNext()) {

                                Map.Entry contentMap = (Map.Entry) iterator.next();
                                //如果往下的单元格的值不等于map里边某个key的值,那就往下一直循环
                                while (!dataCell.equals(contentMap.getKey())) {
                                    //不相等就往下走
                                    if (iterator.hasNext()) {
                                        contentMap = (Map.Entry) iterator.next();
                                    } else {
                                        break;
                                    }


                                }
                                //得到数据字典中替换的值
                                int content = (int) contentMap.getValue();
                                //相等了就往json数组里送
                                switch (cell.getType().toString()) {
                                    case "Label":

                                        object.put(englishTitle, content);
                                        break;
                                    case "Number":

                                        Double number = new Double(cell.getContents());
                                        //  System.out.println("观察cell.getContents():"+cellTitle.getContents());
//                                object.put(title, "替换前"+number+"替换"+remarks);
                                        object.put(englishTitle, number);
                                        break;
                                    case "Empty":
                                        //  System.out.println("这是一个空数据");
                                        object.put(englishTitle, "NaN");

                                        break;
                                    default:
                                        String scontent = cell.getContents();
                                        // System.out.println("观察cell.getContents():"+cellTitle.getContents());
//                                object.put(title, scontent+"替换"+remarks);
                                        object.put(englishTitle, scontent);
                                }
                            } else {  //如果后边没有属性值
                                //相等了就往json数组里送
                                switch (cell.getType().toString()) {
                                    case "Label":

                                        object.put(englishTitle, cell.getContents());
                                        break;
                                    case "Number":

                                        Double number = new Double(cell.getContents());
                                        //  System.out.println("观察cell.getContents():"+cellTitle.getContents());
//                                object.put(title, "替换前"+number+"替换"+remarks);
                                        object.put(englishTitle, number);
                                        break;
                                    case "Empty":
                                        //  System.out.println("这是一个空数据");
                                        object.put(englishTitle, "NaN");

                                        break;
                                    default:
                                        String scontent = cell.getContents();
                                        // System.out.println("观察cell.getContents():"+cellTitle.getContents());
//                                object.put(title, scontent+"替换"+remarks);
                                        object.put(englishTitle, scontent);
                                }


                            }


                        }

                    }

                    jsons.add(object);


                }


            }
            System.out.println(jsons);
            createJsonFile(jsons, outJsonPath);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (BiffException e) {
            e.printStackTrace();
        }

    }

}

/**
 *
 */
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秀才大大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值