需求介绍
为了处理数据,我对之前之前处理普遍的数据java脚本,做了一个更改,之前的程序主要还是对表格的数据进行替换,需要耗费一定的时间整理表格,进行一些数字的替换。
具体链接在这里(对excle直接生成json):https://blog.csdn.net/xiucai5211314/article/details/123917264
为了在大量关键字,例如 姓名,年龄,性别,…等一百个关键字中找出50个并且对于单元格中关键字进行替换为数值,如 男:0 女:1 是:1 否:0,之前我都用以上的程序在excle表中进行替换,单元格中的内容替换并不难,关键难得是,从众多关键字中找出五十列.
上边描述了这么多,那主要说下需求, 将excle中得数据表,按照一定数据字典,进行输出json数据
即按照以下数据字典
从以下带有多个列得表中
得到如下对应关系得json
细分代码功能
1.得到数据字典的数据
//尝试思路
//将数据字典表的所有值都加入到一个数组中
//将每一行都存储为一个map集合
/*
* map中的第一个元素的key值,作为判断这一列,其中的value值为json的属性名
* 然后的属性每个单元格去比较,如果在遍历过程中单元格的内容等于就取出其中的值来
* 存在一些原有的数字,在数据字典中写上文本或者数字
*/
建立数组:用于存储数据字典每一行的内容,
MAP_ARR_MAX:代表有几个属性值,这个值是必须要改的
![image-20220427202340794](https://gitee.com/huang-zhihang/csdn/raw/master/img/image-20220427202340794.png)
得到表对象,以及行列,单元格
//得到具体的表的对象
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放在数组中
这一部分代码
/**
* 得到数据字典的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
/**
* 得到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();
}
}
}
/**
*
*/