AutoExcel實現(xiàn)百萬數(shù)據(jù)秒級導(dǎo)入導(dǎo)出

GitHub | 博客 | 使用手冊

AutoExcel V2.0.0 帶來以下新特性

  1. 支持百萬數(shù)據(jù)秒級導(dǎo)入導(dǎo)出
  2. 重寫導(dǎo)入方法

Maven

<dependency>
  <groupId>net.fenghaitao</groupId>
  <artifactId>auto-excel</artifactId>
  <version>2.0.0</version>
</dependency>

支持百萬數(shù)據(jù)秒級導(dǎo)入導(dǎo)出

以某巴巴的EasyExcel(版本2.2.6)作為對比冰肴,相同環(huán)境下測得以下結(jié)果,單位為毫秒

10W行10列數(shù)據(jù) 100W行10列數(shù)據(jù)
AutoExcel (模板導(dǎo)出) 6,258 23,540
EasyExcel (模板導(dǎo)出) 7,358 28,881
AutoExcel (直接導(dǎo)出) 5,711 24,952
EasyExcel (直接導(dǎo)出) 5,775 27,118
AutoExcel (導(dǎo)入) 4,466 21,595
AutoExcel (導(dǎo)入+轉(zhuǎn)換) 4,823 26,279
EasyExcel (導(dǎo)入) 5,966 30,844

可見,AutoExcel和EasyExcel在導(dǎo)入導(dǎo)出效率上相差不大带膀,因為兩者的導(dǎo)出都是基于SXSSF,導(dǎo)入都是基于SAX,只是AutoExcel對POI的封裝更加輕量,所以效率會稍微高一些叹侄,數(shù)據(jù)量越大越明顯。

當(dāng)然昨登,實際上趾代,AutoExcel并非專注于導(dǎo)入導(dǎo)出的效率,而是開發(fā)體驗丰辣,為開發(fā)者提供自動化功能的同時撒强,讓開發(fā)者書寫盡可能少的代碼。如自動應(yīng)用單元格樣式笙什、自動填充行號尿褪、自動填充公式、自動匯總得湘、自動列寬等,詳細用法可前往AutoExcel——Excel導(dǎo)入導(dǎo)出利器查看顿仇。

重寫導(dǎo)入方法

V1.0.0中基于模板的導(dǎo)入方式已被廢棄淘正,新版中需使用FieldSetting來指定列名與字段名的映射關(guān)系

public void importExcel() {
    List<ImportPara> importParas = new ArrayList<ImportPara>() {{
        add(new ImportPara(0, DataGenerator.genProductFieldSettings()));
        add(new ImportPara(1, DataGenerator.genProjectFieldSettings(), 1, 5));
    }};
    String fileName = this.getClass().getResource("/template/Import.xlsx").getPath();
    DataSet dataSet = AutoExcel.read(fileName, importParas);
    // 方式一、直接獲取數(shù)據(jù)臼闻,沒有類型轉(zhuǎn)換鸿吆,可通過這種方式檢驗數(shù)據(jù)是否符合要求
    List<Map<String, Object>> products = dataSet.get("Product");
    List<Map<String, Object>> projects = dataSet.get("Project");
    // 方式二、通過sheet索引獲取指定類的數(shù)據(jù)述呐,類型自動轉(zhuǎn)換惩淳,轉(zhuǎn)換失敗將拋出異常
    // List<Product> products = dataSet.get(0, Product.class);
    // List<Project> projects= dataSet.get(1, Project.class);
    // 方式三、通過sheet名稱獲取指定類的數(shù)據(jù),類型自動轉(zhuǎn)換思犁,轉(zhuǎn)換失敗將拋出異常
    // List<Product> products = dataSet.get("Product", Product.class);
    // List<Project> projects = dataSet.get("Project", Project.class);
}
public static List<FieldSetting> genProjectFieldSettings() {
    List<FieldSetting> fieldSettings = new ArrayList<>();
    fieldSettings.add(new FieldSetting("projName", "Project Name"));
    fieldSettings.add(new FieldSetting("projInfo", "Project Info."));
    fieldSettings.add(new FieldSetting("basalArea", "Basal Area"));
    fieldSettings.add(new FieldSetting("availableArea", "Available Area"));
    fieldSettings.add(new FieldSetting("buildingArea", "Building Area"));
    fieldSettings.add(new FieldSetting("buildingsNumber", "Buildings Number"));
    fieldSettings.add(new FieldSetting("saleStartDate", "Sales Start Date"));
    fieldSettings.add(new FieldSetting("landAcquisitionTime", "Land Acquisition Time"));
    fieldSettings.add(new FieldSetting("availablePrice", "Available Price"));
    fieldSettings.add(new FieldSetting("availableAmount", "Available Amount"));
    fieldSettings.add(new FieldSetting("insideArea", "Inside Area"));
    return fieldSettings;
}

