springboot整合easyexcel 导入导出excel案例及文件无法打开

前端请求

vue3+axios+typescript

downloadByUrlStream({url:process.env.VUE_APP_API_URL1+"/MeshDevice/upExcel"})
 export function downloadByUrlStream({url, target = '_self', fileName, fileType}: {
    url: string;
    target?: '_self' | '_blank';
    fileName?: string;
    fileType?: string;
}): Promise<boolean> {
    return new Promise<boolean>((resolve, reject) => {
            const link = document.createElement('a');
            link.href = url;
            link.target = target;

            if (link.download !== undefined) {
                link.download = fileName || getFileName(url)
            }

            if (document.createEvent) {
                const e = document.createEvent('MouseEvents');
                e.initEvent('click', true, true);
                link.dispatchEvent(e);
                return resolve(true);
            }

            if (url.indexOf('?') === -1) {
                url += '?download';
            }

            window.open(url, target);
            return resolve(true);
    })
}

Springboot 后端部分
先在pom文件中引用依赖
 

        <!-- 引入easyexcel-->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>easyexcel</artifactId>
			<version>3.1.1</version>
		</dependency>
		<!--使用POI读取文件-->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>4.1.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>4.1.2</version>
		</dependency>

注意:如果你引入的easyexcel 是3.x版本 请也将poi对应升至4.x版本

导出数据

