java对象自动映射到映射到Excel表

遇到一个需求是把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;

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值