日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

h5页面如何预览excel文件_如何让excel文件读取变得更简单

發(fā)布時間:2023/12/19 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 h5页面如何预览excel文件_如何让excel文件读取变得更简单 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天給大家安利一款excel文件導入神器,easyexcel,官方地址:(https://github.com/alibaba/easyexcel)。 在官網文檔中有介紹了其性能。

從上面的性能測試可以看出easyexcel在解析耗時上比poiuserModel模式弱了一些。主要原因是我內部采用了反射做模型字段映射,中間我也加了cache,但感覺這點差距可以接受的。但在內存消耗上差別就比較明顯了,easyexcel在后面文件再增大,內存消耗幾乎不會增加了。但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數據的實體

@Data public class Person {@ExcelProperty(value = "姓名",index = 1)private String name;@ExcelProperty("性別")private String sex;@ExcelProperty("年齡")private int age; }

@ExcelProperty 這個注解用于指定該屬性對應excel文件中的哪一列數據。里面有兩個屬性,一個是value,另一個是index(從0開始),這里不建議 index 和 name 同時用,要么一個對象只用index,要么一個對象只用name去匹配。
3、增加person監(jiān)聽器

@Slf4j public class PersonListener extends AnalysisEventListener<Person> {/*** 每隔5條存儲數據庫,實際使用中可以3000條,然后清理list ,方便內存回收*/private static final int BATCH_COUNT = 5;List<Person> list = new ArrayList();@Overridepublic void invoke(Person person, AnalysisContext analysisContext) {log.info("解析到一條數據:{}",person);if (list.size() >= BATCH_COUNT) {saveData();list.clear();}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {saveData();log.info("所有數據解析完成!");}@Overridepublic void onException(Exception exception, AnalysisContext context) {log.error("解析失敗,但是繼續(xù)解析下一行", exception);}/*** 加上存儲數據庫*/private void saveData(){log.info("{}條數據,開始存儲數據庫!", list.size());log.info("存儲數據庫成功!");} }

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中文件入庫的時候可能需要調用service,service調用dao入庫。那我們如何在這個PersonListener中調用service呢。
首先,在PersonController中注入service.

@Autowiredprivate PersonService personService;

然后,在PersonListener中增加一個有參構造器。

private PersonService personService;public PersonListener(PersonService personService){this.personService = personService;}

最后在PersonController中new PersonListener的時候將service傳進來即可。

@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 "";}

接下來我們在看一下,有一個需求是這樣的,我們需要統計一下導入成功數和失敗數并且要不失敗數寫入到一個excel中返回給頁面,如何實現?
我們調整一下PersonListener

@Slf4j public class PersonListener extends AnalysisEventListener<Person> {private int successCount = 0; // 成功量private int exceptionCount = 0; // 異常量private List<Person> exceptionList = new ArrayList<>(); // 異常數據/*** 每隔5條存儲數據庫,實際使用中可以3000條,然后清理list ,方便內存回收*/private static final int BATCH_COUNT = 5;List<Person> list = new ArrayList();private PersonService personService;public PersonListener(PersonService personService){this.personService = personService;}@Overridepublic void invoke(Person person, AnalysisContext analysisContext) {log.info("解析到一條數據:{}",person);successCount++;list.add(person);if (list.size() >= BATCH_COUNT) {saveData();list.clear();}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {saveData();log.info("所有數據解析完成!");}@Overridepublic void onException(Exception exception, AnalysisContext context) {log.error("解析失敗,但是繼續(xù)解析下一行", exception);Person person = (Person)context.readRowHolder().getCurrentRowAnalysisResult();exceptionList.add(person);exceptionCount++;}/*** 加上存儲數據庫*/private void saveData(){log.info("{}條數據,開始存儲數據庫!", list.size());log.info("存儲數據庫成功!");}/*** 插入結果返回* @return*/public Map<String,Object> getData(){Map<String,Object> map = new HashMap<>();map.put("success",successCount);map.put("exception",exceptionCount);return map;}/*** 失敗數據返回* @return*/public List<Person> getExceptionList(){return exceptionList;} }

在PersonController中將異常數據寫入文件。

@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 : 解析到一條數據:Person(name=執(zhí)偕, sex=男, age=18) 2019-10-20 11:21:59.811 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 解析到一條數據: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 : 解析到一條數據: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 : 解析到一條數據: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 : 解析到一條數據: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條數據,開始存儲數據庫! 2019-10-20 11:21:59.812 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 存儲數據庫成功! 2019-10-20 11:21:59.812 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 解析到一條數據: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 : 解析到一條數據: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 : 解析到一條數據: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 : 解析到一條數據: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條數據,開始存儲數據庫! 2019-10-20 11:21:59.813 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 存儲數據庫成功! 2019-10-20 11:21:59.813 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 所有數據解析完成!

今天就介紹到這了,文中的代碼我已上傳到碼云上,地址:https://gitee.com/javaXiaoCaiJi/zhixie-code-example/tree/master/easyexcel

如果文章對您有幫助,請記得點贊關注喲~
歡迎大家關注我的公眾號<情系IT>,每日推送技術文章供大家學習參考。

總結

以上是生活随笔為你收集整理的h5页面如何预览excel文件_如何让excel文件读取变得更简单的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。