成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

SpringBoot中EasyExcel實現Excel文件的導入導出

瀏覽:147日期:2022-06-16 18:07:41

前言

在我們日常的開發過程中經常會使用Excel文件的形式來批量地上傳下載系統數據,我們最常用的工具是Apache poi,但是如果數據到底上百萬時,將會造成內存溢出的問題,那么我們怎么去實現百萬數據批量導入導出。

正文

Easyexcel

Easyexcel 是阿里巴巴的開源項目,用來優化Excel文件處理過程:

poi消耗內存嚴重:Java解析、生成Excel比較有名的框架有Apache poi、jxl。但他們都存在一個嚴重的問題就是非常的耗內存,poi有一套SAX模式的API可以一定程度的解決一些內存溢出的問題,但poi還是有一些缺陷,比如07版Excel解壓縮以及解壓后存儲都是在內存中完成的,內存消耗依然很大。 easyexcel針對內存做出了優化:重寫了poi對07版Excel的解析,能夠原本一個3M的excel用POI sax依然需要100M左右內存降低到幾M,并且再大的excel不會出現內存溢出。

SpringBoot中EasyExcel實現Excel文件的導入導出

SpringBoot+ EasyExcel實現Excel文件的導入導出

導入依賴

<!--lombok--><dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.2</version> <optional>true</optional></dependency><!--easyExcel--><dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>1.1.2-beat1</version></dependency><!--fastjson--><dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> </exclusion> </exclusions></dependency><dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId></dependency>

為了防止Excel文件被破壞在pom.xml添加以下內容

<build> <plugins> <!-- 讓maven不編譯xls文件,但仍將其打包 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration><nonFilteredFileExtensions> <nonFilteredFileExtension>xls</nonFilteredFileExtension> <nonFilteredFileExtension>xlsx</nonFilteredFileExtension></nonFilteredFileExtensions> </configuration> </plugin> </plugins></build>

application.propertis:配置文件

#temp filesproject.tmp.files.path=/Users/mac/Desktop/image/tmp/files/

在SpringBoot啟動類添加臨時文件設置

@Value('${project.tmp.files.path}')public String filesPath;@BeanMultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); //設置路徑xxx factory.setLocation(filesPath); return factory.createMultipartConfig();}

ExcelUtil:Excel工具類

