ad

玩转 Excel 数据导入-英雄云拓展知识分享

匿名投稿 11238 2024-04-18

1. 概览

在平常开发中,想必都遇到过批处理的需求,简单来讲就是要求上传一个 Excel 文件,从 Excel 中读取数据,然落后行业务处理。对此,你怎样做呢?

使用 poi 一行行的读取数据,然落后行类型转换,最后调用业务方法。非常不错,恭喜你完成了这项工作。但,到此为止了吗,我们将继续深入。

1.1. 背景

常常会遇到这类情况,上线了一个需求,业务觉得不错,只是一条条录入效力太低,随后提出能不能弄一个 Excel 批量处理?固然,我们可以直接撸码,顺便加个小班,一气呵成。

简单回想一下,你有多久不处理手工的类型转换?

比如 Spring MVC 框架中,我们直接使用 JavaBean 来接收 request 要求的数据,那有无一种方式可以从 Excel 中读取出 JavaBean 呢?

玩转 Excel 数据导入-英雄云拓展知识分享

Excel 数据转换

1.2. 目标

依照标准操作流程,框架需要支持:

  1. 从 Class 中读取信息生成 Excel 模板,该模板需要对部份数据进行保护,不允许用户修改;
  2. 用户获得 Excel 模板后,按要求完成相干信息填写,然后将 Excel 转换为 JavaBean 对象,快捷完成业务操作;
  3. 前面两步需要支持嵌套 Bean,无需将关联对象的属性进行展开;

2. 快捷入门

2.1. 添加 starter 及相干依赖

在 Spring boot 项目的 pom 中增加以下依赖:

<dependency>

    <groupId>com.geekhalo.lego</groupId>

    <artifactId>lego-starter-excelasbean</artifactId>

    <version>0.1.1</version>

</dependency>

<dependency>

    <groupId>org.apache.poi</groupId>

    <artifactId>poi</artifactId>

</dependency>

2.2. 注入 ExcelAsBeanService 服务

在代码中直接注入 ExcelAsBeanService 对象,具体以下:

// 注入 excelAsBeanService

// 由 ExcelAsBeanAutoConfiguration 完成 ExcelAsBeanService 的注册

@Autowired

private ExcelAsBeanService excelAsBeanService;

2.3. 创建 Excel 模板

关键代码以下:

/**

 * 创建 Excel 模板

 * @param workbook

 * @param sheetName

 * @param dataCls

 * @param <D>

 */

default <D> void writTemplateToSheet(HSSFWorkbook workbook, String sheetName, Class<D> dataCls){

    writTemplateToSheet(workbook.createSheet(sheetName), dataCls);

}

/**

 * 创建 Excel 模板

 * @param sheet 待写入的 sheet

 * @param dataCls 待写入数据

 * @param <D>

 */

<D> void writTemplateToSheet(HSSFSheet sheet, Class<D> dataCls);

该方法,从 class 中读取信息,并将其写入到 Excel 模板。

2.4. 从 Excel 中读取并转换为 JavaBean

关键代码以下

/**

 * 从 Sheet 中读取数据

 * @param sheet 待读取数据的 Sheet

 * @param dataCls 待读取数据的类型

 * @param <D>

 */

default <D> List<D> readFromSheet(HSSFSheet sheet, Class<D> dataCls){

    List<D> result = Lists.newArrayList();

    readFromSheet(sheet, dataCls, d -> result.add(d));

    return result;

}

/**

 * 从 Sheet 中读取数据

 * @param sheet 待读取数据的 Sheet

 * @param dataCls 待读取数据的类型

 * @param consumer 回调器,完成数据解析后,直接调用回调器

 * @param <D>

 */

<D> void readFromSheet(HSSFSheet sheet, Class<D> dataCls, Consumer<D> consumer);

该方法,从 Sheet 中读取信息,并将其转换为 JavaBean;

2.5. 普通 bean 示例

首先,我们创建 JavaBean,并添加相干注解,具体以下:

