在 Github 上收到 Issue 收到網友反饋但願支持自動分 Sheet 導出,有興趣的能夠參考 Issue https://github.com/WeihanLi/WeihanLi.Npoi/issues/94html
從我我的角度來講,我以爲若是要導出很大批量的數據,能夠導出 csv 文件,沒有必要非得導出 Excel 文件,畢竟如今機器學習數據訓練等不少都是用的 csv,並且 csv 的格式簡單,更方便導出,導出性能會Excel更好更高效。git
不過有些場景可能必需要用 Excel,因此想了一下仍是加一下這個功能吧,目前支持 List
或 DataTable
直接導出 Excelgithub
使用起來比較簡單,和以前的使用並無什麼不一樣,能夠參考下面的單元測試:api
List 自動分 Sheet 導出:數組
[Theory] [InlineData(ExcelFormat.Xls, 1000, 1)] [InlineData(ExcelFormat.Xls, 65536, 2)] [InlineData(ExcelFormat.Xls, 132_000, 3)] //[InlineData(ExcelFormat.Xls, 1_000_000, 16)] //[InlineData(ExcelFormat.Xlsx, 1_048_576, 2)] public void EntityListAutoSplitSheetsTest(ExcelFormat excelFormat, int rowsCount, int expectedSheetCount) { var list = Enumerable.Range(1, rowsCount) .Select(x => new Notice() { Id = x, Content = $"content_{x}", Title = $"title_{x}", Publisher = $"publisher_{x}" }) .ToArray(); var bytes = list.ToExcelBytes(excelFormat); var workbook = ExcelHelper.LoadExcel(bytes, excelFormat); Assert.Equal(expectedSheetCount, workbook.NumberOfSheets); }
DataTable 自動分 Sheet 導出:機器學習
[Theory] [InlineData(ExcelFormat.Xls, 1000, 1)] [InlineData(ExcelFormat.Xls, 65536, 2)] [InlineData(ExcelFormat.Xls, 132_000, 3)] //[InlineData(ExcelFormat.Xls, 1_000_000, 16)] //[InlineData(ExcelFormat.Xlsx, 1_048_576, 2)] public void DataTableAutoSplitSheetsTest(ExcelFormat excelFormat, int rowsCount, int expectedSheetCount) { var dataTable = new DataTable(); dataTable.Columns.Add(new DataColumn("Id", typeof(int))); for (var i = 0; i < rowsCount; i++) { var row = dataTable.NewRow(); row.ItemArray = new object[] { i+1 }; dataTable.Rows.Add(row); } Assert.Equal(rowsCount, dataTable.Rows.Count); var bytes = dataTable.ToExcelBytes(excelFormat); var workbook = ExcelHelper.LoadExcel(bytes, excelFormat); Assert.Equal(expectedSheetCount, workbook.NumberOfSheets); }
除了上面的示例,還提供了兩個擴展方法 GetWorkbookWithAutoSplitSheet<TEntity>(this IList<TEntity> entityList, ExcelFormat excelFormat)
/GetWorkbookWithAutoSplitSheet(this DataTable dataTable, ExcelFormat excelFormat, ExcelSetting excelSetting = null)
來獲取自動分 Sheet 以後的 IWorkbook
,進行進一步的自定義操做。性能
其餘的操做方式和以前徹底同樣,能夠直接導出文件,字節數組,或者寫入到指定 Stream 裏單元測試
void ToExcelFile<TEntity>(this IList<TEntity> entityList, string excelPath); byte[] ToExcelBytes<TEntity>(this IList<TEntity> entityList, ExcelFormat excelFormat = ExcelFormat.Xls); void ToExcelStream<TEntity>(this IList<TEntity> entityList, Stream stream, ExcelFormat excelFormat = ExcelFormat.Xls);
詳細變動能夠參考 PR: https://github.com/WeihanLi/WeihanLi.Npoi/pull/96/files學習