遇到一个需求是把10万条征信数据映射到excel表中,按表分类。解决这个需求,想出了如下两种方法
方法一:先把json数据转成对象,再把对象中的字段和值写入到excel中,一个个get和一个个set,但是后来发现,一个json里面有几十张表,一张表里面包含几十个字段。如果按照这种方式写的话,需要写一个月,于是乎换成另外一种方法。
方法二:先把json数据转对java对象,然后利用反射获取对象中每一张表,再根据表中的每个字段和值动态的写入到excel表中。
jsonRootBean就是映射json数据的对象,里面包括了如下的表,这些表只是其中的一部分,总共有40多张这种。
好了,上代码
public static void main(String[] args) throws ClassNotFoundException, Exception, IllegalAccessException {
// 思路,1.先从数据中拿到数据,然后根据每一条数组做出映射,映射到rootBean当中.
// 2。根据反射拿到rootbean中的所有字段,然后根据这些字段建表。
// 3。赋值,拿到有值的rootbean,利用反射拿到rootbean中值,然后按照字段依次写在表中,然后输出流.
// 4.关闭流,OK
String s="这是征信数据";//征信数据很长
//integer map 是用来存放行数的,当有多条json时,需要保存上一条json存储完后的行数
HashMap<String, Integer> map = new HashMap<>();
//一个workbook,只能操作一个excel表
HashMap<String, HSSFWorkbook> workmap = new HashMap<>();
ArrayList<Map> arrayList = new ArrayList();
JsonRootBean bean = JSON.parseObject(s, JsonRootBean.class);
ArrayList<Map> setbeat = setbeat(bean, map,workmap,arrayList);
}
public static ArrayList<Map> setbeat(JsonRootBean bean, HashMap<String, Integer> hashMap,HashMap<String, HSSFWorkbook> workmap,ArrayList<Map> arrayList)
throws Exception {
// 获取成员变量
Field[] declaredFields = bean.getClass().getDeclaredFields();
for (int i = 0; i < declaredFields.length; i++) {
Field field = declaredFields[i];
field.setAccessible(true);
// 获取数组的类型
Class<?> type = field.getType();
int l = 0;
int n = 0;
if (List.class.isAssignableFrom(type)) {
// 如果是数组的处理方式
Type t = field.getGenericType();
if (t instanceof ParameterizedType) {
String name = field.getName();
HSSFWorkbook wk = workmap.get(name);
if(wk==null) {
wk=new HSSFWorkbook();
workmap.put(name, wk);
}
Integer integer = hashMap.get(name);
Sheet sh = null;
if(wk.getSheet(name)==null) {
sh = wk.createSheet(name);
}else {
sh=wk.getSheet(name);
}
if (integer == null) {
n = 1;
System.out.println("integer是空");
} else {
n = integer.intValue();
System.out.println("integer的intvalu" + n);
}
FileOutputStream fileName = new FileOutputStream("D:\\" + name + ".xls");
Row row = sh.createRow(0);
Method m = bean.getClass().getMethod("get" + name);
List invoke = (List) m.invoke(bean);
if(invoke==null) continue;
for (Object object : invoke) {
if(object==null) continue;
// System.out.println("object的值为"+JSON.toJSONString(object)+"类型为"+object.getClass().getName());
Row valueRow = sh.createRow(n);
Field[] declaredFields2 = object.getClass().getDeclaredFields();
int p = 0;// 用来标志列数,
for (int j = 0; j < declaredFields2.length; j++) {
Field field2 = declaredFields2[j];
field2.setAccessible(true);
String name2 = field2.getName();
Method m1 = object.getClass().getMethod("get" + name2);
String val = (String) m1.invoke(object);
if (p < declaredFields2.length) {
row.createCell(p).setCellValue(name2);
}
valueRow.createCell(p).setCellValue(val);
p++;
// System.out.println("得到的数组的属性名字为" + name2 + "---数组的值为" + val);
}
n++;
hashMap.put(name, Integer.valueOf(n));
}
wk.write(fileName);
wk.close();
}
} else {
//非数组的处理方式
String name = field.getName();
HSSFWorkbook wk = workmap.get(name);
if(wk==null) {
wk=new HSSFWorkbook();
workmap.put(name, wk);
}
Integer integer = hashMap.get(name);
if (integer == null) {
l = 1;
} else {
l = integer.intValue();
}
FileOutputStream fileName = new FileOutputStream("D:\\" + name + ".xls");
System.out.println("一个个的filename看看是多少" + name + "没错就是QyZxbgA1");
Sheet sh = null;
if(wk.getSheet(name)==null) {
sh = wk.createSheet(name);
}else {
sh=wk.getSheet(name);
}
Row row = sh.createRow(0);
Row valueRow = sh.createRow(l);
Method m = bean.getClass().getMethod("get" + name);
Object invoke = m.invoke(bean);
Field[] declaredFields2 = invoke.getClass().getDeclaredFields();
int p = 0;// 用来标志列数,
for (int d = 0; d < declaredFields2.length; d++) {
Field field2 = declaredFields2[d];
field2.setAccessible(true);
String name2 = field2.getName();
Method m1 = invoke.getClass().getMethod("get" + name2);
String val = (String) m1.invoke(invoke);
System.out.println("得到的属性名字为" + name2 + "---值为" + val);
row.createCell(p).setCellValue(name2);
valueRow.createCell(p).setCellValue(val);
p++;
}
l++;
hashMap.put(name, Integer.valueOf(l));
wk.write(fileName);
wk.close();
}
}
arrayList.add(workmap);//excelmap
arrayList.add(hashMap);//integermap
return arrayList;
}