一款Excel導入導出解決方案組成的輕量級開源組件

Excel-Boot

GitHub地址:gitee.com/nw1992/easy…java

碼雲地址:github.com/programmere…git

Excel-Boot是一款Excel導入導出解決方案組成的輕量級開源組件。github

若是喜歡或願意使用, 請star本項目或者點擊donate圖標捐贈咱們正則表達式

若是是企業使用, 爲了產品推廣, 請經過評論、Issue、PullRequest README的企業列表告訴咱們企業名稱數據庫

有任何問題能夠經過issue或者評論或者添加QQ羣(716145748)告知咱們, 盡力第一時間解決您的問題api

使用企業列表:

功能簡介

  1. 瀏覽器導出Excel文件(支持單/多sheet)瀏覽器

  2. 瀏覽器導出Excel模板文件緩存

  3. 指定路徑生成Excel文件(支持單/多sheet)併發

  4. 返回Excel文件(支持單/多sheet)的OutputStream, 通常用於將Excel文件上傳到遠程, 例如FTPapp

  5. 導入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便可

POM.xml

<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

/** * 導出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

/** * 導入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?

相關文章
相關標籤/搜索