基于Java实现Json文件转换为Excel文件
作者:菜鸟小于 发布时间:2022-08-04 23:53:15
标签:Java,Json,Excel
一. 思路
今天接到个小任务,让把json文件转换成excel文件,按照列展开.
思路:既然json已经都已经是现成的,那直接将json文件做读操作,在通过不同的key,找到对应的信息,在存到单元格中,在写操作,生成excel文档
二.jar包
涉及到的jar包,阿里的fastjson和poi的jar包
三.代码
我的json文档里数据的格式是这样的
[
{
"total": 1,
"name": "规则限制:XXXX",
"timeStr": 1619242800000,
"message": "XXX",
"hehe": ""
},
{
"total": 2,
"name": "服务异常:XXXX",
"timeStr": 1619240400000,
"message": "XXX!",
"hehe": ""
}
]
1.先对json文件进行读操作,提取String对象,在将String对象转换为JsonArray
public static String readJsonFile(String path) {
String jsonString = "";
try {
File file = new File(path);
FileReader fileReader = new FileReader(file);
Reader reader = new InputStreamReader(new FileInputStream(file),"utf-8");
int ch = 0;
StringBuffer sb = new StringBuffer();
while ((ch = reader.read()) != -1) {
sb.append((char) ch);
}
fileReader.close();
reader.close();
jsonString = sb.toString();
return jsonString;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
我试过直接读文件,出现中文乱码,所以记得用UTF-8编码,否则会是乱码
2.文件内容以String的形式获取到,这时创建excel文件,在将String转换为jsonArray形式遍历,分别插入到excel文件的单元格cell中,在做写操作
public static void main(String[] args) {
String json = ToJson.readJsonFile("C:\\Users\\yu\\Desktop\\new.json");
//System.out.println(json);
//JSONObject object = JSON.parseObject(json);
try {
//生成excel文件存放的地址
String uploadFile = "D:/test.xlsx";
OutputStream excel = new FileOutputStream(uploadFile);
XSSFWorkbook workBook = new XSSFWorkbook();
XSSFSheet sheet = workBook.createSheet();
XSSFRow row = null;//行
XSSFCell cell = null;//单元格
row = sheet.createRow(0);
//这是创建excel上边的标题头
String[] names = { "total", "异常", "页面名称", "信息","时间","工号"};
for (int index = 0; index < 5; index++) {
cell = row.createCell(index);
cell.setCellValue(names[index]);
}
int count = 1;
JSONArray dataArray = JSONArray.parseArray(json);
for(int i = 0; i < dataArray.size();i++){
JSONObject dataObj = dataArray.getJSONObject(i);
//获取不同key中的值
String total = dataObj.getString("total");
String name = dataObj.getString("name");
String[] nameArray = name.split(":");//这个是通过分号获得两个值,分别写在excel中
String name1 = nameArray[0];
String name2 = nameArray[1];
String timeStr = dataObj.getString("timeStr");
String time = ToJson.stampToTime(timeStr);//这个根据时间戳转换为正常年月日,时分秒
String message = dataObj.getString("message");
String staffId = dataObj.getString("hehe");
row = sheet.createRow(count);
cell = row.createCell(0);
cell.setCellValue(total);
cell = row.createCell(1);
cell.setCellValue(name1);
cell = row.createCell(2);
cell.setCellValue(name2);
cell = row.createCell(3);
cell.setCellValue(message);
cell = row.createCell(4);
cell.setCellValue(time);
cell = row.createCell(5);
cell.setCellValue(staffId);
count++;
}
workBook.write(excel);
} catch (Exception e) {
e.printStackTrace();
}
}
时间戳的转换方法:
public static String stampToTime(String stamp) {
String sd = "";
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sd = sdf.format(new Date(Long.parseLong(stamp))); // 时间戳转换日期
return sd;
}
运行即可获得excel文件
全部代码:
package com.china.excelToJson;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ToJson {
public static void main(String[] args) {
String json = ToJson.readJsonFile("C:\\Users\\yu\\Desktop\\new.json");
//System.out.println(json);
//JSONObject object = JSON.parseObject(json);
try {
//生成excel文件存放的地址
String uploadFile = "D:/test.xlsx";
OutputStream excel = new FileOutputStream(uploadFile);
XSSFWorkbook workBook = new XSSFWorkbook();
XSSFSheet sheet = workBook.createSheet();
XSSFRow row = null;//行
XSSFCell cell = null;//单元格
row = sheet.createRow(0);
//这是创建excel上边的标题头
String[] names = { "total", "异常", "页面名称", "信息","时间","工号"};
for (int index = 0; index < 5; index++) {
cell = row.createCell(index);
cell.setCellValue(names[index]);
}
int count = 1;
JSONArray dataArray = JSONArray.parseArray(json);
for(int i = 0; i < dataArray.size();i++){
JSONObject dataObj = dataArray.getJSONObject(i);
//获取不同key中的值
String total = dataObj.getString("total");
String name = dataObj.getString("name");
String[] nameArray = name.split(":");//这个是通过分号获得两个值,分别写在excel中
String name1 = nameArray[0];
String name2 = nameArray[1];
String timeStr = dataObj.getString("timeStr");
String time = ToJson.stampToTime(timeStr);//这个根据时间戳转换为正常年月日,时分秒
String message = dataObj.getString("message");
String staffId = dataObj.getString("hehe");
row = sheet.createRow(count);
cell = row.createCell(0);
cell.setCellValue(total);
cell = row.createCell(1);
cell.setCellValue(name1);
cell = row.createCell(2);
cell.setCellValue(name2);
cell = row.createCell(3);
cell.setCellValue(message);
cell = row.createCell(4);
cell.setCellValue(time);
cell = row.createCell(5);
cell.setCellValue(staffId);
count++;
}
workBook.write(excel);
} catch (Exception e) {
e.printStackTrace();
}
}
public static String stampToTime(String stamp) {
String sd = "";
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sd = sdf.format(new Date(Long.parseLong(stamp))); // 时间戳转换日期
return sd;
}
public static String readJsonFile(String fileName) {
String jsonStr = "";
try {
File jsonFile = new File(fileName);
FileReader fileReader = new FileReader(jsonFile);
Reader reader = new InputStreamReader(new FileInputStream(jsonFile),"utf-8");
int ch = 0;
StringBuffer sb = new StringBuffer();
while ((ch = reader.read()) != -1) {
sb.append((char) ch);
}
fileReader.close();
reader.close();
jsonStr = sb.toString();
return jsonStr;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
来源:https://www.cnblogs.com/Young111/p/14702241.html
0
投稿
猜你喜欢
- 初学线程时,总是将 run 方法和 start 方法搞混,虽然二者是完全不同的两个方法,但刚开始使用时很难分清,原因就是因为初次使用时效果貌
- 我们在学习接口的时候。能够在里面做一些方法的调用。不过今天所要讲的JDBC,虽然也是连接数据库的一种接口,不过与类接口有着很大的区别,大家要
- 委托定义类型,类型指定特定方法签名。可将满足此签名的方法(静态或实例)分配给该类型的变量,然后(使用适当参数)直接调用该方法,或将其作为参数
- 高快省的排序算法有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。假设我们现在对“6 1
- DataSource在数据库应用中,客户端与数据库服务端建立的连接对象(Connection)是宝贵的资源,每次请求数据库都创建连接,使用完
- 一、百度百科Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防
- Sequence序列Sequence 是Kotlin标准库提供的一种容器类型。它和Iterable一样具备对集合进行多步骤操作能力,但是却是
- analyzer的使用规则查询只能查找倒排索引表中真实存在的项, 所以保证文档在索引时与查询字符串在搜索时应用相同的分析过程非常重要,这样查
- 前言悬浮窗是一种比较常见的需求。例如把视频通话界面缩小成一个悬浮窗,然后用户可以在其他界面上处理事情。本文给出一个简单的应用内悬浮窗实现。可
- Spring中有个RestTemplate类用来发送HTTP请求很方便,本文分享一个SpringBoot发送POST请求并接收返回数据的例子
- 数据结构是数据存储的方式,算法是数据计算的方式。所以在开发中,算法和数据结构息息相关。今天的讲义中会涉及部分数据结构的专业名词,如果各位铁粉
- 删除本地仓库未下载完成的缓存文件(删除像图片显示这样以.lastUpdated结尾的文件)执行mvn -v确保maven命令可以正常执行执行
- Mybatis typeAlias配置1.定义别名<typeAliases> <ty
- 一、基本特点1. 开始时是乐观锁, 如果锁冲突频繁, 就转换为悲观锁.2. 开始是轻量级锁实现, 如果锁被持有的时间较长, 就转换成重量级锁
- 之前文章中我们讲到,java中实现同步的方式是使用synchronized block。在java 5中,Locks被引入了,来提供更加灵活
- 问题项目是springcloud项目,在maven install某一个项目时报错:程序包com.example.commons.appli
- 1、单点登录三种常见的方式(1)Session广播机制(Session复制)(2)使用Cookie+Redis实现(3)使用token实现2
- Java连接SQL Server数据库的详细操作流程一.明确JDK版本和下载驱动1.1 JDK版本查看win + r输入cmd,命令窗口输入
- 1、静态代码块①、格式在java类中(方法中不能存在静态代码块)使用static关键字和{}声明的代码块:public class Code
- pom.xml配置<dependency> <groupId>org.springframework.