WeihanLi.Npoi 近期更新


WeihanLi.Npoi 近期更新

Intro

最近對我的 NPOI 擴展做了一些改變,一方面提高性能,一方面修復bug,增加一些新的功能來讓它更加好用,前幾天發布了 1.5.0 版本,下面來介紹一下最近的更新

默認導入/導出格式變更

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

具體的性能測試可以參考 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 來使得導入更加靈活

看個示例:

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 都歡迎


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM