如何使用java,spring boot读取一个包含150k条记录的excel文件,在db中验证,持久化行?

rqdpfwrv  于 2021-06-27  发布在  Java
关注(0)|答案(0)|浏览(212)

我有一个spring启动应用程序和一个restapi端点,它接收一个包含150k行和5列的excel文件。其中一些列是employee表(sqlserver)的复合主键列的一部分
表employeeid-varchar(20),name-varchar(50),age-smallint,effective \u date-date,expiration \u date-date,last \u updated \u ts-timestamp,last \u updated \u by-varchar(20)
复合主键列:employeeid、name、age、effectivedate
excel列:employeeid、name、age、effectivedate、expirationdate
excel excel样本:企业的excel excel excel样本:企业的雇员ID |雇员ID |雇员ID |雇员ID |名称名称|名称|名称|名称124;年龄124;有效日期|有效日期124;到期日期|截止日期|最后一次更新的美国最新的美国最新更新的美国ts 124;最后一次更新的美国最最后一次更新的美国最最新的美国最最新的美国最新的美国最新的美国最最新的美国最新的美国最最新的美国最新的美国最新的时间124 | | | | 124;124;124;124;124;124;124;124;124;124;124;124;124;124;124;;| 3 |鲍勃| 35 | 2015-10-10 | 2018-12-05 | 2018-11-20 |人力资源|
这里,约翰从2019年5月30日开始活动,没有有效期。alice目前处于活动状态,但将于2021-02-15到期。鲍勃已经过期了,因为他过去有一个过期日期。
要求:
输入将是上述excel文件。我们必须执行下面提到的验证,并将数据插入/更新到表中。
要求用户使用ui上传包含员工详细信息的excel文件,并进行以下验证。
在excel中添加新列isdatavalid。它将包含值“y”或“n”。如果某行的任何验证失败,则将其标记为“n”。否则,就是“y”。
每行必须有employeeid、姓名、年龄、生效日期。
过期日期是可选的。如果存在,则过期日期必须大于等于生效日期
excel的每一行都应该验证数据类型(例如:雇员姓名应该只包含字符串,而不是数字等)。
excel的每行有5列,前4列是employee表的复合主键列。excel中的每一行都必须与employee表进行比较。
答。如果该行已存在,但已过期:请在excel中插入包含数据的新行(包含新的生效日期和过期日期)。b。如果该行已存在,但尚未过期:不插入包含数据的新行,更新为“n”。c。如果该行不在表中,请插入数据并将isvalid标记为“y”。
输出:excel文件以及新创建的列“isvalid”应该通过restapi控制器发送回用户,这样用户就可以知道excel的任何行中是否有任何验证错误。
流量:
从RESTAPI获取excel文件作为多部分文件输入。
使用apachepoi读取excel并获取工作簿和工作表。
迭代每一行,执行上述验证,对照employee表检查是否存在记录,按照上述验证规则在isvalid列的excel行中相应地标记它们。
如果必须保存/更新该行,请将该行保留在db中。
在对excel中的所有行进行迭代、验证并标记为有效或无效之后,将其从restapi发送回调用者。
问题:
excel表有大约150000行,验证,我可以采用什么方法?常规循环,jpasaveall对于500-1000条记录(取决于数据)的小样本集大约需要1分钟。
考虑使用批处理(springbatch),但是如何使它足够快,以便用户能够在最多几分钟内下载excel。
我找不到一个足够独特的重复问题。请在评论处提供链接。
请建议我一些设计方案,以完成我的要求操作。提前谢谢。
代码:
我们使用apachepoi进行excel操作
控制器类 @PostMapping(path = "/employee/validation") public ResponseEntity<InputStreamResource> validateEmployeeAndUpload(@RequestParam Multipartfile excelFile) { SXSSFWorkbook workbook = new SXSSFWorkbook(); HttpHeaders header = new HttpHeaders(); try{ //All validations handled here workbook = validateAndGetWorkbook(excelFile); ByteArrayOutputstream outputStream = new ByteArrayOutputStream(); workbook.write(outputStream); ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toArray()); headers.add("Content-Disposition", "attachment; filename=Employee.xlsx"); return ResponseEntity.ok().headers(header).body(new InputStreamResource(inputStream)); }catch(Exception e){ ....return bad request } } 员工实体
@Entity @Table(name="employee) class Employee implements Serializable{ @EmbeddedId EmployeeId employeeId; @Column("expiration_date) Date expirationDate; @Column("last_updated_ts) Timestamp lastUpdatedTs; @Column("last_updated_by) String lastUpdatedBy; } employeeid嵌入id类 `@Embeddable
class EmployeeId implements Serializable{

@Column(name = "employee_id)
String employeeId;

@Column(name = "employeeName")
String employeeName;

@Column(name = "age")
Integer age;

@Column(name = "effective_date")
Date effectiveDate;

}` 存储库接口 `interface EmployeeRepository implements CrudRepository<Employee, EmployeeId>{

}`

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题