@Slf4jpublic class ExcelUtil { private static Sheet initSheet; static { initSheet = new Sheet(1, 0); initSheet.setSheetName('sheet'); //設置自適應寬度 initSheet.setAutoWidth(Boolean.TRUE); } public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) { try { response.setCharacterEncoding('UTF-8'); response.setContentType('application/octet-stream;charset=utf-8'); response.setHeader('Content-Disposition', 'attachment;filename=' + URLEncoder.encode(fileName, 'UTF-8')); workbook.write(response.getOutputStream()); } catch (IOException e) { // throw new NormalException(e.getMessage()); } } /** * 讀取少于1000行數據 * * @param filePath 文件絕對路徑 * @return */ public static List<Object> readLessThan1000Row(String filePath) { return readLessThan1000RowBySheet(filePath, null); } /** * 讀小于1000行數據, 帶樣式 * filePath 文件絕對路徑 * initSheet : * sheetNo: sheet頁碼,默認為1 * headLineMun: 從第幾行開始讀取數據,默認為0, 表示從第一行開始讀取 * clazz: 返回數據List<Object> 中Object的類名 */ public static List<Object> readLessThan1000RowBySheet(String filePath, Sheet sheet) { if (!StringUtils.hasText(filePath)) { return null; } sheet = sheet != null ? sheet : initSheet; InputStream fileStream = null; try { fileStream = new FileInputStream(filePath); return EasyExcelFactory.read(fileStream, sheet); } catch (FileNotFoundException e) { log.info('找不到文件或文件路徑錯誤, 文件:{}', filePath); } finally { try {if (fileStream != null) { fileStream.close();} } catch (IOException e) {log.info('excel文件讀取失敗, 失敗原因:{}', e); } } return null; } /** * 讀大于1000行數據 * * @param filePath 文件覺得路徑 * @return */ public static List<Object> readMoreThan1000Row(String filePath) { return readMoreThan1000RowBySheet(filePath, null); } /** * 讀大于1000行數據, 帶樣式 * * @param filePath 文件覺得路徑 * @return */ public static List<Object> readMoreThan1000RowBySheet(String filePath, Sheet sheet) { if (!StringUtils.hasText(filePath)) { return null; } sheet = sheet != null ? sheet : initSheet; InputStream fileStream = null; try { fileStream = new FileInputStream(filePath); ExcelListener excelListener = new ExcelListener(); EasyExcelFactory.readBySax(fileStream, sheet, excelListener); return excelListener.getDatas(); } catch (FileNotFoundException e) { log.error('找不到文件或文件路徑錯誤, 文件:{}', filePath); } finally { try {if (fileStream != null) { fileStream.close();} } catch (IOException e) {log.error('excel文件讀取失敗, 失敗原因:{}', e); } } return null; } /** * 讀大于1000行數據, 帶樣式 * * @return */ public static List<Object> readMoreThan1000RowBySheetFromInputStream(InputStream inputStream, Sheet sheet) { sheet = sheet != null ? sheet : initSheet; InputStream fileStream = null; ExcelListener excelListener = new ExcelListener(); EasyExcelFactory.readBySax(inputStream, sheet, excelListener); return excelListener.getDatas(); } /** * 生成excle * * @param filePath 絕對路徑 * @param data 數據源 * @param head 表頭 */ public static void writeBySimple(String filePath, List<List<Object>> data, List<String> head) { writeSimpleBySheet(filePath, data, head, null); } /** * 生成excle * * @param filePath 路徑 * @param data 數據源 * @param sheet excle頁面樣式 * @param head 表頭 */ public static void writeSimpleBySheet(String filePath, List<List<Object>> data, List<String> head, Sheet sheet) { sheet = (sheet != null) ? sheet : initSheet; if (head != null) { List<List<String>> list = new ArrayList<>(); head.forEach(h -> list.add(Collections.singletonList(h))); sheet.setHead(list); } OutputStream outputStream = null; ExcelWriter writer = null; try { outputStream = new FileOutputStream(filePath); writer = EasyExcelFactory.getWriter(outputStream); writer.write1(data, sheet); } catch (FileNotFoundException e) { log.error('找不到文件或文件路徑錯誤, 文件:{}', filePath); } finally { try {if (writer != null) { writer.finish();}if (outputStream != null) { outputStream.close();} } catch (IOException e) {log.error('excel文件導出失敗, 失敗原因:{}', e); } } } /** * 生成excle * * @param filePath 路徑 * @param data 數據源 */ public static void writeWithTemplate(String filePath, List<? extends BaseRowModel> data) { writeWithTemplateAndSheet(filePath, data, null); } /** * 生成excle * * @param filePath 路徑 * @param data 數據源 * @param sheet excle頁面樣式 */ public static void writeWithTemplateAndSheet(String filePath, List<? extends BaseRowModel> data, Sheet sheet) { if (CollectionUtils.isEmpty(data)) { return; } sheet = (sheet != null) ? sheet : initSheet; sheet.setClazz(data.get(0).getClass()); OutputStream outputStream = null; ExcelWriter writer = null; try { outputStream = new FileOutputStream(filePath); writer = EasyExcelFactory.getWriter(outputStream); writer.write(data, sheet); } catch (FileNotFoundException e) { log.error('找不到文件或文件路徑錯誤, 文件:{}', filePath); } finally { try {if (writer != null) { writer.finish();}if (outputStream != null) { outputStream.close();} } catch (IOException e) {log.error('excel文件導出失敗, 失敗原因:{}', e); } } } /** * 生成多Sheet的excle * * @param filePath 路徑 * @param multipleSheelPropetys */ public static void writeWithMultipleSheel(String filePath, List<MultipleSheelPropety> multipleSheelPropetys) { if (CollectionUtils.isEmpty(multipleSheelPropetys)) { return; } OutputStream outputStream = null; ExcelWriter writer = null; try { outputStream = new FileOutputStream(filePath); writer = EasyExcelFactory.getWriter(outputStream); for (MultipleSheelPropety multipleSheelPropety : multipleSheelPropetys) {Sheet sheet = multipleSheelPropety.getSheet() != null ? multipleSheelPropety.getSheet() : initSheet;if (!CollectionUtils.isEmpty(multipleSheelPropety.getData())) { sheet.setClazz(multipleSheelPropety.getData().get(0).getClass());}writer.write(multipleSheelPropety.getData(), sheet); } } catch (FileNotFoundException e) { log.error('找不到文件或文件路徑錯誤, 文件:{}', filePath); } finally { try {if (writer != null) { writer.finish();}if (outputStream != null) { outputStream.close();} } catch (IOException e) {log.error('excel文件導出失敗, 失敗原因:{}', e); } } } /*********************匿名內部類開始,可以提取出去******************************/ @Data public static class MultipleSheelPropety { private List<? extends BaseRowModel> data; private Sheet sheet; } /** * 解析監聽器, * 每解析一行會回調invoke()方法。 * 整個excel解析結束會執行doAfterAllAnalysed()方法 * * @author: chenmingjian * @date: 19-4-3 14:11 */ @Getter @Setter public static class ExcelListener extends AnalysisEventListener { private List<Object> datas = new ArrayList<>(); /** * 逐行解析 * object : 當前行的數據 */ @Override public void invoke(Object object, AnalysisContext context) { //當前行 // context.getCurrentRowNum() if (object != null) {datas.add(object); } } /** * 解析完所有數據后會調用該方法 */ @Override public void doAfterAllAnalysed(AnalysisContext context) { //解析結束銷毀不用的資源 } } /************************匿名內部類結束,可以提取出去***************************/}

CommonUtil:工具類

public class CommonUtil {/** * 生成32位編碼,不含橫線 * * @return uuid串 */public static String getUUID() { String uuid = UUID.randomUUID().toString().trim().replaceAll('-', ''); return uuid.toUpperCase();}/** * 得到當前日期格式化后的字符串,格式:yyyy-MM-dd(年-月-日) * @return 當前日期格式化后的字符串 */public static String getTodayStr(){ return new SimpleDateFormat('yyyy-MM-dd').format(new Date()) ;}/** * 將對象轉化成json * * @param t * @return * @throws JsonProcessingException */public static <T> String toJson(T t) throws JsonProcessingException { return OBJECT_MAPPER.get().writeValueAsString(t);}}

UserPojoRes:實體類

@Setter@Getter@ToStringpublic class UserPojoRes extends BaseRowModel implements Serializable { private static final long serialVersionUID = -2145503717390503506L; /** * 主鍵 */ @ExcelProperty(value = 'ID', index = 0) private String id; /** * 姓名 */ @ExcelProperty(value = '用戶名', index = 1) private String name; public UserPojoRes(String id, String name) { this.id = id; this.name = name; } public UserPojoRes(){ }}

驗證

模板下載

這里將模板文件放在resources中

@GetMapping('/exportExcelTempalte')@ApiOperation(value = '下載導入模板')public void exportExcelTempalte(HttpServletResponse response) throws Exception { //Resource目錄中的文件 String filePath = '/excels/導入模板.xlsx'; ClassPathResource classPathResource = new ClassPathResource(filePath); Workbook workbook=WorkbookFactory.create(classPathResource.getInputStream()); ExcelUtil.downLoadExcel('導入模板.xlsx', response, workbook);}

Excel文件導入

@PostMapping('/importExcel')@ApiOperation(value = 'Excel文件導入')public Response importExcel(HttpServletRequest request, MultipartFile file, HttpServletResponse response) throws Exception { List<Object> objects = ExcelUtil.readMoreThan1000RowBySheetFromInputStream(file.getInputStream(),null); List<UserPojoRes> list = new ArrayList<>(); for (Object o : objects) { UserPojoRes userPojoRes = new UserPojoRes(); List<String> stringList = (List<String>) o; userPojoRes.setId(stringList.get(0) != null ? stringList.get(0).toString() : ''); userPojoRes.setName(stringList.get(1) != null ? stringList.get(0).toString() : ''); list.add(userPojoRes); } String json = CommonUtil.toJson(list); return new Response(json);}

SpringBoot中EasyExcel實現Excel文件的導入導出

Excel文件導出

@Value('${project.tmp.files.path}')public String filesPath;@GetMapping('/exportExcel')@ApiOperation(value = 'Excel文件導出')public void exportExcel(HttpServletResponse response) throws Exception { //創建臨時文件 String path = filesPath + CommonUtil.getUUID() + '.xlsx'; List<UserPojoRes> list = new ArrayList<>(); UserPojoRes userPojoRes = new UserPojoRes('009', '張三'); UserPojoRes userPojoRes1 = new UserPojoRes('009', '李四'); list.add(userPojoRes); list.add(userPojoRes1); ExcelUtil.writeWithTemplate(path, list); // 根據excel創建對象 Workbook workbook = WorkbookFactory.create(new FileInputStream(path)); String fileName = '用戶模塊' + CommonUtil.getTodayStr() + '.xlsx'; ExcelUtil.downLoadExcel(fileName, response, workbook);}

SpringBoot中EasyExcel實現Excel文件的導入導出

到此這篇關于SpringBoot中EasyExcel實現Excel文件的導入導出的文章就介紹到這了,更多相關Java Excel文件導入導出內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: excel
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
成人午夜av影视| 亚洲另类中文字| 国产日韩欧美不卡| 国产一区二区日韩精品| 精品国产91乱码一区二区三区| 日韩和欧美一区二区| 日韩欧美国产一区在线观看| 精品无码三级在线观看视频| 国产欧美日本一区视频| 91久久精品一区二区三| 天涯成人国产亚洲精品一区av| 欧美一级精品在线| 成人性生交大片免费看中文| 夜夜揉揉日日人人青青一国产精品| 欧美日韩成人激情| 国产高清一区日本| 亚洲第一福利视频在线| 精品国产伦一区二区三区免费| 91捆绑美女网站| 精品一区二区三区欧美| 亚洲精品免费电影| 久久影院电视剧免费观看| 91福利精品视频| 国产精品99精品久久免费| 樱桃国产成人精品视频| 久久亚洲影视婷婷| 欧美伦理视频网站| 91麻豆国产自产在线观看| 国产真实精品久久二三区| 亚洲高清免费视频| 中文字幕一区二区三区四区| 欧美成人精品高清在线播放| 欧美日韩国产高清一区| 99精品视频在线观看| 国产一区二区主播在线| 日韩av电影一区| 一区二区三区精品视频在线| 亚洲国产精品二十页| 欧美成人三级电影在线| 欧美日韩国产精选| 欧美在线短视频| 色综合久久久久久久久久久| 粉嫩一区二区三区性色av| 激情六月婷婷久久| 蜜桃视频第一区免费观看| 亚洲国产视频一区二区| 一区二区三区中文字幕电影| 中文字幕一区二区三区蜜月| 国产精品麻豆99久久久久久| 国产欧美一区二区三区鸳鸯浴| 日韩美女一区二区三区| 日韩一区二区麻豆国产| 日韩一级片在线播放| 欧美电影一区二区三区| 91精品国产美女浴室洗澡无遮挡| 欧美午夜精品一区二区三区| 91免费观看视频在线| a级精品国产片在线观看| 成人av动漫在线| 99国产欧美久久久精品| 91片在线免费观看| 在线免费亚洲电影| 欧美日本一区二区| 欧美一区二区黄色| 久久一区二区视频| 国产精品久久久久久久久快鸭| 国产精品美女久久久久久久| 日韩久久一区二区| 午夜亚洲福利老司机| 久久精品国产99国产| 国产精品一区二区在线播放| zzijzzij亚洲日本少妇熟睡| 色婷婷综合久久久中文一区二区 | 欧美高清在线视频| 综合久久综合久久| 亚洲bt欧美bt精品777| 免费观看久久久4p| 国产露脸91国语对白| www.成人在线| 欧美中文字幕一区| 日韩亚洲欧美一区二区三区| 久久久久久久一区| 亚洲精品国产第一综合99久久| 午夜精品aaa| 国产一区在线观看麻豆| av电影在线观看不卡| 欧美理论片在线| 国产偷国产偷亚洲高清人白洁 | 日韩一级大片在线| 国产精品福利在线播放| 亚洲国产日日夜夜| 久久91精品久久久久久秒播| 91在线国产福利| 欧美刺激脚交jootjob| 亚洲欧美日韩在线不卡| 免费高清成人在线| 色哟哟亚洲精品| 26uuu久久天堂性欧美| 亚洲伦理在线精品| 国精产品一区一区三区mba桃花 | 亚洲一区精品在线| 精品一区二区三区影院在线午夜| 色一情一伦一子一伦一区| 日韩一区二区电影网| 亚洲视频免费在线| 国产一区二区三区久久久| 欧美夫妻性生活| 亚洲精品久久久久久国产精华液| 日本色综合中文字幕| 99久久99精品久久久久久| 亚洲精品一区二区三区四区高清 | 国模娜娜一区二区三区| 欧美日韩中文一区| 中文字幕亚洲在| 国产在线精品一区二区三区不卡 | 欧美电影免费观看高清完整版在线 | 成人国产精品免费网站| 日韩欧美你懂的| 亚洲国产成人高清精品| 日本韩国欧美国产| 国产精品久久久久aaaa| 激情综合亚洲精品| 日韩欧美久久久| 日韩精品一区第一页| 91免费国产在线| 国产精品美女www爽爽爽| 国产又粗又猛又爽又黄91精品| 欧美日韩你懂的| 亚洲午夜激情av| 一本到一区二区三区| 国产亚洲视频系列| 国产99久久久精品| 精品国产区一区| 日本va欧美va瓶| 欧美精品日韩综合在线| 亚洲国产综合在线| 欧美中文字幕亚洲一区二区va在线| 久久麻豆一区二区| 国产成人在线视频免费播放| 日韩免费高清视频| 狠狠网亚洲精品| 久久青草国产手机看片福利盒子 | 国产99久久久国产精品| 久久久久久久久一| 国产在线精品不卡| 久久久国产精品麻豆| 国产**成人网毛片九色| 欧美激情一区二区三区蜜桃视频| 懂色av一区二区三区蜜臀| 久久久久国产精品人| 国产综合久久久久影院| 久久婷婷色综合| 国产精品99久久久久久有的能看| 欧美激情一区二区三区全黄| 成人免费av在线| 亚洲精品综合在线| 一本大道久久a久久精品综合| 亚洲va欧美va人人爽| 欧美日韩精品一区二区三区蜜桃 | 99精品欧美一区二区三区小说 | 国产欧美精品日韩区二区麻豆天美| 丁香激情综合国产| 一区二区三区日韩| 精品久久99ma| 99久久99久久综合| 狂野欧美性猛交blacked| 久久精品亚洲乱码伦伦中文| 91日韩一区二区三区| 日韩电影在线观看电影| 欧美精品一区男女天堂| 成人av影视在线观看| 午夜久久电影网| 国产亚洲福利社区一区| 色综合久久久网| 精品亚洲成a人| 一区二区三区在线不卡| 精品国产凹凸成av人导航| 不卡视频在线看| 日韩精品久久久久久| 亚洲少妇中出一区| 欧美大胆一级视频| 欧美亚洲一区三区| 精东粉嫩av免费一区二区三区| 最近中文字幕一区二区三区| 精品国产凹凸成av人网站| 欧美性大战久久久久久久蜜臀| 国产一区二区精品久久| 亚洲国产精品欧美一二99| 欧美精品一区二区三区蜜臀| 欧美三级韩国三级日本一级| a4yy欧美一区二区三区| 九九国产精品视频| 免费在线看成人av| 亚洲国产sm捆绑调教视频| 国产精品水嫩水嫩| 337p粉嫩大胆噜噜噜噜噜91av | 久久99精品国产麻豆不卡| 一区二区三区在线视频播放| 国产精品久久看| 久久久777精品电影网影网|