为了整理用户数据,做出分析,我将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; } }
复制