美文网首页
JAVA导出表格模板,利用反射条件自动填充List列表

JAVA导出表格模板,利用反射条件自动填充List列表

作者: IT男的假智慧 | 来源:发表于2021-03-30 09:18 被阅读0次

    /**

    *

    * @param response 请求流

    * @param headers 列表头

    * @param dataset list列表

    * @param fileName 导出名称

    * @param <T>

    * @throws IOException

    */

    public static <T> void exportExcel(HttpServletResponse response,String[] headers, List<T> dataset,String fileName) throws IOException{

        // 声明一个工作薄

        HSSFWorkbook workbook =new HSSFWorkbook();

        // 生成一个表格

        HSSFSheet sheet = workbook.createSheet();

        // 设置表格默认列宽度为15个字节

        sheet.setDefaultColumnWidth((short) 15);

        // 声明一个画图的顶级管理器

        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();

        // 定义注释的大小和位置,详见文档

        HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 4, 2, (short) 6, 5));

        // 设置注释内容

        comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));

        // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.

        comment.setAuthor("leno");

        // 产生表格标题行

        HSSFRow row = sheet.createRow(0);

        for (short i =0; i < headers.length; i++) {

            HSSFCell cell = row.createCell(i);

            HSSFRichTextString text =new HSSFRichTextString(headers[i]);

            cell.setCellValue(text);

        }

        // 遍历集合数据,产生数据行

        Iterator<T> it = dataset.iterator();

        int index =0;

        while (it.hasNext()) {

            index++;

            row = sheet.createRow(index);

            T t =(T) it.next();

            // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值

            Field[] fields = t.getClass().getDeclaredFields();

            for (short i =0; i < fields.length; i++) {

                HSSFCell cell = row.createCell(i);

                Field field = fields[i];

                String fieldName = field.getName();

                String getMethodName ="get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);

                try {

                    //Class  tCls = t.getClass();//原有的

                    Class<?>  tCls = t.getClass();

                    Method getMethod = tCls.getMethod(getMethodName);

                    Object value = getMethod.invoke(t);

                    // 判断值的类型后进行强制类型转换

                    String textValue =null;

                    if (valueinstanceof Integer) {

                        int intValue =(Integer) value;

                        cell.setCellValue(intValue);

                    }

                    if (valueinstanceof Float) {

                        float fValue =(Float) value;

                        textValue =new String(String.valueOf(fValue));

                        cell.setCellValue(textValue);

                    }

                    if (valueinstanceof Double) {

                        double dValue =(Double) value;

                        textValue =new String(String.valueOf(dValue));

                        cell.setCellValue(textValue);

                    }

                    if (valueinstanceof Long) {

                        long longValue =(Long) value;

                        cell.setCellValue(longValue);

                    }

                    if (valueinstanceof Boolean) {

                        boolean bValue =(Boolean) value;

                        textValue ="男";

                        if (!bValue) {

                            textValue ="女";

                        }

                    } else if (valueinstanceof Date) {

                        Date date =(Date) value;

                        SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");

                        textValue = sdf.format(date);

                    } else if (valueinstanceof byte[]) {

                        // 有图片时,设置行高为60px;buffer

                        row.setHeightInPoints(60);

                        // 设置图片所在列宽度为80px,注意这里单位的一个换算

                        sheet.setColumnWidth(i, (short) (35.7 *80));

                        // sheet.autoSizeColumn(i);

                        byte[] bsValue =(byte[]) value;

                        HSSFClientAnchor anchor =new HSSFClientAnchor(0, 0, 1023, 255, (short) 6, index, (short) 6,

                                index);

                        anchor.setAnchorType(2);

                        patriarch.createPicture(anchor, workbook.addPicture(bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));

                    } else {

                        // 其它数据类型都当作字符串简单处理

                        textValue = value ==null || value =="" ?"" : value.toString();

                    }

                    // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成

                    if (textValue !=null) {

                        Pattern p = Pattern.compile("^//d+(//.//d+)?$");

                        Matcher matcher = p.matcher(textValue);

                        if (matcher.matches()) {

                            // 是数字当作double处理

                            cell.setCellValue(Double.parseDouble(textValue));

                        } else {

                            HSSFRichTextString richString =new HSSFRichTextString(textValue);

                            HSSFFont font3 = workbook.createFont();

                            font3.setColor(HSSFColor.BLUE.index);

                            richString.applyFont(font3);

                            cell.setCellValue(richString);

                        }

    }

                } catch (SecurityException | NoSuchMethodException | IllegalArgumentException | IllegalAccessException | InvocationTargetException e) {

                    e.printStackTrace();

                }

    }

    }

        ByteArrayOutputStream os =new ByteArrayOutputStream();

        workbook.write(os);

        byte[] content = os.toByteArray();

        InputStream is =new ByteArrayInputStream(content);

        response.reset();

        response.setContentType("application/vnd.ms-excel;charset=utf-8");

        response.setHeader("Content-Disposition", "attachment;filename=" +new String((fileName +".xls").getBytes(), "iso-8859-1"));

        ServletOutputStream out = response.getOutputStream();

        BufferedInputStream bis =null;

        BufferedOutputStream bos =null;

        try {

            bis =new BufferedInputStream(is);

            bos =new BufferedOutputStream(out);

            byte[] buff =new byte[2048];

            int bytesRead;

            while (-1 !=(bytesRead = bis.read(buff, 0, buff.length))) {

                bos.write(buff, 0, bytesRead);

            }

            bos.flush();  //不可少

            response.flushBuffer();//不可少

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            //关闭流,不可少

            if (bis !=null) {

                bis.close();

            }

            if (bos !=null) {

                bos.close();

            }

    }

    }

    相关文章

      网友评论

          本文标题:JAVA导出表格模板,利用反射条件自动填充List列表

          本文链接:https://www.haomeiwen.com/subject/lnswhltx.html