Java中的Excel框架使用详解

 更新时间:2023年11月13日 08:57:21   作者:阿靖哦  
这篇文章主要介绍了Java中的Excel框架使用详解,Java解析、生成Excel比较有名的框架有Apache poi、jxl,但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,需要的朋友可以参考下

一、安装依赖

推荐使用最新版本,可通过文章末尾官方文档链接跳转查看

<dependency>
    <groupId>cn.gjing</groupId>
    <artifactId>tools-excel</artifactId>
    <version>2021.12.3</version>
</dependency>

二、Excel导出

1、单表头

定义Excel映射实体, @Data是lombok的注解

/**
 * @author Gjing
 **/
@Data
@Excel("单级表头")
public class SingleHead {
    @ExcelField("姓名")
    private String userName;

    @ExcelField(value = "年龄", format = "0")
    private Integer userAge;

    @ExcelField("性别")
    private Gender gender;

    @ExcelField("爱好")
    private String favorite;
}
/**
 * @author Gjing
 **/
@RestController
public class UserController {

    @GetMapping("/test_export")
    @ApiOperation("导出一级表头")
    public void testExport(HttpServletResponse response) {
        //指定映射的实体为刚刚定义的
        ExcelFactory.createWriter(SingleHead.class, response)
                .write(null)
                .flush();
    }
}

single

2、多级表头

数组中的每个值代表着一级表头

/**
 * @author Gjing
 **/
@Data
@Excel("多级表头")
public class MultiHead {
    @ExcelField({"用户名","用户名"})
    private String userName;

    @ExcelField({"年龄","年龄"})
    private Integer age;

    @ExcelField({"形态","身高"})
    private BigDecimal height;

    @ExcelField({"形态","体重"})
    private BigDecimal weight;
}
/**
 * @author Gjing
 **/
@RestController
public class TestController {

    @GetMapping("/test_export")
    @ApiOperation("多级表头")
    public void testExport(HttpServletResponse response) {
        ExcelFactory.createWriter(MultiHead.class, response)
                //需要在write前激活多级表头,否则不会自动合并
                .multiHead(true)
                .write(null)
                .flush();
    }
}

multi

3、带大标题

大标题的起始行是你要插入的sheet中最后一条数据的下一行,如果sheet中没有数据,就是第一行。你可以配置大标题占用的行数和起始单元格下标(默认第一个单元格)和结束单元格下标(默认跟随表头的数量)

/**
 * @author Gjing
 **/
@RestController
public class TestController {

    @GetMapping("/test")
    @ApiOperation("含大标题")
    public void testExport(HttpServletResponse response) {
        ExcelFactory.createWriter(SingleHead.class, response)
                //大标题占用两行
                .writeTitle(new BigTitle("我是大标题"))
                .write(null)
                .flush();
    }
}

title

4、下拉框

单元格增加下拉框

  • 注解方式
/**
 * @author Gjing
 **/
@Data
@Excel("下拉框导出")
public class SingleHead {
    @ExcelField("性别")
    @ExcelDropdownBox(combobox = {"男", "女"})
    private Gender gender;

    @ExcelField("爱好")
    private String favorite;
}
/**
 * @author Gjing
 **/
@RestController
public class TestController {

    @GetMapping("/test_export")
    @ApiOperation("带下拉框")
    public void testExport(HttpServletResponse response) {
        ExcelFactory.createWriter(SingleHead.class, response)
                //需要在write前激活校验
                .valid(true)
                .write(null)
                .flush();
    }
}
  • 通过方法设置普通下拉框的选项
/**
 * @author Gjing
 **/
@RestController
public class TestController {

    @GetMapping("/test_export")
    @ApiOperation("带下拉框")
    public void testExport(HttpServletResponse response) {
        Map<String, String[]> genderMap = new HashMap<>(8);
        //key为实体类的字段名,使用方法进行设置时,实体字段的@ExcelDropdownBox注解不在需要指定combobox
        //如果指定了也会去覆盖注解中的值
        genderMap.put("gender", new String[]{"男", "女"});
        ExcelFactory.createWriter(SingleHead.class, response)
                .valid(true)
                .write(null, genderMap)
                .flush();
    }
}

下拉框

5、时间校验

导出时给列表头下方的单元格增加时间校验

/**
 * @author Gjing
 **/
@Data
@Excel
public class SingleHead {
    @ExcelField("姓名")
    private String userName;

    @ExcelField(value = "年龄", format = "0")
    private Integer userAge;

    @ExcelField(value = "生日", format = "yyyy-MM-dd")
    @ExcelDateValid(expr1 = "2000-01-01", operatorType = LESS_OR_EQUAL, errorContent = "出生日期不能超过2000年")
    private Date birthday;
}
/**
 * @author Gjing
 **/
@RestController
public class TestController {

    @GetMapping("/test_export")
    @ApiOperation("带时间校验")
    public void testExport(HttpServletResponse response) {
        ExcelFactory.createWriter(SingleHead.class, response)
                //需要在write前激活校验
                .valid(true)
                .write(null)
                .flush();
    }
}

时间校验

6、数字、文本校验

导出时给列表头下方的单元格增加数值校验。可以对数字的大小,文本的长度进行校验

/**
 * @author Gjing
 **/
@Data
@Excel
public class SingleHead {
    @ExcelField("姓名")
    //对输入的名称字数进行校验,字数限制小于4
    @ExcelNumericValid(validType = TEXT_LENGTH,operatorType = LESS_THAN,expr1 = "4",errorContent = "姓名字数小于4")
    private String userName;
}
/**
 * @author Gjing
 **/
