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

2021-03-30  本文已影响0人  IT男的假智慧

/**

*

* @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();

        }

}

}

上一篇下一篇

猜你喜欢

热点阅读