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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

發布時間:2023/12/19 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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、創建接收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監聽器

@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("解析失敗,但是繼續解析下一行", 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("解析失敗,但是繼續解析下一行", 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=執偕, sex=男, age=18) 2019-10-20 11:21:59.811 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 解析到一條數據:Person(name=執偕2, sex=男, age=19) 2019-10-20 11:21:59.811 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 解析到一條數據:Person(name=執偕3, sex=男, age=20) 2019-10-20 11:21:59.811 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 解析到一條數據:Person(name=執偕4, sex=男, age=21) 2019-10-20 11:21:59.812 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 解析到一條數據:Person(name=執偕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=執偕6, sex=男, age=23) 2019-10-20 11:21:59.812 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 解析到一條數據:Person(name=執偕7, sex=男, age=24) 2019-10-20 11:21:59.813 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 解析到一條數據:Person(name=執偕8, sex=男, age=25) 2019-10-20 11:21:59.813 INFO 17748 --- [nio-8080-exec-1] c.zhixie.easyexcel.demo.PersonListener : 解析到一條數據:Person(name=執偕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文件读取变得更简单的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产美女无遮挡网站 | 日韩av网页| 成人动漫一区二区三区 | 久久久久久国产精品一区 | 99久久国产视频 | 黑人3p波多野结衣在线观看 | 国产成人精品亚洲男人的天堂 | 国产亚洲精品美女 | 日韩爱爱爱 | 蜜桃视频黄色 | 邻居少妇张开腿让我爽了在线观看 | 欧美大片在线免费观看 | 久久亚洲AV无码精品 | 激情宗合 | 午夜视频色 | 日韩精品在线一区二区 | 国产嫩草影院久久久久 | 亚洲av毛片一区二二区三三区 | av大片在线免费观看 | 天天综合永久 | 天天干夜夜嗨 | 深夜精品视频 | 亚洲国内在线 | aa一级黄色片 | 纯爱无遮挡h肉动漫在线播放 | 国产传媒一级片 | 成人免费视频国产免费 | √天堂中文官网8在线 | 一本久久a精品一合区久久久 | 日本韩国在线观看 | 日本在线视频www | 欧美午夜在线视频 | 人妻一区二区视频 | 婷婷射图 | 女人裸体免费网站 | 久久免费看少妇高潮v片特黄 | 国产成人无码精品久久久久 | 国产精品羞羞答答在线 | 涩涩的视频在线观看 | 91在线观看免费视频 | 国产无套在线观看 | 中文字幕无线码 | 激情福利社 | 免费看日批 | 欧美xxxxxx片免费播放软件 | 中文字幕国产综合 | 我的好妈妈在线观看 | 无码一区二区三区免费视频 | 中国av毛片| 无码国产色欲xxxxx视频 | 国产精品99久久久久久动医院 | 自拍偷拍亚洲 | 香蕉福利 | 国产欧美久久久精品免费 | 成年人免费黄色片 | 日韩免费一级片 | 天堂视频中文在线 | 日韩欧美不卡 | 久久er99热精品一区二区 | 影音先锋亚洲资源 | 色吊丝一区二区 | 亚洲免费视频观看 | 日本毛片在线看 | 美妇湿透娇羞紧窄迎合 | 色多多在线观看 | 日本视频不卡 | 日本亚洲网站 | 色999在线 | 精品成在人线av无码免费看 | 激情五月婷婷在线 | 日韩视频在线观看二区 | 久久午夜夜伦鲁鲁片 | 日本r级电影在线观看 | 亚洲高清一区二区三区 | 精彩毛片 | 7777精品久久久久久 | 高级毛片| 亚洲人成人 | 国产熟妇搡bbbb搡bbbb搡 | zzjizzji亚洲日本少妇 | 国产一区亚洲一区 | 欧美激情15p| 国产激情无套内精对白视频 | 国产精品爽爽 | 天天摸夜夜操 | 国产精品偷伦视频免费看 | 五月婷网| 成人午夜免费电影 | 国产精品麻豆果冻传媒在线播放 | 久久的色偷偷 | 日本www网站| 欧美一级免费 | 精品色哟哟 | 亚洲一区,二区 | 日韩 欧美 亚洲 国产 | 婷婷激情电影 | 神马午夜一区二区 | 很很干很很日 | 久久国产亚洲精品无码 |