为了整理用户数据,做出分析,我将excle表转换成json,再转换称yml,主要采用了jxl工具包
技术的确定
初步定于以java实现
参考:https://blog.csdn.net/qq_27993003/article/details/52488403
具体实现
1.导入依赖包,前提配置好maven
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.7</version>
</dependency>
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.10</version>
</dependency>
</dependencies>
2 、 编写代码
1.建立一个工具
2.创建文件对象
Workbook workbook;//这个代表打开了几个文件,第几个文件
//这里只支持.xls,获取一个文件
workbook = Workbook.getWorkbook(new File( "C:\\Users\\HuangZhihang\\Desktop\\123.xls"));
workbook.getNumberOfSheets()//得到一个文件中有几个表,注意输出的是确确实实的个数
3.创建表的对象Sheet sheet;
- 可以输出表的名字
System.out.println(sheet.getName());
sheet.getRows()//一个表中记录数,即行数
sheet.getColumns()//记录一个表的列数
4.创建单元控制对象
Cell cell; //单个控制单元
cell = sheet.getCell(j , i);//得到单元格 j代表行,q代表列
String title = cellTitle.getContents();//得到相关的数据
cell.getType();//得到类型,返回值,是一个CellType
//可以用
cell.getType().toString()与字符串比较做出判断
5.json对象的相关命令
//创建json对象
JSONArray jsons = new JSONArray();
//将对象加入
jsons.add(object);
JSONObject object = new JSONObject(new LinkedHashMap());//创建json里的每个对象
object.put(title, -1);//往里边放每一行的数据
对表格的数据进行处理
遇到的问题 饮酒类型
饮酒在系统中是单选,在数据中出现了白酒啤酒两个选择,我将其改为了4
采用表格中的提取数组功能,去掉年月日
解决在json每一个行中的加入注释问题
想做到这个情况
{
name:测试,//这是注释
}
思路中只能提供,把注释当对象加入在后边的value中,然后在编译完成,以后用text中的替换功能进行替换
json转为yml以后出现引号的问题
单纯在json下看不出来
因为属性中有连字符默认或者是/当成字符串进行处理了,删除数据中的连字符
解决JSONObject 新建对象以后,使用object.put,放进去的数据与想要保持的顺序不一样
例如,只是哥例子
object.put(“a”,1);
object.put(“c”,2);
实际转换输出的json是c在前,a在后
JSONObject object = new JSONObject();
此时存储以Hashmap,进行存储,根据key关键字进行排序
JSONObject object = new JSONObject(new LinkedHashMap());
整体代码
只需要更改输入地址,跟输出地址的绝对路径就可以使用,一定在pom里导入上边maven的包
public class ExcleToJsonUntils {
public static void main(String[] args) {
Workbook workbook= null;
Sheet sheet = null;
//sheettall,代表总页数
int sheettall;
//cell:表示普通单元格
Cell cell= null;
//cellTitle:表示第一行数据
Cell cellTitle= null;
//表示备注单元格
Cell cellRemark= null;
//rows:代表行,column代表列,rows是总行数,从0开始,由于第一行
int rows=0;
int column=0;
//创建json对象
JSONArray jsons = new JSONArray();
try {
//获取一个Excel文件 只支持.xls格式
workbook = Workbook.getWorkbook(new File( "C:\\Users\\HuangZhihang\\Desktop\\test.xls"));
//获取文件里的全部表的总数量,这里可以用于外循环,由于我的项目中只有一页,所以不用别的
sheettall=workbook.getNumberOfSheets();
//可以理解为得到一个数组对象对象,
for (int i = 0; i < 1; i++) {
sheet = workbook.getSheet(i);
rows= sheet.getRows();
column= sheet.getColumns();
for(int q = 2; 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);
cellRemark = sheet.getCell(j , 1);
//每次循环得到标题
String title = cellTitle.getContents();
// System.out.println("该单元格类型"+cell.getType());
//每次循环得到备注
String remarks=cellRemark.getContents();
String content=cell.getContents();
//判断是否是叠加加1的关键字,如果不为空就执行分割,如果为空就填入-1
if(j==42||j==44){
if (!cell.getType().toString().equals("Empty")){
int total = DataSparate.iscount(content);
object.put(title, total);
continue;
}else{
object.put(title, -1);
}
}
//根据单元格内容不同,加入不同的格式,避免出现全是字符串
switch (cell.getType().toString()){
case "Label":
object.put(title, content);
break;
case "Number":
Double number=new Double(cell.getContents());
object.put(title, number);
break;
case "Empty":
object.put(title,-1);
break;
default:
String scontent=cell.getContents();
object.put(title, scontent);
}
//得到对应的单元格
}
jsons.add(object);
}
}
//对队列进行输出或者其他操作
System.out.println(jsons.toJSONString());
createJsonFile(jsons,"C:\\Users\\HuangZhihang\\Desktop\\ceshi.json");
workbook.close();
} catch (BiffException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//实现文件输出的静态方法,参数值分别为,地址与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;
}
}
数组切割
package com.xiucai.untils;
import org.junit.Test;
/**
* 数据分割
*/
public class DataSparate {
public static void main(String[] args) {
iscount("");
}
//计算传入数据,分割以后有几部分
public static int iscount (String data){
String[] strArr =data.split("、");
System.out.println(strArr.length);
return strArr.length;
}
}