最近對我的 NPOI 擴展做了一些改變,一方面提高性能,一方面修複bug,增加一些新的功能來讓它更加好用,前幾天發佈了 1.5.0 版本,下麵來介紹一下最近的更新 ...
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.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 都歡迎