GitHub地址:gitee.com/nw1992/easy…java
碼雲地址:github.com/programmere…git
Excel-Boot是一款Excel導入導出解決方案組成的輕量級開源組件。github
若是喜歡或願意使用, 請star本項目或者點擊donate圖標捐贈咱們正則表達式
若是是企業使用, 爲了產品推廣, 請經過評論、Issue、PullRequest README的企業列表告訴咱們企業名稱數據庫
有任何問題能夠經過issue或者評論或者添加QQ羣(716145748)告知咱們, 盡力第一時間解決您的問題api
瀏覽器導出Excel文件(支持單/多sheet)瀏覽器
瀏覽器導出Excel模板文件緩存
指定路徑生成Excel文件(支持單/多sheet)併發
返回Excel文件(支持單/多sheet)的OutputStream, 通常用於將Excel文件上傳到遠程, 例如FTPapp
導入Excel文件(支持單/多sheet)
1.解決導出大量數據形成的內存溢出問題(支持分頁查詢數據庫、採用poi官方推薦api(SXSSFWorkbook), 實現指定行數刷新到磁盤)
2.解決導入大量數據形成的內存溢出問題(支持分頁插入數據庫、採用poi官方推薦api(XSSF and SAX),採用SAX模式一行行讀取到內存當中去)
3.解決含有佔位符的空假行形成的讀空值問題
4.解決Long類型或者BigDecimal的精度不許問題
1.導入能夠自定義解析成功或失敗的處理邏輯
2.導出支持分頁查詢、全量查詢, 自定義每條數據的處理邏輯
3.內置緩存, 3萬條11列數據, 排除查詢數據所用時間, 第一次導出2.2s左右、第二次導出在1.4s左右;第一次導入3.5s左右、第二次導入2.5s左右
4.註解操做, 輕量且便捷
5.內置經常使用正則表達式類RegexConst(身份證號、手機號、金額、郵件)
6.可配置是否適配單元格寬度, 默認開啓(單元格內容超過20個漢字再也不增長寬度, 3萬條11列數據, 耗時50ms左右, 用時與數據量成正比)
7.假如出現異常,Sheet、行、列位置也都一併打印
8.註解中的用戶自定義字符串信息以及Excel信息已所有trim,不用擔憂存在先後空格的風險
9.Excel樣式簡潔、大方、美觀
10.導出的單條數據假如所有屬性都爲null或0或0.0或0.00或空字符串者null字符串,自動忽略,此特性也可以讓用戶自定義忽略規則
11.除了直接返回OutputStream的方法之外的導出方法, 正常或異常狀況都會自動關閉OutputStrem、Workbook流
1.導入和導出只支持尾綴爲xlsx的Excel文件
2.標註註解的屬性順序即Excel列的排列順序
3.時間轉化格式(dateFormat)默認爲「yyyy-MM-dd HH:mm:ss「
1.當導入Excel, 讀取到空行, 則中止讀取當前Sheet的後面數據行
2.導入Excel文件, 單元格格式使用文本或者常規, 防止出現不可預測異常
3.導入字段類型支持:Date、Short(short)、Integer(int)、Double(double)、Long(long)、Float(float)、BigDecimal、String類型
4.導入BigDecimal字段精度默認爲2, roundingMode默認爲BigDecimal.ROUND_HALF_EVEN, scale設置爲-1則不進行格式化
5.第一行有效單元格內必須包含內容而且以第一行爲依據, 導入Excel文件列數必須等於標註註解的屬性數量
6.Date類型字段,Excel與時間轉化格式(dateFormat)相比,格式要保持一致(反例:2018/12/31和「yyyy-MM-dd「)而且長度要一致或更長(反例:"2018-12-31"和yyyy-MM-dd HH:mm:ss"),不然SimpleDateFormat將解析失敗,報 「Unparseable date:」
1.導出BigDecimal字段默認不進行精度格式化
2.分頁查詢默認從第一頁開始, 每頁3000條
3.Excel每超過2000條數據, 將內存中的數據刷新到磁盤當中去
4.使用分Sheet導出方法, 每8萬行數據分Sheet
5.當使用(exportResponse、exportStream、generateExcelStream)方法時, 當單個Sheet超過100萬條則會分Sheet
6.標註屬性類型要與數據庫類型保持一致
7.若是想提升性能, 而且內存容許、併發導出量不大, 能夠根據實際場景適量改變分頁條數和磁盤刷新量
1.新建子類繼承ExcelBoot類, 使用子類構造器覆蓋如下默認參數, 做爲通用配置
2.直接調用如下兩個構造器, 用於臨時修改配置
/** * HttpServletResponse 通用導出Excel構造器 */
ExportBuilder(HttpServletResponse response, String fileName, Class excelClass, Integer pageSize, Integer rowAccessWindowSize, Integer recordCountPerSheet, Boolean openAutoColumWidth)
/** * OutputStream 通用導出Excel構造器 */
ExportBuilder(OutputStream outputStream, String fileName, Class excelClass, Integer pageSize, Integer rowAccessWindowSize, Integer recordCountPerSheet, Boolean openAutoColumWidth)
複製代碼
/** * Excel自動刷新到磁盤的數量 */
public static final int DEFAULT_ROW_ACCESS_WINDOW_SIZE = 2000;
/** * 分頁條數 */
public static final int DEFAULT_PAGE_SIZE = 3000;
/** * 分Sheet條數 */
public static final int DEFAULT_RECORD_COUNT_PEER_SHEET = 80000;
/** * 是否開啓自動適配寬度 */
public static final boolean OPEN_AUTO_COLUM_WIDTH = true;
複製代碼
當前爲2.0版本, 新版本正在開發
1.引入Maven依賴
2.將須要導出或者導入的實體屬性上標註@ExportField或@ImportField註解
3.直接調用導出或導入API便可
<dependency>
<groupId>io.github.magic-core</groupId>
<artifactId>excel-boot</artifactId>
<version>2.0</version>
</dependency>
複製代碼
/** * 導出導入實體對象 */
public class UserEntity {
/** * Integer類型字段 */
@ExportField(columnName = "ID", defaultCellValue = "1")
@ImportField(required = true)
private Integer id;
/** * String類型字段 */
@ExportField(columnName = "姓名", defaultCellValue = "張三")
@ImportField(regex = IDCARD_REGEX, regexMessage="身份證校驗失敗")
private String name;
/** * BigDecimal類型字段 */
@ExportField(columnName = "收入金額", defaultCellValue = "100", scale = 2, roundingMode=BigDecimal.ROUND_HALF_EVEN)
@ImportField(scale = 2, roundingMode=BigDecimal.ROUND_HALF_EVEN)
private BigDecimal money;
/** * Date類型字段 */
@ExportField(columnName = "建立時間", dateFormat="yyyy-MM-dd", defaultCellValue = "2019-01-01")
@ImportField(dateFormat="yyyy-MM-dd")
private Date birthDayTime;
}
複製代碼
/** * 導出api-Demo * * UserEntity是標註註解的類,Excel映射的導出類 * ParamEntity是數據層查詢的參數對象 * ResultEntity是數據層查詢到的List內部元素 * UserEntity能夠和ResultEntity使用同一個對象,即直接在數據層查詢的結果對象上標註註解(建議使用兩個對象, 實現解耦) * * pageQuery方法是用戶本身實現, 根據查詢條件和當前頁數和每頁條數進行數據層查詢 * convert方法是用戶本身實現, 參數就是您查詢出來的list中的每一個元素引用, 您能夠對對象屬性的轉換或者對象的轉換, 若是不進行轉換,直接返回參數對象便可 */
@Controller
@RequestMapping("/export")
public class TestController {
/** * 瀏覽器導出Excel * * @param httpServletResponse */
@RequestMapping("/exportResponse")
public void exportResponse(HttpServletResponse httpServletResponse) {
ParamEntity queryQaram = new ParamEntity();
ExcelBoot.ExportBuilder(httpServletResponse, "Excel文件名", UserEntity.class).exportResponse(queryQaram,
new ExportFunction<ParamEntity, ResultEntity>() {
/** * @param queryQaram 查詢條件對象 * @param pageNum 當前頁數,從1開始 * @param pageSize 每頁條數,默認3000 * @return */
@Override
public List<ResultEntity> pageQuery(ParamEntity queryQaram, int pageNum, int pageSize) {
//分頁查詢操做
return new ArrayList<ResultEntity>();
}
/** * 將查詢出來的每條數據進行轉換 * * @param o */
@Override
public UserEntity convert(ResultEntity o) {
//轉換操做
}
});
}
/** * 瀏覽器多sheet導出Excel * * @param httpServletResponse */
@RequestMapping("/exportMultiSheetResponse")
public void exportMultiSheetResponse(HttpServletResponse httpServletResponse) {
ParamEntity queryQaram = new ParamEntity();
ExcelBoot.ExportBuilder(httpServletResponse, "Excel文件名", UserEntity.class).exportMultiSheetStream(queryQaram,
new ExportFunction<ParamEntity, ResultEntity>() {
/** * @param queryQaram 查詢條件對象 * @param pageNum 當前頁數,從1開始 * @param pageSize 每頁條數,默認3000 * @return */
@Override
public List<ResultEntity> pageQuery(ParamEntity queryQaram, int pageNum, int pageSize) {
//分頁查詢操做
return new ArrayList<ResultEntity>();
}
/** * 將查詢出來的每條數據進行轉換 * * @param o */
@Override
public UserEntity convert(ResultEntity o) {
//轉換操做
}
});
}
/** * 導出Excel到指定路徑 */
@RequestMapping("/exportStream")
public void exportStream() throws FileNotFoundException {
ParamEntity queryQaram = new ParamEntity();
ExcelBoot.ExportBuilder(new FileOutputStream(new File("C:\\Users\\Excel文件.xlsx")), "Sheet名", UserEntity.class)
.exportStream(queryQaram, new ExportFunction<ParamEntity, ResultEntity>() {
/** * @param queryQaram 查詢條件對象 * @param pageNum 當前頁數,從1開始 * @param pageSize 每頁條數,默認3000 * @return */
@Override
public List<ResultEntity> pageQuery(ParamEntity queryQaram, int pageNum, int pageSize) {
//分頁查詢操做
return new ArrayList<ResultEntity>();
}
/** * 將查詢出來的每條數據進行轉換 * * @param o */
@Override
public UserEntity convert(ResultEntity o) {
//轉換操做
}
});
}
/** * 導出多sheet Excel到指定路徑 */
@RequestMapping(value = "exportMultiSheetStream")
public void exportMultiSheetStream() throws FileNotFoundException {
ParamEntity queryQaram = new ParamEntity();
ExcelBoot.ExportBuilder(new FileOutputStream(new File("C:\\Users\\Excel文件.xlsx")), "Sheet名", UserEntity.class)
.exportMultiSheetStream(queryQaram, new ExportFunction<ParamEntity, ResultEntity>() {
/** * @param queryQaram 查詢條件對象 * @param pageNum 當前頁數,從1開始 * @param pageSize 每頁條數,默認3000 * @return */
@Override
public List<ResultEntity> pageQuery(ParamEntity queryQaram, int pageNum, int pageSize) {
//分頁查詢操做
return new ArrayList<ResultEntity>();
}
/** * 將查詢出來的每條數據進行轉換 * * @param o */
@Override
public UserEntity convert(ResultEntity o) {
//轉換操做
}
});
}
/** * 生成Excel OutputStream對象 */
@RequestMapping(generateStream)
public void generateExcelStream() throws FileNotFoundException {
ParamEntity queryQaram = new ParamEntity();
OutputStream outputStream = ExcelBoot.ExportBuilder(new FileOutputStream(new File("C:\\Users\\Excel文件.xlsx")), "Sheet名", UserEntity.class)
.generateExcelStream(queryQaram, new ExportFunction<ParamEntity, ResultEntity>() {
/** * @param queryQaram 查詢條件對象 * @param pageNum 當前頁數,從1開始 * @param pageSize 每頁條數,默認3000 * @return */
@Override
public List<ResultEntity> pageQuery(ParamEntity queryQaram, int pageNum, int pageSize) {
//分頁查詢操做
return new ArrayList<ResultEntity>();
}
/** * 將查詢出來的每條數據進行轉換 * * @param o */
@Override
public UserEntity convert(ResultEntity o) {
//轉換操做
}
});
}
/** * 生成多Sheet Excel OutputStream對象 */
@RequestMapping(generateMultiSheetStream)
public void generateMultiSheetExcelStream() throws FileNotFoundException {
ParamEntity queryQaram = new ParamEntity();
OutputStream outputStream = ExcelBoot.ExportBuilder(new FileOutputStream(new File("C:\\Users\\Excel文件.xlsx")), "Sheet名", UserEntity.class)
.generateMultiSheetExcelStream(queryQaram, new ExportFunction<ParamEntity, ResultEntity>() {
/** * @param queryQaram 查詢條件對象 * @param pageNum 當前頁數,從1開始 * @param pageSize 每頁條數,默認3000 * @return */
@Override
public List<ResultEntity> pageQuery(ParamEntity queryQaram, int pageNum, int pageSize) {
//分頁查詢操做
return new ArrayList<ResultEntity>();
}
/** * 將查詢出來的每條數據進行轉換 * * @param o */
@Override
public UserEntity convert(ResultEntity o) {
//轉換操做
}
});
}
/** * 導出Excel模板 */
@RequestMapping("/exportTemplate")
public void exportTemplate(HttpServletResponse httpServletResponse) {
ExcelBoot.ExportBuilder(httpServletResponse, "Excel模板名稱", UserEntity.class).exportTemplate();
}
}
複製代碼
/** * 導入api-Demo * * UserEntity是標註註解的類, Excel映射的導入類, onProcess的userEntity參數則是Excel每行數據的映射實體 * ErrorEntity是封裝了每行Excel數據常規校驗後的錯誤信息實體, 封裝了sheet號、行號、列號、單元格值、所屬列名、錯誤信息 * * onProcess方法是用戶本身實現, 當通過正則或者判空常規校驗成功後執行的方法,參數是每行數據映射的實體 * convert方法是用戶本身實現, 當通過正則或者判空常規校驗失敗後執行的方法 */
@Controller
@RequestMapping("/import")
public class TestController {
@RequestMapping("/importExcel")
public void importExcel() throws IOException {
ExcelBoot.ImportBuilder(new FileInputStream(new File("C:\\Users\\導入Excel文件.xlsx")), UserEntity.class)
.importExcel(new ExcelImportFunction<UserEntity>() {
/** * @param sheetIndex 當前執行的Sheet的索引, 從1開始 * @param rowIndex 當前執行的行數, 從1開始 * @param resultEntity Excel行數據的實體 */
@Override
public void onProcess(int sheetIndex, int rowIndex, UserEntity userEntity) {
//對每條數據自定義校驗以及操做
//分頁插入:當讀取行數到達用戶自定義條數執行插入數據庫操做
}
/** * @param errorEntity 錯誤信息實體 */
@Override
public void onError(ErrorEntity errorEntity) {
//操做每條數據非空和正則校驗後的錯誤信息
}
});
}
}
複製代碼
Octotree is enabled on this page. Click this button or press cmd shift s (or ctrl shift s) to show it. Support us • Feedback?