EasyExcel实现Excel文件多sheet导入导出

简介: EasyExcel实现Excel文件多sheet导入导出

一、概述



最近公司需要做一个需求,通过excel上传病例信息,并将病例信息进行归档和整理;该需求可以简化为excel模板下载和excel上传并解析归档。既然知道需求了,找excel的操作工具jar包吧,发现以前常用的poi需要写的代码太多,但是时间紧急,没办法只能找新的工具。easypoi 在读写数据的时候,优先是先将数据写入内存,优点是读写性能非常高,但是当数据量很大的时候,会出现oom,当然它也提供了 sax 模式的读写方式,需要调用特定的方法实现。病例的信息量可能会很大,很有可能会造成内存溢出,没办法,再找吧!easyexcel 基于sax模式进行读写数据,不会出现oom情况,程序有过高并发场景的验证,因此程序运行比较稳定,相对于 easypoi 来说,虽然读写性能稍慢,但是更符合我目前的开发场景。


二、easypoi实例



easypoi 的亮点就是基于注解实体类来实现导入、导出excel,使用起来非常简单!


1. jar包引入


<dependency>
        <groupId>cn.afterturn</groupId>
        <artifactId>easypoi-base</artifactId>
        <version>4.1.0</version>
    </dependency>
    <dependency>
        <groupId>cn.afterturn</groupId>
        <artifactId>easypoi-web</artifactId>
        <version>4.1.0</version>
    </dependency>
    <dependency>
        <groupId>cn.afterturn</groupId>
        <artifactId>easypoi-annotation</artifactId>
        <version>4.1.0</version>
    </dependency>


2. 创建实体注解类


@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserEntity {
    @Excel(name = "姓名")
    private String name;
    @Excel(name = "年龄")
    private int age;
    @Excel(name = "操作时间",format="yyyy-MM-dd HH:mm:ss", width = 20.0)
    private Date time;
}


3. 导出业务


public static void main(String[] args) throws Exception {
    List<UserEntity> dataList = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        UserEntity userEntity = new UserEntity();
        userEntity.setName("李四" + i);
        userEntity.setAge(30 + i);
        userEntity.setTime(new Date(System.currentTimeMillis() + i));
        dataList.add(userEntity);
    }
    //生成excel文档
    Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户","用户信息"),
            UserEntity.class, dataList);
    FileOutputStream fos = new FileOutputStream("D:/easypoi-user1.xls");
    workbook.write(fos);
    fos.close();
}


4. 导入业务


public static void main(String[] args) {
    ImportParams params = new ImportParams();
    params.setTitleRows(1);
    params.setHeadRows(1);
    long start = new Date().getTime();
    List<Map<String, Object>> list = ExcelImportUtil.importExcel(new File("D:/easypoi-user2.xls"),
            Map.class, params);
    System.out.println(new Date().getTime() - start);
    System.out.println(JSONArray.toJSONString(list));
}


更多操作方法,请查阅easypoi指导手册,里面的介绍很详细,操作表格相当灵活多变。


三、easyExcel实例



1. jar包引入


!-- poi操作excel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.10</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>4.0.1</version>
        </dependency>


2. 创建实体注解类


