SpringBoot导入导出数据实现方法详解

SpringBoot导入导出数据实现方法详解

在开发Web应用程序时,数据的导入和导出是一项核心功能。SpringBoot提供了多种方式来实现数据的导入和导出,本文将详细介绍其中常用的两种方式。

基于EasyPOI实现Excel导入和导出

EasyPOI是一个简单易用的Java Excel操作库,它提供了丰富的API和自定义标签来快速创建Excel文件。下面是在SpringBoot项目中使用EasyPOI进行Excel导入和导出的步骤。

导出Excel

  1. 添加依赖
<dependency>
  <groupId>cn.afterturn</groupId>
  <artifactId>easypoi-base</artifactId>
  <version>5.5.0</version>
</dependency>
  1. 创建Excel模板
public class ExportUserInfoVO {
    @Excel(name = "序号", orderNum = "0", width = 15)
    private Integer id;

    @Excel(name = "姓名", orderNum = "1", width = 20)
    private String name;

    @Excel(name = "年龄", orderNum = "2", width = 15)
    private Integer age;

    // 省略getters和setters
}
  1. 实现导出接口
@GetMapping("/exportUserInfo")
public void exportUserInfo(HttpServletResponse response) throws IOException {
    List<UserInfo> userList = userInfoService.getAllUserInfo();
    List<ExportUserInfoVO> voList = userList.stream().map(ConvertUtil::convert).collect(Collectors.toList());

    Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), ExportUserInfoVO.class, voList);

    response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + new String("用户信息导出.xlsx".getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
    response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);

    workbook.write(response.getOutputStream());
}

这里的ConvertUtil是自己实现的一个工具类,用来做Java Bean之间的转换。

导入Excel

  1. 添加依赖
<dependency>
  <groupId>cn.afterturn</groupId>
  <artifactId>easypoi-base</artifactId>
  <version>5.5.0</version>
</dependency>
  1. 创建Excel模板
public class ImportUserInfoVO {
    @Excel(name = "姓名", orderNum = "0", width = 20)
    private String name;

    @Excel(name = "年龄", orderNum = "1", width = 15)
    private String age;

    // 省略getters和setters
}
  1. 实现导入接口
@PostMapping("/importUserInfo")
public void importUserInfo(@RequestParam("file") MultipartFile file) throws IOException {
    List<ImportUserInfoVO> dataList = ExcelImportUtil.importExcel(file.getInputStream(), ImportUserInfoVO.class, new ImportParams());

    dataList.forEach(item -> {
        UserInfo userInfo = new UserInfo();
        userInfo.setName(item.getName());
        userInfo.setAge(Integer.parseInt(item.getAge()));
        userInfoService.save(userInfo);
    });
}

基于Jxls实现Excel导入和导出

Jxls是一个开源的Java库,专门用于生成Excel、Word和PowerPoint格式的报表。下面是在SpringBoot项目中使用Jxls进行Excel导入和导出的步骤。

导出Excel

  1. 添加依赖
<dependency>
  <groupId>org.jxls</groupId>
  <artifactId>jxls-core</artifactId>
  <version>2.12.1</version>
</dependency>
  1. 创建Excel模板

Excel模板可参考Jxls官方文档。

  1. 实现导出接口