controller or service 层
 

    @GetMapping("/upExcel")
    public void downloadDeviceExcel(HttpServletResponse response,HttpServletRequest request) throws ParseException {
        try {
            List<MeshDeviceVos> list = meshDeviceMapper.deviceByAll();
            Set<String> includeColumnFieldNames = new HashSet<String>();
            includeColumnFieldNames.add("mac");
            includeColumnFieldNames.add("ver");
            includeColumnFieldNames.add("innermodel");
            includeColumnFieldNames.add("serialNumber");
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyExcel没有关系
            String fileName = URLEncoder.encode("设备信息表", "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
            // 如果不用模板的方式导出的话,是doWrite
            EasyExcel.write(response.getOutputStream(), MeshDeviceData.class).includeColumnFieldNames(includeColumnFieldNames).sheet("设备信息表数据").doWrite(list);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

// 根据用户传入字段 假设我们要忽略 字段
Set<String> excludeColumnFiledNames = new HashSet<String>();

// 根据用户传入字段 假设我们只要导出 字段
Set<String> includeColumnFiledNames = new HashSet<String>();

实体类

@Data
public class MeshDeviceData {
    @ExcelProperty(index = 0,value = "Mac")
    @ColumnWidth(20)
    private String mac;
    @ExcelProperty(index = 1,value = "版本")
    private String ver;
    @ExcelProperty(index = 2,value = "型号")
    private String innermodel;
    @ExcelProperty(index = 3,value = "序列号")
    @ColumnWidth(20)
    private String serialNumber;
}

导入数据

 前端代码

    <p>
      <a-upload
        v-model:file-list="fileList"
        name="file"
        accept=".xlsx,.xls"
        :multiple="true"
        :action="importUrl"
        :headers="headers"
        @change="handleChange"
      >
        <a-button>
          <upload-outlined></upload-outlined>
          点击上传
        </a-button>
      </a-upload>
    </p>

handleChange 方法 

    const fileList = ref<FileItem[]>([])
    const importUrl =ref<string>(process.env.VUE_APP_API_URL1 + "/shop/importExcel"); 
    const handleChange = (info: FileInfo) => {
      if (info.file.status !== 'uploading') {
        console.log(info.file, info.fileList)
      }
      fileList.value = [...info.fileList].splice(-1)
      if (info.file.status === 'done') {
        debugger
        if (info.file.response.code === 0) {
          message.success('导入成功')
           ctx.emit('handle', false)
        } else {
          message.error('导入失败 ' + info.file.response.message)
        }
      } else if (info.file.status === 'error') {
        message.error(`${info.file.name} 上传失败`)
      }
    }

后端controller or service 

    @PostMapping("/importExcel")
    public RS insertCategoriesExcel(@RequestParam("file") MultipartFile file){
        if(StringUtils.isEmpty(file)){
            throw  new MyException(1,"文件不能为空");
        }
        careCategoriesService.importCategories(file,careCategoriesService);
        return new RS().ok();
    }
    @Override
    public void importCategories(MultipartFile file, CareCategoriesService careCategoriesService) {
        try {
            InputStream inputStream = file.getInputStream();
            EasyExcel.read(inputStream, CategoriesVo.class,new CategoriesExcleListener(careCategoriesService)).sheet().doRead();
        }catch (Exception e){
            e.printStackTrace();
            //throw  new MyException(1,"上传出错了");
        }
    }

 新增一个listener 类 继承AnalysisEventListener<CategoriesVo> CategoriesVo 是实体类

public class CategoriesExcleListener extends AnalysisEventListener<CategoriesVo> {
    public CareCategoriesService careCategoriesService;

    public CategoriesExcleListener(CareCategoriesService careCategoriesService) {
        this.careCategoriesService = careCategoriesService;
    }

    @Override
    public void invoke(CategoriesVo careCategoriesVo, AnalysisContext analysisContext) {
        if(careCategoriesVo ==null){
            throw  new MyException(1,"添加失败");
        }
        CareCategories careCategories = new CareCategories();
        BeanUtils.copyProperties(careCategoriesVo,careCategories);
        //插入数据库
        String title = careCategories.getTitle();
        QueryWrapper<CareCategories> careCategoriesQueryWrapper = new QueryWrapper<>();
        careCategoriesQueryWrapper.eq("title",title);
        List<CareCategories> categoriesList = careCategoriesService.list(careCategoriesQueryWrapper);
        if(categoriesList.size()!=0){
            throw  new MyException(1,"该类别已经存在库中,请勿重复导入");
        }
        careCategoriesService.save(careCategories);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}

 遇到下载无法打开,后端报

java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.Cell.getCellType()

需要将poi版本如

<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>3.17</version>
</dependency>

更改为

 

<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>4.1.2</version>
</dependency>

更多easyExcel 用法 可以前往官方API查看EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel

gitHub地址:GitHub - alibaba/easyexcel: 快速、简洁、解决大文件内存溢出的java处理Excel工具

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot 是一个用于创建基于 Spring 框架的独立、生产级别的应用程序的框架。EasyExcel 是一个基于 Java 的开源框架,可以方便地读写 Excel 文件。使用 EasyExcel 可以轻松地进行 Excel 文件导入导出,非常适合在 Spring Boot 项目中使用。 下面是在 Spring Boot 项目中使用 EasyExcel 进行 Excel 文件导入导出的基本步骤: 1. 添加 EasyExcel 依赖 在项目的 pom.xml 文件中添加 EasyExcel 依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.10</version> </dependency> ``` 2. 编写 Excel 导出代码 使用 EasyExcel 可以非常方便地进行 Excel 文件导出。例如,以下代码可以将一个 List 对象导出Excel 文件: ```java // 定义 Excel 表头 List<List<String>> head = new ArrayList<>(); head.add(Arrays.asList("姓名", "年龄")); // 定义 Excel 数据 List<List<Object>> data = new ArrayList<>(); data.add(Arrays.asList("张三", 18)); data.add(Arrays.asList("李四", 20)); data.add(Arrays.asList("王五", 22)); // 导出 Excel 文件 String fileName = "example.xlsx"; String sheetName = "Sheet1"; EasyExcel.write(fileName).sheet(sheetName).head(head).sheet().doWrite(data); ``` 3. 编写 Excel 导入代码 使用 EasyExcel 进行 Excel 文件导入也非常方便。例如,以下代码可以从 Excel 文件中读取数据并转换为一个 List 对象: ```java // 定义读取 Excel 文件的监听器 public class ExcelListener extends AnalysisEventListener<Object> { private List<Object> data = new ArrayList<>(); @Override public void invoke(Object object, AnalysisContext context) { data.add(object); } @Override public void doAfterAllAnalysed(AnalysisContext context) {} public List<Object> getData() { return data; } } // 读取 Excel 文件 String fileName = "example.xlsx"; ExcelListener listener = new ExcelListener(); EasyExcel.read(fileName, listener).sheet().doRead(); List<Object> data = listener.getData(); ``` 4. 将 Excel 文件导入到数据库 读取 Excel 文件之后,可以将数据存入数据库中。以下代码演示了将读取的 Excel 文件中的数据存入 MySQL 数据库的过程: ```java // 定义实体类 @Data public class Person { private String name; private Integer age; } // 保存数据到数据库 List<Person> persons = new ArrayList<>(); for (Object obj : data) { List<Object> row = (List<Object>) obj; Person person = new Person(); person.setName((String) row.get(0)); person.setAge((Integer) row.get(1)); persons.add(person); } personRepository.saveAll(persons); ``` 以上就是使用 EasyExcel 进行 Excel 文件导入导出的基本步骤。根据实际需求,可以对以上代码进行相应的修改和扩展。 ### 回答2: Spring Boot 是一个开源的Java开发框架,可以帮助开发人员快速构建基于Spring的应用程序。EasyExcel 是一种基于Java的Excel读写工具,它提供了简单便捷的API,可以方便地实现Excel导入导出功能。 在Spring Boot中使用EasyExcel进行导入导出操作非常简单。首先,我们需要在pom.xml文件中添加EasyExcel的依赖项,以便可以使用它的功能。然后,我们可以创建一个Controller类来处理导入导出的请求。 对于导入操作,我们可以使用EasyExcel提供的@ExcelProperty注解来标记实体类的字段与Excel的列的映射关系。然后,我们可以使用EasyExcel的read方法来读取Excel文件,并将数据转换为实体类对象。最后,我们可以对读取到的数据进行相应的业务操作,比如存储到数据库中。 对于导出操作,我们可以使用EasyExcel的@ExcelProperty注解标记实体类的字段,并使用EasyExcel的write方法来将实体类列表写入Excel文件。我们可以通过指定文件路径或输出流的方式进行导出。 除了基本的导入导出功能,EasyExcel还提供了一些高级特性,比如读取大文件、多sheet处理、自定义读写处理器等。这些特性可以帮助我们更好地应对复杂的Excel导入导出需求。 总而言之,Spring Boot结合EasyExcel提供了一种简单快捷的方式来实现Excel导入导出功能。无论是处理简单的Excel文件还是应对复杂的导入导出需求,Spring BootEasyExcel都能够提供强大的支持。 ### 回答3: Spring Boot 是一种简化了开发过程的Java框架,而EasyExcel是一种用于操作Excel文件的开源库。通过结合使用Spring BootEasyExcel,我们可以方便地实现Excel文件导入导出功能。下面将详细介绍如何使用Spring BootEasyExcel来实现导入导出功能。 首先,我们需要在Spring Boot的项目中引入EasyExcel的依赖。在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.6</version> </dependency> ``` 接着,我们可以创建一个Controller类来处理导入导出的请求。在该类中,我们可以定义两个方法,一个用于导入Excel文件,另一个用于导出Excel文件。 对于导入功能,我们可以使用EasyExcel提供的`read()`方法来读取Excel文件,并将读取到的数据转换为一个List对象。以下是一个简单的导入方法的示例代码: ```java @PostMapping("/import") public void importExcel(@RequestParam("file") MultipartFile file) throws IOException { List<DataDTO> dataList = EasyExcel.read(file.getInputStream()).head(DataDTO.class).sheet().doReadSync(); // 处理导入的数据 } ``` 对于导出功能,我们可以使用EasyExcel提供的`write()`方法来创建一个Excel文件,并将数据写入到该文件中。以下是一个简单的导出方法的示例代码: ```java @GetMapping("/export") public void exportExcel(HttpServletResponse response) throws IOException { List<DataDTO> dataList = getDataList(); // 获取导出的数据 response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("data.xlsx", "utf-8")); EasyExcel.write(response.getOutputStream()).sheet("Data").doWrite(dataList); } ``` 在上述代码中,我们首先获取需要导出的数据(getDataList()方法需要根据实际情况实现),然后设置响应头信息,最后使用`write()`方法将数据写入到响应的输出流中。 通过以上步骤,我们在Spring Boot项目中成功实现了使用EasyExcel进行Excel文件导入导出功能。我们可以根据具体需求对导入的数据进行处理,也可以根据实际情况设置导出文件的格式和名称。同时,EasyExcel还提供了更多的功能和选项,如设置表头、导入数据校验等,可以根据具体需求进行使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值