通过反射excel导出,无论属性到少都可以,导出名可自定义

本文介绍如何原创性地利用Java反射和Apache POI库,创建一个不受属性数量限制的Excel导出功能,允许自定义列标题。

本文章都是自创,如有类同纯属巧合,转发的朋友请写我的文章链接

1.先写一个跟导出excel对应的字段的list

//list为头一个字母大写的属性名
private ArrayList<String> list = new ArrayList<String>(Arrays.asList(
            "Name","Sex","ShenGao","TiZhong","Dept"
    ));

2.导出的方法

@RequestMapping(value = "export",method = RequestMethod.GET)
    public void export(HttpServletRequest request, HttpServletResponse response) throws IOException, InvalidFormatException, ParseException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        String name= request.getParameter("name");
        User user= new user();
        if (StringUtils.isNotEmpty(name)) {
            user.setName(name);
        }
        List<User> users= userService.selectUserAll(name);//条件查询
        XSSFWorkbook excelbook = new XSSFWorkbook(); //创建workBook
        XSSFSheet excelSheet = excelbook.createSheet();//创建sheet表
        createExcelHeader(excelbook,excelSheet);
        XSSFCellStyle headerStyle = excelbook.createCellStyle();//设置 居中
        headerStyle.setAlignment(XSSFCellStyle.ALIGN_LEFT);

        for (int i = 0; i < users.size(); i++) {
            XSSFRow row = excelSheet.createRow(i+1);//创建行
            User user= Users.get(i);
            Field[] declaredFields = user.getClass().getDeclaredFields();
            Map<String,Integer> map = new HashMap();
            for (int i1 = 0; i1 < declaredFields.length; i1++) {
                Field declaredField = declaredFields[i1];
                // 获取属性的名字
                String name = declaredField.getName();
                // 将属性的首字符大写,方便构造get,set方法
                name = name.substring(0, 1).toUpperCase() + name.substring(1);
                map.put(name, i1);
            }

            for (int i1 = 0; i1 < list.size(); i1++) {
                String s = list.get(i1);
                XSSFCell cell = row.createCell(i1);
                cell.setCellStyle(headerStyle);
                Integer weiZhi = map.get(s);
                Field declaredField = declaredFields[weiZhi];
                /*可以通过下面的代码替代后面的代码,我使用的是后面的代码。不确定,但是应该能
	                Method m = glxxJGlsdAll.getClass().getMethod("get" + s);
	                // 调用getter方法获取属性值
	                Object value = m.invoke(glxxJGlsdAll);
	                if (value != null) {
	                    cell.setCellValue(value);
	                }
	             */
                // 获取属性的类型
                String type = declaredField.getGenericType().toString();
                if (type.equals("class java.lang.String")) {
                    Method m = glxxJGlsdAll.getClass().getMethod("get" + s);
                    // 调用getter方法获取属性值
                    String value = (String) m.invoke(glxxJGlsdAll);
                    if (value != null) {
                        cell.setCellValue(value);
                        continue;
                    } else {
                        continue;
                    }
                }
                if (type.equals("class java.lang.Integer")) {
                    Method m = glxxJGlsdAll.getClass().getMethod("get" + s);
                    Integer value = (Integer) m.invoke(glxxJGlsdAll);
                    if (value != null) {
                        cell.setCellValue(value);
                        continue;
                    } else {
                        continue;
                    }
                }
                if (type.equals("class java.lang.Short")) {
                    Method m = glxxJGlsdAll.getClass().getMethod("get" + s);
                    Short value = (Short) m.invoke(glxxJGlsdAll);
                    if (value != null) {
                        cell.setCellValue(value);
                        continue;
                    } else {
                        continue;
                    }
                }
                if (type.equals("class java.lang.Double")) {
                    Method m = glxxJGlsdAll.getClass().getMethod("get" + s);
                    Double value = (Double) m.invoke(glxxJGlsdAll);
                    if (value != null) {
                        cell.setCellValue(value);
                        continue;
                    } else {
                        continue;
                    }
                }
                if (type.equals("class java.lang.Boolean")) {
                    Method m = glxxJGlsdAll.getClass().getMethod("get" + s);
                    Boolean value = (Boolean) m.invoke(glxxJGlsdAll);
                    if (value != null) {
                        cell.setCellValue(value);
                        continue;
                    } else {
                        continue;
                    }
                }
                if (type.equals("class java.util.Date")) {
                    Method m = glxxJGlsdAll.getClass().getMethod("get" + s);
                    Date value = (Date) m.invoke(glxxJGlsdAll);
                    if (value != null) {
                        cell.setCellValue(value);
                        continue;
                    } else {
                        continue;
                    }
                }
            }
        }

        //将excel的数据写入文件
        ByteArrayOutputStream fos = null;
        byte[] retArr = null;
        try {
            fos = new ByteArrayOutputStream();
            excelbook.write(fos);
            retArr = fos.toByteArray();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        OutputStream os = response.getOutputStream();
        try {
            response.reset();
           /* response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setCharacterEncoding("UTF-8");*/
            //通过下面的设置可以让用户自定义导出文件名称
            response.setHeader("Content-Disposition", "attachment; filename="+ URLEncoder.encode("隧道信息.xlsx","UTF-8"));//要保存的文件名
            response.setContentType("application/octet-stream; charset=utf-8");
            /*response.setDateHeader("Expires",0);*/
            os.write(retArr);
            os.flush();
        } finally {
            if (os != null) {
                os.close();
            }
        }

    }

3.写标题的方法

void createExcelHeader(XSSFWorkbook workbook,XSSFSheet sheet) {
        XSSFRow excelRow = sheet.createRow(0);//创建行
        XSSFCellStyle headerStyle = workbook.createCellStyle();//设置 居中
        headerStyle.setAlignment(XSSFCellStyle.ALIGN_LEFT);
        //接下来是创建 列标题 ,cell的起始值是 0,可创建n个列标题
        ArrayList<String> list2 = new ArrayList<String>(Arrays.asList(
                "名字","性别","身高","体重","部门"));
        for (int i = 0; i < list2.size(); i++) {
            XSSFCell cell = excelRow.createCell(i);
            cell.setCellStyle(headerStyle);
            cell.setCellValue(list2.get(i));
        }
    }
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值