@GetMapping("/exportUserInfo2")
public void exportUserInfo2(HttpServletResponse response) throws IOException {
    List<UserInfo> userList = userInfoService.getAllUserInfo();
    List<Map<String, Object>> dataList = new ArrayList<>();

    for (int i = 0; i < userList.size(); i++) {
        UserInfo userInfo = userList.get(i);
        Map<String, Object> item = new HashMap<>();
        item.put("id", userInfo.getId());
        item.put("name", userInfo.getName());
        item.put("age", userInfo.getAge());
        dataList.add(item);
    }

    response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + new String("用户信息导出2.xlsx".getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
    response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
    InputStream is = this.getClass().getResourceAsStream("/templates/user-info-export-template.xlsx");

    try (OutputStream os = response.getOutputStream()) {
        Context context = new Context();
        context.putVar("dataList", dataList);
        JxlsHelper.getInstance().setUseFastFormulaProcessor(false).processTemplate(is, os, context);
    }
}

导入Excel

  1. 添加依赖
<dependency>
  <groupId>org.jxls</groupId>
  <artifactId>jxls-reader</artifactId>
  <version>2.4.3</version>
</dependency>
  1. 实现导入接口
@PostMapping("/importUserInfo2")
public void importUserInfo2(@RequestParam("file") MultipartFile file) throws IOException {
    try (InputStream inputStream = file.getInputStream()) {
        XLSReader reader = ReaderBuilder.buildFromXML(this.getClass().getResourceAsStream("/templates/user-info-import-template.xml"));
        List<UserInfo> userList = new ArrayList<>();
        List<Size> sizeList = new ArrayList<>();
        List<RowData> rowList = new ArrayList<>();

        Map<String, Object> beans = new HashMap<>();
        beans.put("userList", userList);
        beans.put("sizeList", sizeList);
        beans.put("rowList", rowList);

        SimpleBlockReader simpleBlockReader = new SimpleBlockReader() {
            @Override
            public void addRows(int sheetIndex, int rowIndex, List row) {
                if (rowIndex > 0) {
                    UserInfo userInfo = new UserInfo();
                    userInfo.setName((String) row.get(0));
                    userInfo.setAge((Integer) row.get(1));
                    userList.add(userInfo);
                }
            }

            @Override
            public void addSize(int sheetIndex, int rowIndex, int columnIndex, Size size) {
                sizeList.add(size);
            }

            @Override
            public void mergeCells(int sheetIndex, List<CellRangeAddress> mergedRegions) {
            }

            @Override
            public void row(int sheetIndex, int rowIndex) {
                if (rowIndex > 0) {
                    Object row = new RowData(rowIndex);
                    rowList.add((RowData) row);
                }
            }
        };

        ReaderConfig.getInstance().setSimpleBlockReader(simpleBlockReader);
        reader.read(inputStream, beans);
        userInfoService.saveBatch(userList);
    }
}

结语

以上就是使用EasyPOI和Jxls实现SpringBoot应用中Excel数据的导入和导出的方法了。根据实际需求选择相应的实现方式,可大大提高开发效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot导入导出数据实现方法详解 - Python技术站

(1)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • jQuery progressbar通过Ajax请求实现后台进度实时功能

    Sure!下面我会给你详细讲解“jQuery progressbar通过Ajax请求实现后台进度实时功能”的完整攻略。 概述 通过Ajax和jQuery的配合,可以轻松地实现前台进度条与后台处理任务的进度同步显示。主要思路是在前端发出一个Ajax请求,服务器端进行进度处理后,将进度实时反馈到前端页面。 步骤 下面我将分为以下几个步骤讲述完整攻略: 安装jQu…

    Java 2023年5月20日
    00
  • Java在线打开word文档并强制留痕的方法

    下面为你介绍“Java在线打开word文档并强制留痕的方法”的攻略,具体步骤如下: 步骤一:导入必要的库文件 为了实现Java在线打开word文档并强制留痕的效果,需要用到Aspose.Words库文件。可以通过以下Maven依赖导入Aspose.Words库: <dependency> <groupId>com.aspose<…

    Java 2023年6月15日
    00
  • java字节码框架ASM的深入学习

    Java字节码框架ASM深入学习 简介 ASM是一个用Java编写的自由字节码处理库。它可以动态生成新的类,或者对现有类进行修改,最终生成对应的字节码文件。使用ASM可以实现很多高级的功能,比如动态AOP框架、基于注解的ORM框架等。 详细攻略 1. 安装ASM 使用Maven(或者Gradle)可以很方便地安装ASM: <dependency>…

    Java 2023年5月26日
    00
  • JSP学习之JavaBean用法分析

    JSP学习之JavaBean用法分析 什么是JavaBean JavaBean是指一种用Java语言编写的可重用组件,它是一个类,它具有以下特点: 必须有一个公共的无参构造函数(构造方法) 成员变量必须是私有的,并通过公共的getter/setter方法来访问 JavaBean通常用于表示数据模型,封装了应用程序中的数据,并通过getter/setter方法…

    Java 2023年6月15日
    00
  • 一文总结 Shiro 实战教程

    一文总结 Shiro 实战教程是一篇介绍 Apache Shiro 框架的文章。该框架是一个类库,它可以帮助 Java 开发人员快速构建安全、可靠的应用程序。该框架提供了诸多功能,例如:身份验证、授权、密码加密、会话管理等,且具有简单易用和灵活的特点,在 Java 领域中很受欢迎。 以下是使用 Shiro 实现身份认证和授权的两个示例: 示例1:用户登录 编…

    Java 2023年6月15日
    00
  • 使用Java将字符串在ISO-8859-1和UTF-8之间相互转换

    首先,我们需要了解一下ISO-8859-1和UTF-8。 ISO-8859-1是一种字符编码,能够表示大部分欧洲语言的字符。在ISO-8859-1中,每个字符占据一个字节,使用1个字节来表示一个字符。然而,ISO-8859-1不能表示非欧洲语言的字符,比如中文、日文等。 而UTF-8则是一种Unicode字符编码,能够表示世界上的所有字符。UTF-8使用1到…

    Java 2023年5月20日
    00
  • Spring Security如何实现升级密码加密方式详解

    Spring Security如何实现升级密码加密方式详解 Spring Security是一个强大且灵活的身份验证框架,可以应用于任何Java应用程序中。它允许您轻松地添加身份验证和授权功能到应用程序中,并且提供了强大的加密和解密功能。本文将详细讲解如何使用Spring Security升级密码加密方式。 什么是密码加密和升级密码加密方式? 密码加密是指将…

    Java 2023年6月3日
    00
  • 一起来学习JAVA的运算符

    一起来学习JAVA的运算符 什么是运算符 运算符是一种用来执行数学或逻辑运算的字符或符号。在 Java 中,一共有多种运算符,包括算术运算符、比较运算符、逻辑运算符等。掌握运算符对于 Java 编程来说是非常重要的,因为运算符可用于控制程序的流程和结果。 算术运算符 Java 的算术运算符包括加、减、乘、除、求模等。下面是一些示例: int a = 6, b…

    Java 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部