java优雅实现excel导入导出(可合并单元格)

安装教程

1、添加依赖
- 添加依赖包

        
            com.gitee.sergius
            excel-processer
            1.0.0
        

使用说明

1、 导入功能:(目前仅支持.xls文件的导入,示例参考:api-platform/api-web/src/main/java/com/gitee/sergius/apiweb/biz/ExcelImport.java

        List schools = ExcelToolFactory.createImportor()
            .dataFormat("yyyy/MM/dd HH:mm")
            .startRow(0)
            .entityClass(School.class)
            .inputFile(new FileInputStream(new File("d:/import.xls")))
            .reflectMap(reflectMap)
            .processMap(fieldProcessor)
            .produce();
  • dataFormat:用来定义excel文件中日期格式类型数据的格式样式。默认为“yyyy-MM-dd HH:mm:ss”
  • startRow: 标识从excel文件中的哪一行开始导入,从0开始,默认为1
  • entityClass:配置要将excel文件中每行数据转换成的实体对象类
  • inputFile:配置数据读入来源,接受InputStream对象
  • reflectMap:配置实体对象域和excel列的对应关系,举例:
        Map reflectMap = new HashMap<>(5);
        reflectMap.put("name",0);
        reflectMap.put("createDate",1);
        reflectMap.put("address",2);
        reflectMap.put("type",3);
        reflectMap.put("feeLevel",4);
    该例表示将第0列数据保存到实体的`name`域中,第1列保存到`createDate`域中,。。。
  • processMap:配置某一列的数据处理,用在某一列需要做转换的情况下,举例:
         Map fieldProcessor = new HashMap<>(1);
                 fieldProcessor.put("feeLevel", src -> {
                     if("1000".equals(src)){
                         return "一级";
                     }else if("2000".equals(src)){
                         return "二级";
                     }else if("3000".equals(src)){
                         return "三级";
                     }else {
                         return "";
                     }
                 });
     该例表示feeLevel域在存储时,如果excel中值为1000,则对应存储为`一级`,如果为2000,存储为`二级`,...
  • produce:此方法要在最后调用,用来按照上面的配置项将excel转换成对应的实体对象列表。
  • 导出功能:(目前仅支持.xls文件的导出,示例参考:api-platform/api-web/src/main/java/com/gitee/sergius/apiweb/biz/ExcelExport.java
        try {
                    ExcelToolFactory.createExportor()
                            .columnWidth(40)
                            .dataFormat("yyyy/MM/dd")
                            .sheetTitle("学校列表")
                            .startColumn(2)
                            .startRow(4)
                            .headers("学校名称", "建校日期", "学校类型", "学费层级", "学生名字", "年龄", "年级")
                            .excludedFields("School.address", "Student.birth")
                            .fieldReflectMap(fieldReflectMap)
                            .produce(schools)
                            .writeToFile("d:/", "complex.xls");
                } catch (ExcelException e) {
                    e.getMessage();
                }
  • columnWidth:设置列宽,最小5,最大500,不设置默认为15
  • dataFormat:设置日期类型数据展示格式,不设置默认为“yyyy-MM-dd HH:mm:ss”
  • sheetTitle:设置sheet页名称,不设置默认为sheet1
  • startColumn:设置数据写入起始列,从0开始,默认为0
  • startRow: 设置数据写入起始行,从0开始,默认为0
  • headers:设置列名称
  • excludedFields:设置不导出的域,形式为“类名.属性名”,例如:User.bizType,需要导出的字段必须要有get方法否则抛出NoSuchMethodException
  • fieldReflectMap:可以用该参数对数据库导出的某列数据做转换,举例:
                Map> fieldReflectMap = new HashMap<>(3);
                HashMap switchMap = new HashMap<>(4);
                switchMap.put("1", "小学");
                switchMap.put("2", "中学");
                switchMap.put("3", "大学");
                switchMap.put(OTHER_REFLECT_KEY, "其他");
                fieldReflectMap.put("School.type", switchMap);
    该例表示将School对象中type域的值做转换,如果值为1,导出到excel中展示为“小学”,。。。
    如果有不需要转换的值,可以用`switchMap.put(OTHER_REFLECT_KEY, "其他");`表示除1、2、3之外的值将被转换成“其他”。
  • produce:按照上面的配置生成excel对象的实体缓存,该方法要在以上所有配置项之后调用。
  • writeToFile、write、writeToHttpResponse:此方法要在最后调用,用来将生成的excel对象缓存写到对应的输出流中。其中:
    writeToFile:将excel写到文件中。入参为对应的excel文件的存储路径和名称。
    writeToHttpResponse:将excel写到HttpServletResponse中,用来web项目中页面下载。入参为对应的HttpServletResponse和生成的文件名。
    write:将excel缓存写到对应的输出流中,入参为OutputStream。

如果要导出的对象里面有子对象组成的列表,那么子列表将会以合并单元格的形式导出。
源码及示例:
https://gitee.com/sergius/api-platform/tree/master
导入导出组件是excel-processer子工程

你可能感兴趣的:(Java)