WeihanLi.Npoi 近期更新

WeihanLi.Npoi 近期更新

Intro

最近對個人 NPOI 擴展作了一些改變,一方面提升性能,一方面修復bug,增長一些新的功能來讓它更加好用,前幾天發佈了 1.5.0 版本,下面來介紹一下最近的更新git

默認導入/導出格式變動

在 1.5.0 版本中,將默認導入/導出的excel格式從 xlsx 改成 xls 以得到更好的性能,須要注意的是 xls 格式的 excel 文件一個 sheet 最多 65535 行數據,超過的話會報錯。
xls 能夠有更好的性能和更優的內存分配,xlsx 多是由於要和 xlsx 保持一致的接口,一致的編程體驗纔會性能有點問題,建議最好使用 xls 格式的 excelgithub

具體的性能測試能夠參考 Github,這裏貼幾張圖:編程

Basic Test

導出數據較多,截圖難以完整展現,建議看 Github 上的測試結果,或者本身拉取代碼,在本身電腦上跑測試
Export Test數組

Import Test

ColumnWidth 的變化

原來的版本,會自動調整列寬,應網友的請求在 1.4.0 版本中增長了 ColumnWidth 的配置來自定義列寬,issue:https://github.com/WeihanLi/WeihanLi.Npoi/issues/30工具

能夠經過 Attribute [Column(Width=100)] 或者經過 FluentAPI HasColumnWidth(100) 來自定義列寬性能

同時出於導出性能的考慮,在 1.5.0 版本中移除了自動列寬的配置,若是須要啓用自動列寬,能夠經過 Sheet 的配置來實現測試

  • Attribute 方式:[Sheet(SheetIndex = 0, SheetName = "TestSheet", AutoColumnWidthEnabled = true)]
  • FluentAPI: setting.HasSheetConfiguration(0, "SystemSettingsList", true)

OutputFormatter/InputFormatter

在 1.3.7 版本中引入了 ColumnFormatter 來使得用戶能夠自定義導出,讓導出變得更加靈活,能夠自定義一個委託來指定導出的值。優化

在 1.4.5 版本將 ColumnFormatter 變動爲 OutputFormatter,並增長了 InputFormatter 來使得導入更加靈活3d

看個示例:excel

var setting = ExcelHelper.SettingFor<TestEntity>();
// ExcelSetting
setting.HasAuthor("WeihanLi")
    .HasTitle("WeihanLi.Npoi test")
    .HasDescription("WeihanLi.Npoi test")
    .HasSubject("WeihanLi.Npoi test");

setting.HasSheetConfiguration(0, "SystemSettingsList", 1);

// setting.HasFilter(0, 1).HasFreezePane(0, 1, 2, 1);

setting.Property(_ => _.SettingId)
    .HasColumnIndex(0);

setting.Property(_ => _.SettingName)
    .HasColumnTitle("SettingName")
    .HasColumnIndex(1);

setting.Property(_ => _.DisplayName)
    .HasOutputFormatter((entity, displayName) => $"AAA_{entity.SettingName}_{displayName}")
    .HasInputFormatter((entity, originVal) => originVal.Split(new[] { '_' })[2])
    .HasColumnTitle("DisplayName")
    .HasColumnIndex(2);

setting.Property(_ => _.SettingValue)
    .HasColumnTitle("SettingValue")
    .HasColumnIndex(3);

setting.Property(_ => _.CreatedTime)
    .HasColumnTitle("CreatedTime")
    .HasColumnIndex(4)
    .HasColumnWidth(10)
    .HasColumnFormatter("yyyy-MM-dd HH:mm:ss");

setting.Property(_ => _.CreatedBy)
    .HasColumnIndex(4)
    .HasColumnTitle("CreatedBy");

經過 OutputFormatter/InputFormatter 咱們能夠大大提升導出/導入的靈活性,CSV 也一樣適用

小功能

  • 增長了導入 excel 時根據導入的文件內容自動調整列的順序,這樣即便不是嚴格按照配置的列順序定義的excel文件也能夠正常的讀取
  • 增長了 ExcelHelper.LoadExcel()/ExcelHelper.ToEntityList Stream/byte[] 的重載,使得用戶能夠直接從上傳的文件流或者一個字節數組中獲取 excel 內容
  • 增長了 CsvHelper.ToEntityList(byte[] bytes)/CsvHelper.ToEntityList(Stream stream)
  • 導出 excel 時增長 sheetIndex 參數,支持按某一個 sheet 導出,原來只能導出第一個 sheet
  • 修復了 excel 導入導出不區分 string.Empty/null 的問題
  • 修復了一些 csv 導入導出的bug
  • 增長了對更多格式的讀取,對於下面這些格式的文件都按照 xlsx 處理,

.xlsx:基於XML文件格式的Excel 2007工做簿缺省格式
.xlsm:基於XML且啓用宏的Excel 2007工做簿
.xltx:Excel2007模板格式
.xltm:Excel 2007宏模板
.xlam:Excel 2007宏加載項
.xlsb:Excel2007爲大的或複雜的工做簿新引入的非XML二進制文件格,容許優化執行和向後兼容。

More

能夠查看 Github 上的 ReleaseNotes 來查看最近更新

更多詳情能夠參考 Github 上的 PR,如今每一次包版本的更新都會有相應的 PR,PR 合併以後經過 Azure Devops 自動發佈 nuget 包

但願打造一個更好的 Excel 導入導出工具,歡迎使用,歡迎給我提 issue,bug/feature 都歡迎

相關文章
相關標籤/搜索