【springboot+easypoi】一行代碼搞定excel導入導出

原文:https://www.jianshu.com/p/5d67fb720ece

?

?

  • 開發中經常會遇到excel的處理,導入導出解析等等,java中比較流行的用poi,但是每次都要寫大段工具類來搞定這事兒,此處推薦一個別人造好的輪子【easypoi】,下面介紹下“輪子”的使用。

pom引入

  • 不再需要其他jar
       <dependency><groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-web</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-annotation</artifactId> <version>3.0.3</version> </dependency> 

編寫實體類

  • 此處注意必須要有空構造函數,否則會報錯“對象創建錯誤”
  • 關于注解@Excel,其他還有@ExcelCollection,@ExcelEntity ,@ExcelIgnore,@ExcelTarget等,此處我們用不到,可以去官方查看更多
屬性類型類型說明
nameStringnull列名
needMergebooleanfasle縱向合并單元格
orderNumString"0"列的排序,支持name_id
replaceString[]{}值得替換 導出是{a_id,b_id} 導入反過來
savePathString"upload"導入文件保存路徑
typeint1導出類型 1 是文本 2 是圖片,3 是函數,10 是數字 默認是文本
widthdouble10列寬
heightdouble10列高,后期打算統一使用@ExcelTarget的height,這個會被廢棄,注意
isStatisticsbooleanfasle自動統計數據,在追加一行統計,把所有數據都和輸出這個處理會吞沒異常,請注意這一點
isHyperlinkbooleanfalse超鏈接,如果是需要實現接口返回對象
isImportFieldbooleantrue校驗字段,看看這個字段是不是導入的Excel中有,如果沒有說明是錯誤的Excel,讀取失敗,支持name_id
exportFormatString""導出的時間格式,以這個是否為空來判斷是否需要格式化日期
importFormatString""導入的時間格式,以這個是否為空來判斷是否需要格式化日期
formatString""時間格式,相當于同時設置了exportFormat 和 importFormat
databaseFormatString"yyyyMMddHHmmss"導出時間設置,如果字段是Date類型則不需要設置 數據庫如果是string 類型,這個需要設置這個數據庫格式,用以轉換時間格式輸出
numFormatString""數字格式化,參數是Pattern,使用的對象是DecimalFormat
imageTypeint1導出類型 1 從file讀取 2 是從數據庫中讀取 默認是文件 同樣導入也是一樣的
suffixString""文字后綴,如% 90 變成90%
isWrapbooleantrue是否換行 即支持\n
mergeRelyint[]{}合并單元格依賴關系,比如第二列合并是基于第一列 則{1}就可以了
mergeVerticalbooleanfasle縱向合并內容相同的單元格
import cn.afterturn.easypoi.excel.annotation.Excel;import java.util.Date;public class Person { @Excel(name = "姓名", orderNum = "0") private String name; @Excel(name = "性別", replace = {"男_1", "女_2"}, orderNum = "1") private String sex; @Excel(name = "生日", exportFormat = "yyyy-MM-dd", orderNum = "2") private Date birthday; public Person(String name, String sex, Date birthday) { this.name = name; this.sex = sex; this.birthday = birthday; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } } 

導入導出公用方法

public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass,String fileName,boolean isCreateHeader, HttpServletResponse response){ ExportParams exportParams = new ExportParams(title, sheetName); exportParams.setCreateHeadRows(isCreateHeader); defaultExport(list, pojoClass, fileName, response, exportParams); } public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass,String fileName, HttpServletResponse response){ defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName)); } public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response){ defaultExport(list, fileName, response); } private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) { Workbook workbook = ExcelExportUtil.exportExcel(exportParams,pojoClass,list); if (workbook != null); downLoadExcel(fileName, response, workbook); } private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) { try { response.setCharacterEncoding("UTF-8"); response.setHeader("content-Type", "application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); workbook.write(response.getOutputStream()); } catch (IOException e) { throw new NormalException(e.getMessage()); } } private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) { Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF); if (workbook != null); downLoadExcel(fileName, response, workbook); } public static <T> List<T> importExcel(String filePath,Integer titleRows,Integer headerRows, Class<T> pojoClass){ if (StringUtils.isBlank(filePath)){ return null; } ImportParams params = new ImportParams(); params.setTitleRows(titleRows); params.setHeadRows(headerRows); List<T> list = null; try { list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params); }catch (NoSuchElementException e){ throw new NormalException("模板不能為空"); } catch (Exception e) { e.printStackTrace(); throw new NormalException(e.getMessage()); } return list; } public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass){ if (file == null){ return null; } ImportParams params = new ImportParams(); params.setTitleRows(titleRows); params.setHeadRows(headerRows); List<T> list = null; try { list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params); }catch (NoSuchElementException e){ throw new NormalException("excel文件不能為空"); } catch (Exception e) { throw new NormalException(e.getMessage()); } return list; } 

對的,沒看錯,這就可以導出導入了,看起來代碼挺多,其實是提供了多個導入導出方法而已

測試

  @RequestMapping("export")public void export(HttpServletResponse response){ //模擬從數據庫獲取需要導出的數據 List<Person> personList = new ArrayList<>(); Person person1 = new Person("路飛","1",new Date()); Person person2 = new Person("娜美","2", DateUtils.addDate(new Date(),3)); Person person3 = new Person("索隆","1", DateUtils.addDate(new Date(),10)); Person person4 = new Person("小貍貓","1", DateUtils.addDate(new Date(),-10)); personList.add(person1); personList.add(person2); personList.add(person3); personList.add(person4); //導出操作 FileUtil.exportExcel(personList,"花名冊","草帽一伙",Person.class,"海賊王.xls",response); } @RequestMapping("importExcel") public void importExcel(){ String filePath = "F:\\海賊王.xls"; //解析excel, List<Person> personList = FileUtil.importExcel(filePath,1,1,Person.class); //也可以使用MultipartFile,使用 FileUtil.importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass)導入 System.out.println("導入數據一共【"+personList.size()+"】行"); //TODO 保存數據庫 } 

導出結果

導出結果

測試導入

導出結果再添加一行,執行,輸出導入數據行數




作者:小塵哥
鏈接:https://www.jianshu.com/p/5d67fb720ece
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277527.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277527.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277527.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用java編寫一個計算器_用java程序編寫一個計算器

展開全部給你一個參考&#xff0c;希望不62616964757a686964616fe58685e5aeb931333330343261要被百度吞了當晚餐import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.text.DecimalFor…

TypeScript基礎入門 - 接口 - 可索引的類型

轉載地址 TypeScript基礎入門 - 接口 - 可索引的類型 項目實踐倉庫 https://github.com/durban89/typescript_demo.git tag: 1.0.11 為了保證后面的學習演示需要安裝下ts-node&#xff0c;這樣后面的每個操作都能直接運行看到輸出的結果。 npm install -D ts-node 后面自己在練…

jquery中的ajax方法(備忘)

參考&#xff1a;https://www.cnblogs.com/tylerdonet/p/3520862.html w3school:http://www.w3school.com.cn/jquery/ajax_ajax.asp 1.url: 要求為String類型的參數&#xff0c;&#xff08;默認為當前頁地址&#xff09;發送請求的地址。 2.type: 要求為String類型的參數&…

java高級類_Java高級類特性(一)

權限類內同包不同包子類不同包非子類private√default√√protected√√√public√√√√四、super關鍵字的使用package com.test.java;/** super可以用來修飾屬性、方法、構造器* 1)當子類與父類中有同名的屬性時&#xff0c;可以通過"super.屬性"顯式的調用父類中聲…

Android.對話框(AlertDialog/Toast/Snackbar)

1、資料&#xff1a; 1.1、Android提醒微技巧&#xff0c;你真的了解Dialog、Toast和Snackbar嗎&#xff1f; - CSDN博客.html&#xff08;https://blog.csdn.net/guolin_blog/article/details/51336415&#xff09; 1.2、Android界面設計之對話框——定制Toast、AlertDialog -…

第4次作業

轉載于:https://www.cnblogs.com/wzh2920330283/p/11027254.html

基于Docker搭建Percona XtraDB Cluster數據庫集群

本文實驗的環境參數 阿里云ECS Centos7.5Docker version 18.06.0-cepercona/percona-xtradb-cluster:5.7Percona XtraDB Cluster的鏡像下載地址&#xff1a;https://hub.docker.com/r/percona/percona-xtradb-cluster/ 怎么使用Docke和下載鏡像&#xff0c;請查看Docker的官方文…

java publickey_數字證書中讀取PublicKey

1. 讀取https簽發證書中的key1) 在下面的代碼中,是實現讀取證書字符串來讀取key的,CERTIFICATE 就是一個證書的字符串, 而方法cf.generateCertificate() 接受的是一個InputStream 流,當然這個地方也可以讀取一個文件 new FileInputSream("file path")即可!public Str…

UIViewController 小結

1 生命周期 init方法中view仍然是nil&#xff0c;此時&#xff0c;如果寫了self.view&#xff0c;直接調用loadView。看名字也知道&#xff0c;loadView在viewDidLoad之前。initWithNibName:bundle:&#xff0c;designated初始化方法2 代碼組織 init&#xff0c;只有需要傳一些…

多核學習方法介紹

通過上篇文章的學習&#xff0c;我們知道&#xff0c;相比于單個核函數&#xff0c;多核模型可以具有更高的靈活性。經過多個核函數映射后的高維空間是由多個特征空間組合而成的組合空間&#xff0c;而顯然組合空間可以組合各個子空間不同的特征映射能力&#xff0c;能夠將異構…

java注解類型_Java注解類型

本篇文章幫大家學習java注解類型&#xff0c;包含了Java注解類型使用方法、操作技巧、實例演示和注意事項&#xff0c;有一定的學習價值&#xff0c;大家可以用來參考。標記注解類型標記注解類型是沒有元素的注解類型&#xff0c;甚至沒有默認值。標記注解由注解處理工具使用。…

linux go環境安裝和基本項目結構

最近項目中要用到Go語言&#xff0c;所以簡單總結一下安裝和配置&#xff0c;Go這個語言本身就限定了很多規范&#xff0c;比如項目設置&#xff0c;編程風格等&#xff0c;開發中就不需要再因為各種規范問題糾結了&#xff0c;直接用官方規定的能避免很多坑&#xff0c;下面直…

運輸層

運輸層-TCP 簡介 通俗點來說&#xff0c;運輸層是連接底層和用戶層的&#xff0c;運輸層向它上面的應用層提供通信服務&#xff0c;它屬于通信部分的最高層&#xff0c;同時也是用戶功能的最低層。 運輸層重要功能是復用和分用。復用&#xff1a;發送方不同應用進程可以使用同一…

對AI"出錯"零容忍?美國加強AI推理解釋能力研究

隨著硅谷私企引領人工智能&#xff08;AI&#xff09;爆發式發展&#xff0c;美國國防部曾發布報告稱&#xff0c;將“立即采取行動”加速AI和自動化技術研發。據《麻省理工技術評論》雜志網站近日報道&#xff0c;美國國防高級研究計劃局&#xff08;DARPA&#xff09;已經著手…

java調用指定瀏覽器_Java調用瀏覽器打開網頁完整實例

本文實例講述了java調用瀏覽器打開網頁的方法。分享給大家供大家參考。具體實現方法如下&#xff1a;package com.yifang.demo;import java.io.file;public class openpagedemo {public static void main(string[] args) {try {//string url "http://www.baidu.com"…

[HDU517] 小奇的集合

題目鏈接 顯然有貪心每次選擇最大的兩個數來做。 于是暴力地把最大的兩個數調整到非負&#xff08;暴力次數不超過1e5&#xff09;&#xff0c;接下來使用矩陣乘法即可。 \[ \begin{pmatrix} B\\S\\T \end{pmatrix} \begin{pmatrix} 1&1&0\\ 1&0&0\\ 1&1&…

phpStudy

很多朋友在學習php的過程中會看到phpstudy這個東西&#xff0c;那么phpstudy是做什么的呢&#xff1f;有什么用&#xff1f;接下來的這篇文章將個大家來詳細的介紹一下phpstudy的內容。 首先在百度百科上對于phpstudy的定義是一個PHP調試環境的程序集成包。 該程序包集成最新的…

殺入共享汽車市場的PonyCar,是下一個犧牲者還是引領者?

曾幾何時&#xff0c;汽車是財富、地位的象征&#xff0c;擁有一輛汽車就感覺自己處處高別人一等。但如今&#xff0c;汽車已然成為一件隨處可見的商品&#xff0c;甚至已經到車來車往、熙熙攘攘的地步。根據中商產業研究院發布的《2018-2023年中國汽車行業市場前景及投資機會研…

python圖片內容長度識別_Python實現識別圖片內容的方法分析

本文實例講述了Python實現識別圖片內容的方法。分享給大家供大家參考&#xff0c;具體如下&#xff1a;python識別圖片內容。這里我的環境為windows64位&#xff0c;python2.7.14需要用到PIL模塊和tesseract模塊。首先需要安裝pip包管理&#xff0c;安裝方法可參考附錄windows下…

AJAX工具

代碼如下 var AppAjax {baseUrl:AppConfig.apiUrl//【POST請求】,post:function(pUrl,pData,pSuccessFun){pUrl AppAjax.baseUrl pUrl;$.ajax({headers: {token: AppConfig.token},url:pUrl,type:POST,data:JSON.stringify(pData),//pData,//JSON.stringify(),contentType:&q…