@RestController
public class TestController {

    @GetMapping("/test_export")
    @ApiOperation("带数值校验")
    public void testExport(HttpServletResponse response) {
        ExcelFactory.createWriter(SingleHead .class, response)
                //需要在write前激活校验
                .valid(true)
                .write(null)
                .flush();
    }
}

数值校验

7、数据转换

导出时对数据进行加工或者添加默认值,支持注解方式和接口方式

  • 注解方式
/**
 * @author Gjing
 **/
@Data
@Excel
public class SingleHead {
    @ExcelField("姓名")
    private String userName;

    @ExcelField(value = "年龄", format = "0")
    //对每个人的年龄乘以10
    @ExcelDataConvert(expr1 = "#userAge * 10")
    private Integer userAge;
}
  • 接口方式
/**
 * @author Gjing
 **/
public class MyDataConvert implements DataConvert<SingleHead> {

    @Override
    public Object toEntityAttribute(Object o, Field field) {
        return null;
    }

    @Override
    public Object toExcelAttribute(SingleHead singleHead, Object value, Field field) {
        return (int) value * 10;
    }
}

实现接口后需要在你需要转换的字段上指定转换器

/**
 * @author Gjing
 **/
@Data
@Excel
public class SingleHead {
    @ExcelField("姓名")
    private String userName;

    @ExcelField(value = "年龄", format = "0", convert = MyDataConvert.class)
    private Integer userAge;
}

导出方法调用最后一定要使用flush()方法进行数据刷新到Excel文件中

三、导入

导入的实体类皆采用导出的实体类

1、单表头

/**
 * @author Gjing
 **/
@RestController
public class TestController {
    @Resource
    private UserService userService;
	
    @PostMapping("/user_import")
    @ApiOperation("导入单表头")
    public void userImport(MultipartFile file) throws IOException {
        ExcelFactory.createReader(file, SingleHead.class)
                //在read()方法前通过订阅方法增加一个结果监听器,该监听器会在每一次read()结束之后触发
                .subscribe(e -> this.userService.saveUsers(e))
                .read()
                .finish();
    }
}

2、多级表头

前文有提到多级表头时,最后一级为实际表头,所以要在导入时指定实际表头开始下标,由于导出的模板映射实体设置两级表头,因此这里的实际表头为下标为1(Excel行和列下标都是默认0开始的)

/**
 * @author Gjing
 **/
@RestController
public class TestController {
    @Resource
    private UserService userService;
	
    @PostMapping("/user_import")
    @ApiOperation("导入单表头")
    public void userImport(MultipartFile file) throws IOException {
        ExcelFactory.createReader(file, SingleHead.class)
                //在read()方法前通过订阅方法增加一个结果监听器,该监听器会在每一次read()结束之后触发
                //如果Excel中数据量太大,不建议使用结果监听器,会造成生成了过多的映射实体对象造成内存溢出
                .subscribe(e -> this.userService.saveUsers(e))
                .read(1)
                .finish();
    }
}

在导入调用结束后,一定要在最后调用finish()方法对流进行关闭

到此这篇关于Java中的Excel框架使用详解的文章就介绍到这了,更多相关Java中的Excel框架内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MyBatis多表查询和注解开发案例详解

    MyBatis多表查询和注解开发案例详解

    这篇文章主要介绍了MyBatis多表查询和注解开发,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • 如何利用Vue+SpringBoot实现评论功能

    如何利用Vue+SpringBoot实现评论功能

    简单的评论功能是指能够在文章底下进行评论,而且能够对评论进行回复,下面这篇文章主要给大家介绍了关于如何利用Vue+SpringBoot实现评论功能的相关资料,需要的朋友可以参考下
    2023-06-06
  • spring IOC控制反转原理详解

    spring IOC控制反转原理详解

    这篇文章主要为大家详细介绍了spring IOC控制反转原理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Java字符串常量池和intern方法解析

    Java字符串常量池和intern方法解析

    本文主要介绍了Java字符串常量池和intern方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 浅谈Java8对字符串连接的改进正确姿势

    浅谈Java8对字符串连接的改进正确姿势

    这篇文章主要介绍了Java8:对字符串连接的改进,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Java并发教程之Callable和Future接口详解

    Java并发教程之Callable和Future接口详解

    Java从发布的第一个版本开始就可以很方便地编写多线程的应用程序,并在设计中引入异步处理,这篇文章主要给大家介绍了关于Java并发教程之Callable和Future接口的相关资料,需要的朋友可以参考下
    2021-07-07
  • Java实现经典游戏推箱子的示例代码

    Java实现经典游戏推箱子的示例代码

    《推箱子》推箱子是一个古老的游戏,目的是在训练你的逻辑思考能力。本文将利用Java实现这一经典的小游戏,并采用了swing技术进行了界面化处理,需要的可以参考一下
    2022-02-02
  • BCryptPasswordEncoder加密与MD5加密的区别及说明

    BCryptPasswordEncoder加密与MD5加密的区别及说明

    这篇文章主要介绍了BCryptPasswordEncoder加密与MD5加密的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Spring Data JPA例子代码[基于Spring Boot、Mysql]

    Spring Data JPA例子代码[基于Spring Boot、Mysql]

    这篇文章主要介绍了Spring Data JPA例子代码[基于Spring Boot、Mysql],小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Java 设计模式中的策略模式详情

    Java 设计模式中的策略模式详情

    这篇文章主要介绍了Java 设计模式中的策略模式详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09

最新评论