h5页面如何预览excel文件_如何让excel文件读取变得更简单
今天給大家安利一款excel文件導入神器,easyexcel,官方地址:(https://github.com/alibaba/easyexcel)。 在官網(wǎng)文檔中有介紹了其性能。
從上面的性能測試可以看出easyexcel在解析耗時上比poiuserModel模式弱了一些。主要原因是我內(nèi)部采用了反射做模型字段映射,中間我也加了cache,但感覺這點差距可以接受的。但在內(nèi)存消耗上差別就比較明顯了,easyexcel在后面文件再增大,內(nèi)存消耗幾乎不會增加了。但poi userModel就不一樣了,簡直就要爆掉了。想想一個excel解析200M,同時有20個人再用估計一臺機器就掛了。
如何使用呢
1、引入maven依賴
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.0.5</version> </dependency>由于改jar包對poi進行了一些封裝,因此需要注釋掉項目引用的poi依賴,不然會有版本沖突。
2、創(chuàng)建接收excel數(shù)據(jù)的實體
@ExcelProperty 這個注解用于指定該屬性對應excel文件中的哪一列數(shù)據(jù)。里面有兩個屬性,一個是value,另一個是index(從0開始),這里不建議 index 和 name 同時用,要么一個對象只用index,要么一個對象只用name去匹配。
3、增加person監(jiān)聽器
4、文件上傳方法
@RestController @Slf4j public class PersonController {@PostMapping("importFile")public String readPerson(MultipartFile file){PersonListener personListener = new PersonListener();try {// headRowNumber(2) 這里可以設置1,因為頭就是一行。如果多行頭,可以設置其他值。不傳入也可以,他沒有指定頭,也就是默認1行EasyExcel.read(file.getInputStream(), Person.class,personListener).sheet().headRowNumber(1).doRead();}catch (IOException ioe){log.info("讀取excel異常={}",ioe);}return "";} }這樣代碼基本就算完成了。接下來我們看看如何在
spring框架中使用
我們知道,在spring中文件入庫的時候可能需要調(diào)用service,service調(diào)用dao入庫。那我們?nèi)绾卧谶@個PersonListener中調(diào)用service呢。
首先,在PersonController中注入service.
然后,在PersonListener中增加一個有參構造器。
private PersonService personService;public PersonListener(PersonService personService){this.personService = personService;}最后在PersonController中new PersonListener的時候?qū)ervice傳進來即可。
@Autowiredprivate PersonService personService;@PostMapping("importFile")public String readPerson(MultipartFile file){PersonListener personListener = new PersonListener(personService);try {// headRowNumber(2) 這里可以設置1,因為頭就是一行。如果多行頭,可以設置其他值。不傳入也可以,他沒有指定頭,也就是默認1行EasyExcel.read(file.getInputStream(), Person.class,personListener).sheet().headRowNumber(2).doRead();}catch (IOException ioe){log.info("讀取excel異常={}",ioe);}return "";}接下來我們在看一下,有一個需求是這樣的,我們需要統(tǒng)計一下導入成功數(shù)和失敗數(shù)并且要不失敗數(shù)寫入到一個excel中返回給頁面,如何實現(xiàn)?
我們調(diào)整一下PersonListener
在PersonController中將異常數(shù)據(jù)寫入文件。
@RestController @Slf4j public class PersonController {@Autowiredprivate PersonService personService;@PostMapping("importFile")public String readPerson(MultipartFile file){PersonListener personListener = new PersonListener(personService);try {// headRowNumber(1) 這里可以設置1,因為頭就是一行。如果多行頭,可以設置其他值。不傳入也可以,他沒有指定頭,也就是默認1行EasyExcel.read(file.getInputStream(), Person.class,personListener).sheet().headRowNumber(1).doRead();}catch (IOException ioe){log.info("讀取excel異常={}",ioe);}Map<String, Object> data = personListener.getData();String exception = data.get("exception") + "";int exceptionCount = Integer.parseInt(exception);if(exceptionCount>0){String fileName = System.currentTimeMillis() + ".xlsx";// 這里 需要指定寫用哪個class去讀,然后寫到第一個sheet,名字為模板 然后文件流會自動關閉EasyExcel.write("E://upload/file/"+fileName, Person.class).sheet("模板").doWrite(personListener.getExceptionList());data.put("fileName",fileName);}return data.toString();} }我們寫個頁面測試一下
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>文件上傳</title> </head> <body> <form action="/importFile" method="post" enctype="multipart/form-data"><input type="file" name="file"/><button type="submit">提交</button> </form> </body> </html>下面是測試的日志文件
2019-10-20 11:21:59.809 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 解析到一條數(shù)據(jù):Person(name=執(zhí)偕, sex=男, age=18) 2019-10-20 11:21:59.811 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 解析到一條數(shù)據(jù):Person(name=執(zhí)偕2, sex=男, age=19) 2019-10-20 11:21:59.811 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 解析到一條數(shù)據(jù):Person(name=執(zhí)偕3, sex=男, age=20) 2019-10-20 11:21:59.811 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 解析到一條數(shù)據(jù):Person(name=執(zhí)偕4, sex=男, age=21) 2019-10-20 11:21:59.812 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 解析到一條數(shù)據(jù):Person(name=執(zhí)偕5, sex=男, age=22) 2019-10-20 11:21:59.812 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 5條數(shù)據(jù),開始存儲數(shù)據(jù)庫! 2019-10-20 11:21:59.812 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 存儲數(shù)據(jù)庫成功! 2019-10-20 11:21:59.812 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 解析到一條數(shù)據(jù):Person(name=執(zhí)偕6, sex=男, age=23) 2019-10-20 11:21:59.812 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 解析到一條數(shù)據(jù):Person(name=執(zhí)偕7, sex=男, age=24) 2019-10-20 11:21:59.813 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 解析到一條數(shù)據(jù):Person(name=執(zhí)偕8, sex=男, age=25) 2019-10-20 11:21:59.813 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 解析到一條數(shù)據(jù):Person(name=執(zhí)偕9, sex=男, age=26) 2019-10-20 11:21:59.813 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 4條數(shù)據(jù),開始存儲數(shù)據(jù)庫! 2019-10-20 11:21:59.813 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 存儲數(shù)據(jù)庫成功! 2019-10-20 11:21:59.813 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 所有數(shù)據(jù)解析完成!今天就介紹到這了,文中的代碼我已上傳到碼云上,地址:https://gitee.com/javaXiaoCaiJi/zhixie-code-example/tree/master/easyexcel
如果文章對您有幫助,請記得點贊關注喲~歡迎大家關注我的公眾號<情系IT>,每日推送技術文章供大家學習參考。
總結
以上是生活随笔為你收集整理的h5页面如何预览excel文件_如何让excel文件读取变得更简单的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开启市场新格局 且看新华三计算与存储新品
- 下一篇: 六十万的成长_我的EA策略分析和实现