public static List<FieldSetting> genProductFieldSettings() {
    List<FieldSetting> fieldSettings = new ArrayList<FieldSetting>() {{
        add(new FieldSetting("projName", "Project Name"));
        add(new FieldSetting("basalArea", "Basal Area"));
        add(new FieldSetting("availableArea", "Available Area"));
        add(new FieldSetting("buildingArea", "Building Area"));
        add(new FieldSetting("buildingsNumber", "Buildings Number"));
    }};
    return fieldSettings;
}

ImportPara構(gòu)造方法入?yún)ⅲ?/p>

  1. sheetIndex:必填代虾,sheet索引
  2. fieldSettings:必填,列名與字段名映射設(shè)置
  3. titleIndex:可省略激蹲,標(biāo)題行開始索引棉磨,默認(rèn)為0
  4. dataStartIndex:可省略,數(shù)據(jù)行開始索引学辱,默認(rèn)為1

為什么使用FieldSetting不采用注解的方式聲明列名乘瓤?

  1. 非侵入式,不影響原來的代碼
  2. 在系統(tǒng)設(shè)計的時候策泣,為了重用相同的配置衙傀,如頁面展示、導(dǎo)出萨咕、導(dǎo)入统抬、打印都展示相同的列名,我們會將這些配置存放在存儲介質(zhì)如數(shù)據(jù)庫任洞,待使用時加載出來蓄喇,這種方式也可以避免硬編碼,還可以方便地進行動態(tài)配置交掏,采用FieldSetting就是為了配合這種方式妆偏。AutoExcel盡可能讓導(dǎo)入導(dǎo)出融入到你的自動化系統(tǒng)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盅弛,一起剝皮案震驚了整個濱河市钱骂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挪鹏,老刑警劉巖见秽,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異讨盒,居然都是意外死亡解取,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門返顺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來禀苦,“玉大人,你說我怎么就攤上這事遂鹊≌穹Γ” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵秉扑,是天一觀的道長慧邮。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么误澳? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任耻矮,我火速辦了婚禮,結(jié)果婚禮上脓匿,老公的妹妹穿的比我還像新娘淘钟。我一直安慰自己,他們只是感情好陪毡,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布米母。 她就那樣靜靜地躺著,像睡著了一般毡琉。 火紅的嫁衣襯著肌膚如雪铁瞒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天桅滋,我揣著相機與錄音慧耍,去河邊找鬼。 笑死丐谋,一個胖子當(dāng)著我的面吹牛芍碧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播号俐,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼泌豆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吏饿?” 一聲冷哼從身側(cè)響起踪危,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猪落,沒想到半個月后贞远,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡笨忌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年蓝仲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片官疲。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡杂曲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袁余,到底是詐尸還是另有隱情,我是刑警寧澤咱揍,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布颖榜,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏掩完。R本人自食惡果不足惜噪漾,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望且蓬。 院中可真熱鬧欣硼,春花似錦、人聲如沸恶阴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冯事。三九已至焦匈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昵仅,已是汗流浹背缓熟。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摔笤,地道東北人够滑。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像吕世,于是被迫代替她去往敵國和親彰触。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容