@Data

public class CreateUserFromV1 implements CreateUserFrom{

    @HSSFTemplateHeader(title = "姓名")

    private String name;

    @HSSFTemplateHeader(title = "诞生日期")

    private Date birthAt;

    @HSSFTemplateHeader(title = "年龄")

    private Integer age;

}

其中,@HSSFTemplateHeader 中的 title 为展现信息。

调用 writTemplateToSheet 方法,获得 Excel 以下:

简单Bean模板

如图可见,Excel 中有 姓名(name),诞生日期(birthAt) 和 年龄(age) 3列,当试图对 Header 进行修改时,弹出提示信息“受保护区域,不允许操作”。

拿到模板后,在Excel中填入信息以下:

简单Bean输入数据

将该 Excel 上传服务器,调用 readFromSheet 方法,获得终究 Bean 以下:

简单Bean解析结果

2.6. 嵌套 bean 示例

首先,创建一个关联类,以下:

@Data

public class AddressForm {

    @HSSFTemplateHeader(title = "省")

    private String l1;

    @HSSFTemplateHeader(title = "市")

    private String l2;

    @HSSFTemplateHeader(title = "区")

    private String l3;

    @HSSFTemplateHeader(title = "详细地址")

    private String l4;

}

关联对象没有甚么特别的地方,只是增加了 @HSSFTemplateHeader 注解。

新建 Bean 以下:

@Data

public class CreateUserFromV2 implements CreateUserFrom{

    @HSSFTemplateHeader(title = "姓名")

    private String name;

    @HSSFTemplateHeader(title = "诞生日期")

    private Date birthAt;

    @HSSFTemplateHeader(title = "年龄")

    private Integer age;

    @HSSFEmbedded

    private AddressForm addressForm;

}

也没有特殊的地方,只是在 关联对象上增加了 @HSSFEmbedded 注解。

导出模板,查看效果:

嵌套Bean模板

如图所示,Excel 中新增 省、市、区、详细地址几列,用于数据输入。

一样,再拿到模板后,在Excel中填入信息以下:

嵌套Bean数据

将该 Excel 上传服务器进行处理,获得终究 Bean 以下:

嵌套Bean结果

3. 设计&扩大

3.1. 关键设计

整体设计以下:

整体结构

  1. Class 经过解析后取得一个 HSSFSheetReader,用于负责所有的读操作;
  2. 每一个 HSSFSheetReader 提供 write template 和 read data 两组关键功能;
  3. HSSFRowToBeanWriter 经过 ColumnToBeanPropertyWriter 完成每列到Bean属性的映照;
  4. write 模板关键流程以下:
  5. 为 Header Row 设置默许样式;
  6. 从 HSSFRowToBeanWriter 获得解析后的 title 信息,并写入 Cell
  7. 设置Header样式为保护模式,不允许任意修改;
  8. reader data 流程以下:
  9. 从 Header 中获得 path 和 Index 的映照;
  10. 基于 ColumnToBeanPropertyWriter,从 Cell 中读取数据,并写入到 Bean 的属性;
  11. 回调消费函数,处理转换好的 Bean 对象;

3.2. 功能扩大

读取链设计

关键履行流程以下:

  1. HSSFCellReader 从 Cell 中读取数据;
  2. BeanPropertyWriter 将数据写入到 JavaBean 的属性;

装配流程以下:

  1. String 以托管 bean 的方式,提供 CellReaderFactory 和 BeanPropertyWriterFactory 实现;
  2. 这些实现会注入到 HSSFCellReaderFactories 和 BeanPropertyWriterFactories,由 Factories 对其进行一致管理;
  3. DefaultBeanPropertyWriterChainFactory 从 Factories 中获得适合的 HSSFCellReader 和 BeanPropertyWriter,将其封装为 BeanPropertyWriterChain;

4. 项目信息

项目仓库地址:https://gitee.com/litao851025/lego

