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 !

目录
相关文章
|
15天前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
23 4
|
19天前
|
JavaScript 前端开发 数据处理
Vue导出el-table表格为Excel文件的两种方式
Vue导出el-table表格为Excel文件的两种方式
|
1月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
1月前
|
JSON 数据格式
LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
64 2
|
28天前
|
前端开发 JavaScript API
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
116 0
|
1月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
|
3月前
|
关系型数据库 MySQL Shell
不通过navicat工具怎么把查询数据导出到excel表中
不通过navicat工具怎么把查询数据导出到excel表中
43 0
|
1月前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
45 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
2月前
|
数据采集 存储 数据挖掘
使用Python读取Excel数据
本文介绍了如何使用Python的`pandas`库读取和操作Excel文件。首先,需要安装`pandas`和`openpyxl`库。接着,通过`read_excel`函数读取Excel数据,并展示了读取特定工作表、查看数据以及计算平均值等操作。此外,还介绍了选择特定列、筛选数据和数据清洗等常用操作。`pandas`是一个强大且易用的工具,适用于日常数据处理工作。
|
3月前
|
SQL JSON 关系型数据库
n种方式教你用python读写excel等数据文件
n种方式教你用python读写excel等数据文件

热门文章

最新文章