zoukankan      html  css  js  c++  java
  • 通过注解实现通用导出Excel

    Javaweb开发中数据的导入导出很常见,每次我们都需要写很多代码,所以我就在想能不能写一些通用的方法,之前已经在网上
    整理过一些通用的方法,最近在网上看到一位牛人封装的更加简介,自己拿过来整理了一下。

    配置注解

    • 之前我们了解了Java注解的使用,现在我们正是通过注解的方式来简化javaweb中繁琐的Excel上传和下载两个功能。由于时间有限今天先实现了Excel的下载(Excel 导出)。

    这里写图片描述

    • 上面的就是我们的注解类的简化图。参数的意思分别是指定表头的名字+表头所占列宽度+该列是否明文显示+加密显示的方式+特殊文本的格式

    数据实体类

    • 有了上面的注解我们的实体类非常的简单,只是在我们平常建的Javabean的属性字段上加上我们刚才的注解就行了。

    这里写图片描述

    • 其中ExportConfig注解中的属性值我们可以不设置,不设置就是默认的。这里设置完成后就开始写导出了。

    Excel导出

    • 现在该如何获取我们的注解呢,之前的文章已经介绍了。我们得首先获得我们的Javabean的字段。
    for (Field field : _class.getDeclaredFields())
    • 可能会出现我们的Javabean的数据并不是完全的查出来了。所以这里我们得先看看这个字段到底有没有值。
    property = BeanUtils.getProperty(data.get(0), field.getName());
    • 在有值得前提下我们在获取字段的注解。
    ExportConfig config = field.getAnnotation(ExportConfig.class);
    • 最后我们开始讲注解的信息存在到信息类上ExportItem.java
    items.add(new ExportItem.$Build()
                                .setField(field.getName())
                                .setDisplay(
                                        "field".equals(config.value()) ? field
                                                .getName() : config.value())
                                .setWidth(config.width())
                                .setIsExport(config.isExport())
                                .setContent(config.blankContent())
                                .setFieldTypeName(field.getClass().getSimpleName())
                                .setFormat(config.format())
                                .create());
    • ExportItem 类也很简单。里面拷贝了自身的一个类实现了链式操作。这里没什么讲解的。到这里我们的表头显示设置已经完成了。下面自然就是遍历list集合数据了。当然遍历之前先设置表头样式。
    ExportItem exportItem = items.get(index);
    // 首先创建该行指定列的单元格
    Cell cell = headRow.createCell(index);
    sheet.setColumnWidth(index, (short) (exportItem.getWidth() * 35.7));
    cell.setCellValue(exportItem.getDisplay());
    CellStyle style = handler.getHeadCellStyle(wb);
    if (style != null)
    {
        cell.setCellStyle(style);
    }
    • 在设置表身的时候我们得先去注解信息类中拿到该列显示的风格(是否是明文)。
    if (exportItem.getIsExport())
    • 在设置了内容之后我们还要根据注解的单元格格式进行样式的设置
    setStyleByType(wb,exportItem.getFormat());

    Excel输出

     fileName += getExcelSuffix(type);
                    _response.setContentType(getContentType(type));
                    _response.setHeader(
                            "Content-disposition",
                            "attachment; filename="
                                    + new String(fileName.getBytes("gbk"), "iso8859-1"));
    
                    if (out == null)
                    {
                        out = _response.getOutputStream();
                    }
                    wb.write(out);
                    out.flush();
                    out.close();

    所需jar

    log4j-1.2.17.jar 日志jar包
    servlet-api.jar  正常在web项目中都不需要引入该jar包
    poi-3.9.jar   操作表格jar包
    pi-ooxml-3.12.jar XSSFWorkbook 处理2007版本及以上的excel
    

    调用代码

    List<ExcelUser> list = adminManageServiceI.getUsers(ConstantUtil.ADMIN_ID);
    // 生成Excel并使用浏览器下载
    ExcelTool.$Brower(ExcelUser.class, response).toExcel(list, "用户信息");

    效果

    这里写图片描述


    源码正在更新,导入导出全部完成在上传源码。

  • 相关阅读:
    HRESULT:0x80070057 (E_INVALIDARG)的异常的解决方案
    c# 取两个时间的间隔
    [转]C#算法
    智能仓库管理系统方案(四)
    分页存储过程
    ASP.NET2.0_多语言本地化应用程序(转)
    C#绘图双缓冲技术总结(转)
    C#.net同步异步SOCKET通讯和多线程总结(转)
    WIN2003 sp2中Delphi 7中的Project菜单中Options菜单打不开
    C#关于日期月天数和一年有多少周及某年某周时间段的计算
  • 原文地址:https://www.cnblogs.com/zhangxinhua/p/8299225.html
Copyright © 2011-2022 走看看