项目文档地址:https://gitee.com/litao851025/lego/wikis/support/ExcelAsBean--%E6%95%B0%E6%8D%AE%E5%AF%BC%E5%85%A5



选择英雄云云表单=选择更智能的办公工具

>>>>🚀🌟 点击注册 免费试用 更高级的-英雄云企业级云表单 🌟🚀 😃👉🌐>>>>

在现代企业管理中,数据的高效管理和处理至关重要。随着信息技术的不断发展,英雄云云表单已经成为了提高数据录入、管理和分析效率的不可或缺的工具。让我们来深入探讨英雄云-云表单的几大优势。

基础字段:多样性满足业务需求

英雄云云表单中包括了各种基础字段,如行文多行文本数字输入框单选框复选框下拉框下拉复选框日期时间分割线等。这些字段的多样性使用户可以根据具体的业务需求,轻松进行文本、数据和时间信息的录入或修改。例如,您可以使用单行文本字段录入员工姓名、产品型号等,或者使用下拉框进行多选,根据不同情况选择更加方便的字段类型。

高级字段:提升工作效率

英雄云云表单还提供了高级字段,如地址图片附件手写签名手机子表关联数据关联查询以及流水号。这些高级字段在基础字段的基础上升级,可帮助用户完成一些琐碎的工作。例如,使用地址字段可以避免逐字打字,而流水号字段可以自动生成规律性的编号,非常适用于合同编号生成等场景。

部门成员字段:精确管理与通讯录的关联

英雄云的部门成员字段允许企业对各个部门的成员进行精确管理。用户可以通过部门成员字段获取通讯录中的部门成员信息,应用于记录报销人、报销部门等场景。这些成员字段还细分为成员单选成员多选,可根据具体需求在通讯录中选择一个或多个成员。

聚合表:数据处理更智能

英雄云聚合表功能用于对已存在的表单数据进行聚合计算,从而得到一张聚合表,后续其他表单可调用聚合表进行数据联动、关联查询和关联数据等操作完成数据处理。这一功能可应用于多种场景,如进销存管理、财务管理和门店零售管理等,帮助企业完成数据处理,提高工作效率。

表单权限设置:灵活管理数据访问

英雄云的表单权限设置允许用户根据企业的具体需求管理表单的访问和操作权限。用户可以根据系统权限或自定义权限对不同成员或团队进行权限设置,以确保数据的安全和合规性。这一功能使企业能够根据变化的业务需求和团队结构,实时调整权限设置。

自定义打印模板:文档输出更便捷

英雄云云表单支持自定义打印模板,可将表单数据转换为可打印的Word文档。用户可以根据自己的需求进行排版和编辑,将产品规格说明书等文档轻松生成。这一功能提供了一种标准化的文档输出方式,简化了信息整理的过程。

综合来看,选择英雄云云表单意味着选择更智能、更灵活、更高效的数据管理工具。无论是提高工作效率,精确管理数据,还是实现数据处理,英雄云云表单都能满足您的多样化需求,助力您的业务发展。

如果您正在寻找一款强大的云表单工具,不妨考虑英雄云,它将为您带来更多的便捷和智能,助您事半功倍。


免责声明:

本网址(www.yingxiongyun.com)发布的材料主要源于独立创作和网友匿名投稿等来源。此处提供的所有信息仅供参考之用。我们致力于提供准确且可信的信息,但不对材料的完整性或真实性作出任何保证。用户应自行验证相关信息的正确性,并对其决策承担全部责任。对于由于信息的错误、不准确或遗漏所造成的任何损失,本网址不承担任何法律责任。本网站所展示的所有内容,如文字、图像、标志、音频、视频、软件和程序等的版权均属于原创作者。如果任何组织或个人认为网站内容可能侵犯其知识产权,或包含不准确之处,请即刻联系我们进行相应处理。

上一篇:这样才是正确使用Excel表格的方式-英雄云拓展知识分享
下一篇:Excel中的万能快捷键,除Ctrl+E外,还有Ctrl+Q-英雄云拓展知识分享
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×