/**
 * 演示表-个人基础信息
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FirstSheetVO {
    @ExcelProperty(value = "序号",index = 0)
    private Integer orderNum;
    @ExcelProperty(value = "姓名",index = 1)
    private String name;
    @ExcelProperty(value = "年龄",index = 2)
    private Integer age;
    @ExcelProperty(value = "性别",index = 3)
    private String gender;
    @ExcelProperty(value = "职业",index = 4)
    private String professional;
    @ExcelProperty(value = "出生日期")
    private Date birthDate;
}
/**
 * 演示表-个人详细信息
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SecondSheetVO {
    @ExcelProperty(value = "序号",index = 0)
    private Integer orderNum;
    @ExcelProperty(value = "学历",index = 1)
    private String education;
    @ExcelProperty(value = "工作地点",index = 2)
    private String workplace;
}


3. 导出业务(多表写入)



easyExcel导入.png


@GetMapping("/export")
    public void exportExcel(HttpServletResponse response){
        String file_name = null;
        try {
            file_name = new String("dicom影像描述匹配模板1.0".getBytes(), "ISO-8859-1");
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition","attachment;filename="+file_name+".xlsx");
            List<FirstSheetVO> firstSheetVOS = new ArrayList<>();
            FirstSheetVO firstSheetVO = new FirstSheetVO();
            firstSheetVO.setOrderNum(1);
            firstSheetVO.setAge(24);
            firstSheetVO.setBirthDate(new Date());
            firstSheetVO.setGender("男");
            firstSheetVO.setProfessional("教师");
            firstSheetVO.setName("李华");
            firstSheetVOS.add(firstSheetVO);
            List<SecondSheetVO> secondSheetVOS = new ArrayList<>();
            SecondSheetVO secondSheetVO = new SecondSheetVO();
            secondSheetVO.setOrderNum(1);
            secondSheetVO.setEducation("本科");
            secondSheetVO.setWorkplace("广东");
            secondSheetVOS.add(secondSheetVO);
            // 表一写入
            ExcelWriter writer = EasyExcel.write(response.getOutputStream(), FirstSheetVO.class).build();
            WriteSheet sheet = EasyExcel.writerSheet(0, "基础信息").build();
            writer.write(firstSheetVOS,sheet);
            // 表二写入
            WriteSheet sheet2 = EasyExcel.writerSheet(1, "详细信息").head(SecondSheetVO.class).build();
            writer.write(secondSheetVOS,sheet2);
            // 关闭流
            writer.finish();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


控制台执行结果:


表序号:0
表名:Sheet1
{0=1, 1=小明, 2=26, 3=男, 4=教师, 5=1995/11/23}
{0=2, 1=小花, 2=25, 3=女, 4=幼师, 5=1993/8/26}
表序号:1
表名:Sheet2
{0=1, 1=本科, 2=九江}
{0=2, 1=大专, 2=武汉}


4. 导入业务


@PostMapping("/upload")
    public String upload(MultipartFile file){
        try {
            ExcelReader reader = EasyExcel.read(file.getInputStream()).build();
            List<ReadSheet> sheets = reader.excelExecutor().sheetList();
            for (int i = 0; i < sheets.size(); i++) {
                ReadSheet readSheet = sheets.get(i);
                System.out.println("表序号:" + readSheet.getSheetNo());
                System.out.println("表名:" + readSheet.getSheetName());
                List<Object> objects = EasyExcel.read(file.getInputStream()).sheet(i).doReadSync();
                objects.forEach(System.out::println);
            }
        } catch (IOException e) {
            log.info(e.getMessage(),e);
            return "fail";
        }
        return "success";
    }


导出结果展示:



更多操作方法,请查阅easyExcel指导手册,里面的介绍很详细。


五、总结



easyexcel和easypoi还有一点区别,easypoi 对定制化的导出支持非常的丰富,如果当前的项目需求,并发量不大、数据量也不大,但是需要导出 excel 的文件样式千差万别,那么我推荐你用 easypoi;反之如果文件体量大的话就使用 easyexcel !

目录
相关文章
|
8天前
|
Python
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分到不同的工作表中。本文通过一个示例代码展示了如何生成一个包含总成绩表和三个班级表的Excel文件。代码首先创建了一个包含学生姓名、班级和各科成绩的数据框,然后按班级分组,将每个班级的数据分别写入不同的工作表。最后,生成的Excel文件将包含四个工作表,分别为总成绩表和三个班级的成绩表。
19 6
按条件将Excel文件拆分到不同的工作表
|
7天前
|
Python
批量将不同的工作簿合并到同一个Excel文件
本文介绍如何使用Python的`pandas`库批量合并不同工作簿至同一Excel文件。通过模拟生成三个班级的成绩数据,分别保存为Excel文件,再将这些文件合并成一个包含所有班级成绩的总成绩单。步骤包括安装必要库、生成数据、保存与合并工作簿。
18 6
|
7天前
|
Python
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分为多个工作表。本文通过一个具体示例,展示了如何根据学生班级将成绩数据拆分到不同的工作表中,并生成一个包含总成绩表和各班级成绩表的Excel文件。代码简洁明了,适合初学者学习和应用。
22 6
|
16天前
|
前端开发
实现Excel文件和其他文件导出为压缩包,并导入
实现Excel文件和其他文件导出为压缩包,并导入
23 1
|
1月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
41 4
|
9天前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
|
2月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
116 4
|
4月前
|
关系型数据库 MySQL Shell
不通过navicat工具怎么把查询数据导出到excel表中
不通过navicat工具怎么把查询数据导出到excel表中
47 0
|
2月前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
63 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
2月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。