WeihanLi.Npoi 近期更新
Intro
最近對我的 NPOI 擴展做了一些改變,一方面提高性能,一方面修復bug,增加一些新的功能來讓它更加好用,前幾天發布了 1.5.0 版本,下面來介紹一下最近的更新
默認匯入/匯出格式變更
在 1.5.0 版本中,將默認匯入/匯出的excel格式從 xlsx 改為 xls 以獲得更好的性能,需要注意的是 xls 格式的 excel 檔案一個 sheet 最多 65535 行資料,超過的話會報錯,
xls 可以有更好的性能和更優的記憶體分配,xlsx 可能是因為要和 xlsx 保持一致的介面,一致的編程體驗才會性能有點問題,建議最好使用 xls 格式的 excel
具體的性能測驗可以參考 Github,這里貼幾張圖:
- 基本測驗:https://github.com/WeihanLi/WeihanLi.Npoi/blob/dev/perf/WeihanLi.Npoi.Benchmark/BenchmarkDotNet.Artifacts/results/WeihanLi.Npoi.Benchmark.WorkbookBasicTest-report-github.md
- Excel 匯出測驗:https://github.com/WeihanLi/WeihanLi.Npoi/blob/dev/perf/WeihanLi.Npoi.Benchmark/BenchmarkDotNet.Artifacts/results/WeihanLi.Npoi.Benchmark.ExportExcelTest-report-github.md
- Excel 匯入測驗:https://github.com/WeihanLi/WeihanLi.Npoi/blob/dev/perf/WeihanLi.Npoi.Benchmark/BenchmarkDotNet.Artifacts/results/WeihanLi.Npoi.Benchmark.ImportExcelTest-report-github.md

匯出資料較多,截圖難以完整展示,建議看 Github 上的測驗結果,或者自己拉取代碼,在自己電腦上跑測驗


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.ToEntityListStream/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 都歡迎
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/107291.html
標籤:C#
