SpringBoot 整合eazyPoi 4.3.0 Excel数据导入导出(持续更新功能)
目錄
- 依賴
- 注解用法說(shuō)明
-
- @ExcelTarget 綁定Id
- @Excel 用在字段上面
- @ExcelCollection
- 實(shí)體代碼
- Excel導(dǎo)出
-
- 正常數(shù)量導(dǎo)出(1-2W條)
- 大數(shù)據(jù)量導(dǎo)出
- 多sheet導(dǎo)出
- 單元格超鏈接
- 非注解導(dǎo)出(ExcelExportEntity+Map)
- 統(tǒng)計(jì)(數(shù)值)功能
- 設(shè)置字典dict&下拉選項(xiàng)addressList
- Excel導(dǎo)入
-
- ImportParams參數(shù)
- 正常導(dǎo)入 importExcel
- 大數(shù)據(jù)量 importExcelBySax
- 異步
- 讀取合并的表頭
- 驗(yàn)證導(dǎo)入(篩出符合與不符合的數(shù)據(jù))
- 表頭的groupName
- 導(dǎo)入圖片
- CSV導(dǎo)入
- excel轉(zhuǎn)換csv
- Excel轉(zhuǎn)html
- ExportParams 表格參數(shù)配置
- Excel 模板功能
-
- 基本功能
-
- {{}} 輸出
- {{n:}} 數(shù)值類型
- 時(shí)間格式化 & str長(zhǎng)度 & 三目運(yùn)算 & 保留小數(shù)
- 遍歷的3種區(qū)別 {{fe:}}{{!fe:}}{{$fe:}}
- {{#fe:}}{{v_fe:}} 橫向遍歷
- word模板
依賴
文檔
<!-- https://mvnrepository.com/artifact/cn.afterturn/easypoi-spring-boot-starter -->
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.3.0</version>
</dependency>
注解用法說(shuō)明
- @Excel 用在字段上面
- @ExcelCollection 表示根對(duì)象中的list
- @ExcelEntity 表示根對(duì)象中的實(shí)體
- @ExcelIgnore 忽略導(dǎo)出
- @ExcelTarget 綁定Id
@ExcelTarget 綁定Id
解決了相同的實(shí)體去映射Excel 但是表頭名字不太相同
實(shí)現(xiàn)根據(jù)班級(jí)不同映射不同名字
這里的@ExcelTarget 表示使用X這個(gè)對(duì)象是可以針對(duì)不同字段做不同處理
同樣的ExcelEntity 和ExcelCollection 都支持這種方式
@Excel 用在字段上面
| 屬性 | 類型 | 默認(rèn)值 | 功能 |
|---|---|---|---|
| name | String | null | 列名,支持ExcelTarget |
| needMerge | boolean | fasle | 縱向合并單元格(用于含有l(wèi)ist中,單個(gè)的單元格,合并list創(chuàng)建的多個(gè)row) |
| orderNum | String | “0” | 列的排序,支持ExcelTarget |
| replace | String[] | {} | 字符替換 導(dǎo)出是{“替換值_源”,“替換值_源”} |
| savePath | String | “upload” | 導(dǎo)入文件保存路徑,如果是圖片可以填寫(xiě),默認(rèn)是upload/className/ IconEntity這個(gè)類對(duì)應(yīng)的就是upload/Icon/ |
| type | int | 1 | 導(dǎo)出類型 1 是文本 2 是圖片,3 是函數(shù),10 是數(shù)字 默認(rèn)是文本 |
| width | double | 10 | 列寬 |
| height | double | 10 | 列高,后期打算統(tǒng)一使用@ExcelTarget的height,這個(gè)會(huì)被廢棄,注意 |
| isStatistics | boolean | fasle | 自動(dòng)統(tǒng)計(jì)數(shù)據(jù),在追加一行統(tǒng)計(jì),把所有數(shù)據(jù)都和輸出[這個(gè)處理會(huì)吞沒(méi)異常,請(qǐng)注意這一點(diǎn)] |
| isHyperlink | boolean | FALSE | 超鏈接,如果是需要實(shí)現(xiàn)接口返回對(duì)象 |
| isImportField | boolean | TRUE | 校驗(yàn)字段,看看這個(gè)字段是不是導(dǎo)入的Excel中有,如果沒(méi)有說(shuō)明是錯(cuò)誤的Excel,讀取失敗,支持ExcelTarget |
| exportFormat | String | “” | 導(dǎo)出的時(shí)間格式,以這個(gè)是否為空來(lái)判斷是否需要格式化日期 |
| importFormat | String | “” | 導(dǎo)入的時(shí)間格式,以這個(gè)是否為空來(lái)判斷是否需要格式化日期 |
| format | String | “” | 時(shí)間格式,相當(dāng)于同時(shí)設(shè)置了exportFormat 和 importFormat |
| databaseFormat | String | “yyyyMMddHHmmss” | 導(dǎo)出時(shí)間設(shè)置,如果字段是Date類型則不需要設(shè)置 數(shù)據(jù)庫(kù)如果是string 類型,這個(gè)需要設(shè)置這個(gè)數(shù)據(jù)庫(kù)格式,用以轉(zhuǎn)換時(shí)間格式輸出 |
| numFormat | String | “” | 數(shù)字格式化,參數(shù)是Pattern,使用的對(duì)象是DecimalFormat |
| imageType | int | 1 | 導(dǎo)出類型 1 從file讀取 2 是從數(shù)據(jù)庫(kù)中讀取 默認(rèn)是文件 同樣導(dǎo)入也是一樣的 |
| suffix | String | “” | 文字后綴,如值實(shí)90 suffix="%" 變成90% |
| isWrap | boolean | TRUE | 是否換行 即支持\n |
| mergeRely | int[] | {} | 合并單元格依賴關(guān)系,比如第二列合并是基于第一列 則{0}就可以了 |
| mergeVertical | boolean | fasle | 縱向合并內(nèi)容相同的單元格 |
| fixedIndex | int | -1 | 對(duì)應(yīng)excel的列,忽略名字 |
| isColumnHidden | boolean | FALSE | 導(dǎo)出隱藏列 |
看下如何使用在下面有完全代碼可以copy
@Data
@ExcelTarget("user1")
@Accessors(fluent = true)
public class TestBean implements Serializable {@Excel(name = "A班級(jí)編號(hào)_user1,B班級(jí)編號(hào)_user2" ,//表頭名稱width = 15.0, //寬度orderNum = "0", //排序 這個(gè)排序在@ExcelEntity中也可以連貫使用 ExcelCollection內(nèi)的Excel不可以連貫使用needMerge = true)private Integer id;@Excel(name = "姓名",width = 15.0,orderNum = "1",needMerge = true)private String name;@Excel(name = "性別",replace = {"男_1","女_2"}, //字符替換 源實(shí)1代表男 2代表女suffix = "生",//添加后綴orderNum = "2",needMerge = true)private int sex;@Excel(name = "生日", databaseFormat = "yyyyMMddHHmmss",//如果是字符串的話>>同步數(shù)據(jù)庫(kù)格式format = "yyyy-MM-dd HH:mm:ss",//設(shè)置導(dǎo)入導(dǎo)出格式orderNum = "3",needMerge = true)private Date bir;@ExcelIgnore //不生成數(shù)據(jù)@Excel(name = "生日2", databaseFormat = "yyyy-MM-dd HH:mm:ss",format = "yyyy-MM-dd HH:mm:ss",orderNum = "4")private Date bir2;@Excel(name = "照片",type = 2,//設(shè)置數(shù)據(jù)類型 2是圖片imageType = 1,//圖片使用方式orderNum = "8",width = 30,height = 30)private String img;@Excel(name = "照片2",type = 2,imageType = 2,orderNum = "8",width = 30,height = 30)private byte[] img1;@ExcelEntity //表示這是一個(gè)實(shí)體 其實(shí)相當(dāng)于在根實(shí)體中添加其他字段的感覺(jué)private Card card;@ExcelCollection(name = "物品",orderNum = "7")//這個(gè)集合會(huì)在這個(gè)對(duì)象內(nèi)循環(huán)遍歷..之前的字段數(shù)據(jù)只在第一行顯示private List<Order> orders;
@ExcelCollection
| 屬性 | 類型 | 默認(rèn)值 | 功能 |
|---|---|---|---|
| id | String | null | 定義ID |
| name | String | null | 定義集合列名,支持ExcelTarget |
| orderNum | int | 0 | 排序,支持ExcelTarget |
| type | Class<?> | ArrayList.class | 導(dǎo)入時(shí)創(chuàng)建對(duì)象使用 |
實(shí)體代碼
3個(gè)實(shí)體
@Data
@ExcelTarget("user1")
@Accessors(fluent = true)
public class TestBean implements Serializable {public static String imgPath="imgs/company/baidu.png";@Excel(name = "A班級(jí)編號(hào)_user1,B班級(jí)編號(hào)_user2" ,//表頭名稱width = 15.0, //寬度orderNum = "0", //排序 這個(gè)排序在@ExcelEntity中也可以連貫使用 ExcelCollection內(nèi)的Excel不可以連貫使用needMerge = true)private Integer id;@Excel(name = "姓名",width = 15.0,orderNum = "1",needMerge = true)private String name;@Excel(name = "性別",replace = {"男_1","女_2"}, //字符替換 源實(shí)1代表男 2代表女suffix = "生",//添加后綴orderNum = "2",needMerge = true)private int sex;@Excel(name = "生日", databaseFormat = "yyyyMMddHHmmss",//如果是字符串的話>>同步數(shù)據(jù)庫(kù)格式format = "yyyy-MM-dd HH:mm:ss",//設(shè)置導(dǎo)入導(dǎo)出格式orderNum = "3",needMerge = true)private Date bir;@ExcelIgnore //不生成數(shù)據(jù)@Excel(name = "生日2", databaseFormat = "yyyy-MM-dd HH:mm:ss",format = "yyyy-MM-dd HH:mm:ss",orderNum = "4")private Date bir2;@Excel(name = "照片",type = 2,//設(shè)置數(shù)據(jù)類型 2是圖片imageType = 1,//圖片使用方式orderNum = "8",width = 30,height = 30)private String img;@Excel(name = "照片2",type = 2,imageType = 2,orderNum = "8",width = 30,height = 30)private byte[] img1;@ExcelEntity //表示這是一個(gè)實(shí)體 其實(shí)相當(dāng)于在根實(shí)體中添加其他字段的感覺(jué)private Card card;@ExcelCollection(name = "物品",orderNum = "7")//這個(gè)集合會(huì)在這個(gè)對(duì)象內(nèi)循環(huán)遍歷..之前的字段數(shù)據(jù)只在第一行顯示private List<Order> orders;//獲取10條 完整數(shù)據(jù)public static List<TestBean> getListUser(){List<TestBean> list=new ArrayList<>();for (int i = 1; i <= 10; i++) {list.add(new TestBean().id(i).name("姓名"+i).bir(new Date()).sex(i%2==0?1:2).card(new Card()).orders(getOrder()).img(imgPath));}return list;}//只獲取根對(duì)象數(shù)據(jù) 沒(méi)有圖片,list,實(shí)體public static List<TestBean> getBigListFor10000(int page){List<TestBean> list=new ArrayList<>();for (int i = page; i <= page*10000; i++) {list.add(new TestBean().id(i).name("姓名"+i).bir(new Date()).sex(i%2==0?1:2));}return list;}public static List<Order> getOrder(){List<Order> list=new ArrayList<>();for (int i = 1; i <=3 ; i++) {list.add(new Order().id(i).name("物品"+i));}return list;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getSex() {return sex;}public void setSex(int sex) {this.sex = sex;}public Date getBir() {return bir;}public void setBir(Date bir) {this.bir = bir;}public Date getBir2() {return bir2;}public void setBir2(Date bir2) {this.bir2 = bir2;}public String getImg() {return img;}public void setImg(String img) {this.img = img;}public byte[] getImg1() {return img1;}public void setImg1(byte[] img1) {this.img1 = img1;}public Card getCard() {return card;}public void setCard(Card card) {this.card = card;}public List<Order> getOrders() {return orders;}public void setOrders(List<Order> orders) {this.orders = orders;}//校驗(yàn)文件目錄public static String existsDir(){String dir="D:/eazyPoi/";File savefile = new File(dir);if (!savefile.exists()) {savefile.mkdirs();}return dir;}}
@Accessors(fluent = true)
@ExcelTarget("card1")
@Data
public class Card{@Excel(name = "身份證",orderNum = "5")private String id ;@Excel(name = "地址",orderNum = "6")private String addr;public Card() {this.id = "123212321";this.addr = "北京市朝陽(yáng)區(qū)";}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getAddr() {return addr;}public void setAddr(String addr) {this.addr = addr;}
}
@Accessors(fluent = true)
@ExcelTarget("order1")
@Data
public class Order{@Excel(name = "序號(hào)",orderNum = "1")public int id ;@Excel(name = "物品",orderNum = "2")private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
Excel導(dǎo)出
正常數(shù)量導(dǎo)出(1-2W條)
package com.ruoyi.web.eazyPoi;import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.handler.inter.IExcelExportServer;
import cn.afterturn.easypoi.handler.inter.IWriter;
import org.apache.poi.hssf.record.DVALRecord;
import org.apache.poi.ss.usermodel.Workbook;import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;public class Test {public static void main(String[] args) throws Exception {Test.exportExcel();}//1萬(wàn)條以下的方法public static void exportExcel()throws Exception{ExportParams exportParams=new ExportParams("用戶信息表", "用戶信息");List<TestBean> listUser = TestBean.getListUser();Workbook sheets = ExcelExportUtil.exportExcel(exportParams, TestBean.class, listUser);sheets.write(new FileOutputStream(TestBean.existsDir()+System.currentTimeMillis() +".xls"));sheets.close();}}
大數(shù)據(jù)量導(dǎo)出
這里面的這個(gè)@Override是一個(gè)循環(huán)函數(shù),obj是外層傳的queryParams(參4)
但是page會(huì)一直循環(huán)到>obj 比比如我們分10頁(yè)的數(shù)據(jù) page會(huì)循環(huán)超過(guò)10
- sql條件分頁(yè)到最后一頁(yè)后查詢?yōu)?/li>
public class Test {public static void main(String[] args) throws Exception {Test.exportExcel();}public static void exportBigExcel()throws Exception{Workbook workbook = null;Date start = new Date();ExportParams exportParams=new ExportParams("用戶信息表", "用戶信息");workbook = ExcelExportUtil.exportBigExcel(exportParams, TestBean.class, new IExcelExportServer() {/*** @param obj 總頁(yè)數(shù)* @param page 當(dāng)前頁(yè)數(shù)* @return*/@Overridepublic List<Object> selectListForExcelExport(Object obj, int page) {//page是從1開(kāi)始遞增**(應(yīng)該做成外面?zhèn)鲙拙徒刂沟綆椎⒉皇腔刂奔?所以手動(dòng)限制下if((int)obj==page){return null;};//最后返回的表格對(duì)象List<Object> listUser = new ArrayList<>();//模擬業(yè)務(wù)分頁(yè)查詢listUser.addAll(TestBean.getBigListFor10000(page));return listUser;}},10);workbook.write(new FileOutputStream(TestBean.existsDir()+System.currentTimeMillis() +".xlsx"));workbook.close();}}
多sheet導(dǎo)出
public void moveSheet(){//sheet集合信息List<Map<String,Object>> sheetList=new ArrayList<Map<String,Object>>();//循環(huán)方式創(chuàng)建2個(gè)sheetfor (int i = 0; i <2 ; i++) {//獲取數(shù)據(jù)List<TestBean> listUser = TestBean.getListUser();//封裝sheet信息Map<String,Object> mapData=new HashMap<String, Object>();ExportParams params = new ExportParams();//sheet名稱params.setSheetName("學(xué)生信息表"+i);mapData.put("title",params);//表格信息mapData.put("entity",TestBean.class);//實(shí)體類mapData.put("data",listUser);//列表集sheetList.add(mapData);//sheet集合}//導(dǎo)出Workbook workbook = ExcelExportUtil.exportExcel(sheetList, ExcelType.XSSF);FileOutputStream fos = null;try {fos = new FileOutputStream("D:/home/excel/測(cè)試多Sheet.xls");workbook.write(fos);fos.close();} catch (Exception e) {e.printStackTrace();}}
單元格超鏈接
@Data
public class HyperLinkEntity {@Excel(name = "名稱", isHyperlink = true)private String name;@Excel(name = "URL")private String url;@Excel(name="備注")private String comment;
}
@Testpublic void test() throws Exception {//數(shù)據(jù)集合List<HyperLinkEntity> list = new ArrayList<HyperLinkEntity>();HyperLinkEntity client = new HyperLinkEntity();client.setName("百度");client.setUrl("https://www.baidu.com/");client.setComment("XXXXXXXXXX");list.add(client);client = new HyperLinkEntity();client.setName("新浪");client.setUrl("http://www.sina.com.cn/");client.setComment("XXXXXXXXXX");list.add(client);//表格信息ExportParams params = new ExportParams("超鏈接測(cè)試", "超鏈接測(cè)試", ExcelType.XSSF);//設(shè)置攔截params.setDataHandler(new ExcelDataHandlerDefaultImpl() {/*** 獲取這個(gè)字段的 Hyperlink ,07版本需要,03版本不需要* @param obj 設(shè)置的注解實(shí)體* @param name 注釋name屬性* @param value 字段值*/@Overridepublic Hyperlink getHyperlink(CreationHelper creationHelper, Object obj, String name, Object value) {Hyperlink link = creationHelper.createHyperlink(HyperlinkType.URL);System.out.println(name);System.out.println(value);HyperLinkEntity e = (HyperLinkEntity) obj;link.setAddress(e.getUrl());//超鏈接地址link.setLabel(e.getName());//返回此超鏈接的文本標(biāo)簽HyperlinkType type = link.getType();//獲取超鏈接類型HyperlinkType枚舉return link;}});Workbook workbook = ExcelExportUtil.exportExcel(params, HyperLinkEntity.class, list);FileOutputStream fos = new FileOutputStream("D:/home/excel/ExcelExportForLink.xlsx");workbook.write(fos);fos.close();}
非注解導(dǎo)出(ExcelExportEntity+Map)
//表頭信息List 相當(dāng)于@ExcelList<ExcelExportEntity> entity = new ArrayList<ExcelExportEntity>();//設(shè)置字段信息for (int i = 1; i <=5 ; i++) {ExcelExportEntity exportEntity=new ExcelExportEntity("姓名","name"+i);exportEntity.setWidth(8.0);//表格寬度exportEntity.setHeight(4.0);//表格高度entity.add(exportEntity);}//數(shù)據(jù)列表List<Map<String,Object>> list=new ArrayList<>();for (int i = 0; i <100 ; i++) {Map<String,Object> map=new HashMap<>();map.put("name1",i);map.put("name2",i);map.put("name3",i);map.put("name4",i);map.put("name5",i);list.add(map);}Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("測(cè)試", "測(cè)試"), entity, list);FileOutputStream fos = new FileOutputStream("D:/home/excel/ExcelExportForMap"+System.currentTimeMillis()+".xls");workbook.write(fos);fos.close();
統(tǒng)計(jì)(數(shù)值)功能
設(shè)置字典dict&下拉選項(xiàng)addressList
@Accessors(fluent = true)
@ExcelTarget("card1")
@Data
@AllArgsConstructor
public class Card{@Excel(name = "name")private String name ;@Excel(name = "性別",orderNum = "2",dict = "sexType" ,addressList = true)private Integer sex;@Excel(name = "證件類型",orderNum = "1",dict = "cardType")private String type;@Excel(name = "證件編號(hào)")private String id ;
}
實(shí)現(xiàn)IExcelDictHandler
List<Card> list=new ArrayList<>();list.add(new Card("姓名1",1,"sfz","112233"));list.add(new Card("姓名2",2,"hz","112233"));ExportParams exportParams = new ExportParams("title", "sheet");exportParams.setDictHandler(new IExcelDictHandler(){//注解使用 addressList屬性@Overridepublic List<Map> getList(String dict) {List<Map> list = new ArrayList<>();Map<String, String> dictMap = new HashMap<>();if(dict.equals("sexType")){dictMap = new HashMap<>();dictMap.put("dictKey", "1");dictMap.put("dictValue", "男");list.add(dictMap);dictMap = new HashMap<>();dictMap.put("dictKey", "2");dictMap.put("dictValue", "女");list.add(dictMap);}return list;}/** 注解dict屬性* @param dict dict名稱* @param obj 注解對(duì)象* @param name 注解name屬性* @param value 值* @return*/@Overridepublic String toName(String dict, Object obj, String name, Object value) {if("cardType".equals(dict)){if ("sfz".equals(value)) {return "身份證";} else if ("hz".equals(value)) {return "護(hù)照";}}if("sexType".equals(dict)){if ("1".equals(value.toString())) {return "男";} else if ("2".equals(value.toString())) {return "女";}}return null;}@Overridepublic String toValue(String s, Object o, String s1, Object o1) {return null;}});Workbook sheets = ExcelExportUtil.exportExcel(exportParams, Card.class, list);FileOutputStream fos = null;fos = new FileOutputStream("D:/home/excel/ExcelExportForMap"+System.currentTimeMillis()+".xls");sheets.write(fos);fos.close();
Excel導(dǎo)入
ImportParams參數(shù)
| 值 | 類型 | 默認(rèn)值 | 功能 |
|---|---|---|---|
| titleRows | int | 0 | 表格標(biāo)題行數(shù),默認(rèn)0 |
| headRows | int | 1 | 表頭行數(shù),默認(rèn)1 |
| startRows | int | 0 | 設(shè)置開(kāi)始讀取的位置,也就是從標(biāo)題下0為全部 1讀取第一行以后的數(shù)據(jù) |
| keyIndex | int | 0 | 主鍵設(shè)置,如何這個(gè)cell沒(méi)有值,就跳過(guò) 或者認(rèn)為這個(gè)是list的下面的值,這一列必須有值,不然認(rèn)為這列為無(wú)效數(shù)據(jù) |
| startSheetIndex | int | 0 | 與sheetNum兩個(gè)配合使用 在多個(gè)sheet時(shí) 有10個(gè)sheet我們想讀取1-4個(gè)sheet |
| sheetNum | int | 1 | 上傳表格需要讀取的sheet 數(shù)量,默認(rèn)為1 |
| needSave | boolean | FALSE | 是否需要保存上傳的Excel |
| needVerfiy | boolean | FALSE | 是否需要校驗(yàn)上傳的Excel |
| saveUrl | String | “upload/excelUpload” | 保存上傳的Excel目錄,默認(rèn)是 如 TestEntity這個(gè)類保存路徑就是upload/excelUpload/Test/yyyyMMddHHmss_ 保存名稱上傳時(shí)間_五位隨機(jī)數(shù) |
| verifyHanlder | IExcelVerifyHandler | null | 校驗(yàn)處理接口,自定義校驗(yàn) |
| lastOfInvalidRow | int | 0 | 最后的無(wú)效行數(shù),不讀的行數(shù) |
| readRows | int | 0 | 手動(dòng)控制讀取的行數(shù)實(shí)測(cè)設(shè)置head后 2=第一行數(shù)據(jù) |
| importFields | String[] | null | excel文件中必須要有的字段,必須要有這些數(shù)據(jù) |
| keyMark | String | “:” | Key-Value 讀取標(biāo)記,以這個(gè)為Key,后面一個(gè)Cell 為Value,多個(gè)改為ArrayList |
| readSingleCell | boolean | FALSE | 按照Key-Value 規(guī)則讀取全局掃描Excel,但是跳過(guò)List讀取范圍提升性能,僅僅支持titleRows + headRows + startRows 以及 lastOfInvalidRow |
| dataHanlder | IExcelDataHandler | null | 數(shù)據(jù)處理接口,以此為主,replace,format都在這后面 |
正常導(dǎo)入 importExcel
需要把實(shí)體里面圖片的字段的Excel注釋掉
//普通正常表格public void importExcel1() {ImportParams params = new ImportParams();params.setTitleRows(1);params.setHeadRows(1);params.setStartRows(0);//設(shè)置開(kāi)始讀取的位置,也就是從標(biāo)題下0為全部 1讀取第一行以后的數(shù)據(jù)
// params.setKeyIndex(1);//
// params.setStartSheetIndex(0); params.setSheetNum(1);//兩個(gè)配合使用 在多個(gè)sheet時(shí) 有10個(gè)sheet我們想讀取1-4個(gè)sheet
// params.setReadRows(3);//實(shí)測(cè)設(shè)置head后 2=第一行數(shù)據(jù)params.setImportFields(new String[]{"姓名","性別"});//excel文件中必須要有的字段,必須要有這些數(shù)據(jù)
// params.setReadRows(4);File file = new File(getWebRootPath("import/B.xlsx"));List<TestBean> list = ExcelImportUtil.importExcel(file,TestBean.class, params);list.stream().forEach(i-> System.out.println(i.toString()));}
大數(shù)據(jù)量 importExcelBySax
//導(dǎo)入大量數(shù)據(jù)public void importExcelBySax() throws FileNotFoundException {/**需要添加依賴 實(shí)現(xiàn)xml解析的jar包<dependency><groupId>xerces</groupId><artifactId>xercesImpl</artifactId><version>2.9.1</version></dependency>*/ImportParams params = new ImportParams();params.setTitleRows(1);List<TestBean> list=new ArrayList<>();ExcelImportUtil.importExcelBySax(new FileInputStream(new File(getWebRootPath("import/ExcelExportMsgClient.xlsx"))),TestBean.class, params, new IReadHandler<TestBean>() {@Override//讀取的每一行public void handler(TestBean o) {list.add(o);System.out.println(ReflectionToStringBuilder.toString(o));}@Overridepublic void doAfterAll() {System.out.println("數(shù)據(jù)執(zhí)行完畢的處理");}});}
異步
從官方的demo中看得出 沒(méi)快哪里去
public void asyncTask(){ImportParams params =new ImportParams();params.setHeadRows(1);params.setTitleRows(1);params.setConcurrentTask(true);//開(kāi)啟異步params.setCritical(500);List<TestBean> objects = ExcelImportUtil.importExcel(new File(getWebRootPath("import/B.xlsx")),TestBean.class,params);objects.stream().forEach(i-> System.out.println(i.toString()));}
讀取合并的表頭
//普通正常表格public void importExcel1() {ImportParams params = new ImportParams();params.setTitleRows(1);//標(biāo)題1行params.setHeadRows(2);//表頭一共是2行File file = new File(getWebRootPath("import/B.xlsx"));List<TestBean> list = ExcelImportUtil.importExcel(file,TestBean.class, params);list.stream().forEach(i-> System.out.println(i.toString()));}
驗(yàn)證導(dǎo)入(篩出符合與不符合的數(shù)據(jù))
官方給出挺多的demo,有點(diǎn)繁瑣,覺(jué)得這個(gè)是比較實(shí)用的
在實(shí)體類中添加hibernate的字段驗(yàn)證注解
這個(gè)不需要額外引入依賴
主要驗(yàn)證這3個(gè)位置
public void validFieldImport() throws IOException {ImportParams params=new ImportParams();params.setTitleRows(1);params.setHeadRows(2);params.setNeedVerify(true);//設(shè)置需要驗(yàn)證params.setVerifyGroup(new Class[]{ValidGroup.class});//設(shè)置驗(yàn)證分組ExcelImportResult<TestBean> importResult = ExcelImportUtil.importExcelMore(new File(getWebRootPath("import/B.xlsx")), TestBean.class, params);//符合驗(yàn)證List<TestBean> list = importResult.getList();//不符合驗(yàn)證List<TestBean> failList = importResult.getFailList();//獲取mapMap<String, Object> map = importResult.getMap();//導(dǎo)出驗(yàn)證的數(shù)據(jù)importResult.getWorkbook().write(new FileOutputStream("D:/eazyPoi/validExcel.xlsx"));//不符合的數(shù)據(jù)importResult.getFailWorkbook().write(new FileOutputStream("D:/eazyPoi/failValidExcel.xlsx"));System.out.println("是否驗(yàn)證失敗"+importResult.isVerifyFail());}
bir 字段沒(méi)有加驗(yàn)證分組 所以不參與驗(yàn)證
失敗導(dǎo)出的excel會(huì)有提示
表頭的groupName
導(dǎo)入圖片
@Excel(name = "公司LOGO", type = 2 ,width = 40 , height = 30,imageType = 1,savePath="D:\\javaProject\\")private String companyLogo;
CSV導(dǎo)入
新建C.csv文件
id,name,sex,bir
1,小明,1,1991-08-08
2,小張,1,1991-09-08
3,小紅,2,1991-09-08
public void importCSV()throws Exception{Date start = new Date();CsvImportParams params = new CsvImportParams(CsvImportParams.UTF8);CsvImportUtil.importCsv(new FileInputStream(new File(getWebRootPath("import/C.csv"))),Map.class, params, new IReadHandler<Map>() {@Overridepublic void handler(Map o) {System.out.println(JSON.toJSONString(o));}@Overridepublic void doAfterAll() {}});
}
excel轉(zhuǎn)換csv
Excel
public void excel2Csv()throws Exception{//輸出的CSVFileOutputStream fos = new FileOutputStream("D:\\eazyPoi\\aa.csv");ImportParams params = new ImportParams();params.setTitleRows(1);params.setHeadRows(1);CsvExportParams csvExportParams = new CsvExportParams();csvExportParams.setEncoding(CsvExportParams.GBK);//可使用UTF8IWriter ce = CsvExportUtil.exportCsv(csvExportParams, TestBean.class, fos);ExcelImportUtil.importExcelBySax(new FileInputStream(new File(getWebRootPath("import/B.xlsx"))),TestBean.class, params, new IReadHandler<TestBean>() {private List<TestBean> list = new ArrayList<>();@Overridepublic void handler(TestBean o) {//讀取后添加到listlist.add(o);}@Overridepublic void doAfterAll() {//讀取結(jié)束后轉(zhuǎn)換輸出ce.write(list);list.clear();System.out.println("succcess--------------------------------");}});}
CSV 紅框?yàn)閷?shí)體類注解字段
Excel轉(zhuǎn)html
public void testToAllHtmlWorkbookAndImage()throws Exception{Workbook wb = new XSSFWorkbook(new FileInputStream(new File(getWebRootPath("import/B.xlsx"))));String html = ExcelXorHtmlUtil.excelToHtml(new ExcelToHtmlParams(wb, true, "D:\\eazyPoi\\"));FileWriter fw = new FileWriter("D:/eazyPoi/B.html");fw.write(html);fw.close();}
ExportParams 表格參數(shù)配置
- 構(gòu)造方法
ExportParams()
ExportParams(String 標(biāo)題, String sheet名字)
ExportParams(String 標(biāo)題, String sheet名字, ExcelType ecxel類型枚舉)
ExportParams(String 標(biāo)題, String 第二表頭名字, String sheet名字)
- setFreezeCol
橫向滑動(dòng)左側(cè)固定列
Excel 模板功能
基本功能
public void three()throws Exception{TemplateExportParams params = new TemplateExportParams("doc/test.xlsx", 0);params.setColForEach(true);Map<String, Object> map = new HashMap<>();map.put("int", 10);map.put("double", 3.1415926);map.put("strNum", "10.2525");map.put("str", "這是一段文字!");map.put("date", new Date());map.put("bigNum",88888888);map.put("list",getList());map.put("user",getUser());ImageEntity image = new ImageEntity();image.setHeight(200);image.setWidth(500);image.setUrl("imgs/company/baidu.png");map.put("img",image);Workbook book = ExcelExportUtil.exportExcel(params, map);FileOutputStream fos = new FileOutputStream("D:/home/excel/test"+System.currentTimeMillis()+".xlsx");book.write(fos);fos.close();}public List<Map<String,Object>> getList(){List<Map<String,Object>> list=new ArrayList<>();Map<String,Object> maps=new LinkedHashMap<>();maps.put("name","李明");maps.put("sex","男");maps.put("title1","姓名1");maps.put("title2","性別1");maps.put("field1","t.name");maps.put("field2","t.sex");list.add(maps);maps=new LinkedHashMap<>();maps.put("name","小紅");maps.put("sex","女");maps.put("title1","姓名2");maps.put("title2","性別2");maps.put("field1","t.name");maps.put("field2","t.sex");list.add(maps);maps=new LinkedHashMap<>();maps.put("name","小朵");maps.put("sex","女");maps.put("title1","姓名3");maps.put("title2","性別3");maps.put("field1","t.name");maps.put("field2","t.sex");list.add(maps);return list;}
{{}} 輸出
變量輸出使用{{變量名稱}} 是不是很像Vue
{{n:}} 數(shù)值類型
數(shù)值類型的String使用{{n:objName}}
時(shí)間格式化 & str長(zhǎng)度 & 三目運(yùn)算 & 保留小數(shù)
遍歷的3種區(qū)別 {{fe:}}{{!fe:}}{{$fe:}}
便利格式
{{!fe:}} 不創(chuàng)建行,直接向下遍歷
{{fe:}} 不創(chuàng)建行,除第一行外,覆蓋所有數(shù)據(jù)行
{{$fe:}} 創(chuàng)插入新建行,除第一行外
{{#fe:}}{{v_fe:}} 橫向遍歷
public List<Map<String,Object>> getList(){List<Map<String,Object>> list=new ArrayList<>();Map<String,Object> maps=new LinkedHashMap<>();maps.put("name","李明");maps.put("sex","男");maps.put("title1","姓名1");maps.put("title2","性別1");maps.put("field1","t.name");maps.put("field2","t.sex");list.add(maps);maps=new LinkedHashMap<>();maps.put("name","小紅");maps.put("sex","女");maps.put("title1","姓名2");maps.put("title2","性別2");maps.put("field1","t.name");maps.put("field2","t.sex");list.add(maps);maps=new LinkedHashMap<>();maps.put("name","小朵");maps.put("sex","女");maps.put("title1","姓名3");maps.put("title2","性別3");maps.put("field1","t.name");maps.put("field2","t.sex");list.add(maps);return list;}
word模板
public void testDoc() throws IOException {Map<String,Object> map=new HashMap<>();map.put("title","請(qǐng)假單");SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String curTime = format.format(new Date());map.put("now",curTime);map.put("name","小明");map.put("day",2);List<Map<String,Object>> list=new ArrayList<>();for (int i = 0; i <2 ; i++) {Map<String,Object> map1=new HashMap<>();map1.put("date","2020-01-01");map1.put("type","全天");//使用base64圖片方式String img="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";ImageEntity imageEntity=new ImageEntity();imageEntity.setData(new BASE64Decoder().decodeBuffer(img));imageEntity.setHeight(50);imageEntity.setWidth(50);imageEntity.setType(ImageEntity.Data);map1.put("img1",imageEntity);//圖片路徑方式String path="D:\\javaProject\\easypoi-test\\src\\test\\resources\\imgs\\company\\one.png" ;imageEntity=new ImageEntity();imageEntity.setUrl(path);imageEntity.setHeight(50);imageEntity.setWidth(50);imageEntity.setType(ImageEntity.URL);map1.put("img2",imageEntity);list.add(map1);}map.put("list",list);try {XWPFDocument doc = WordExportUtil.exportWord07("word/qjd.docx", map);FileOutputStream fos = new FileOutputStream("D:/home/excel/請(qǐng)假單.docx");doc.write(fos);fos.close();} catch (Exception e) {e.printStackTrace();}}
圖片設(shè)置
image.setLocationType(ImageEntity.EMBED);圖片嵌入類型
public static int EMBED = 0; 嵌入
public static int ABOVE = 1; 上面(頂層)
public static int BEHIND = 2; 后面(底層)
總結(jié)
以上是生活随笔為你收集整理的SpringBoot 整合eazyPoi 4.3.0 Excel数据导入导出(持续更新功能)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 丘成桐在CNCC会议的演讲全文
- 下一篇: golang 获取公网ip 内网ip 检