遇到一个需求是把10万条征信数据映射到excel表中,按表分类。解决这个需求,想出了如下两种方法

方法一:先把json数据转成对象,再把对象中的字段和值写入到excel中,一个个get和一个个set,但是后来发现,一个json里面有几十张表,一张表里面包含几十个字段。如果按照这种方式写的话,需要写一个月,于是乎换成另外一种方法。

方法二:先把json数据转对java对象,然后利用反射获取对象中每一张表,再根据表中的每个字段和值动态的写入到excel表中。

java excel 列 Javaexcel列和对象属性映射_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;    }