WeihanLi.Npoi 1.13.0 更新日誌

WeihanLi發表於2020-11-21

WeihanLi.Npoi 1.13.0 更新日誌

Intro

在 Github 上收到 Issue 收到網友反饋希望支援自動分 Sheet 匯出,有興趣的可以參考 Issue https://github.com/WeihanLi/WeihanLi.Npoi/issues/94

從我個人角度來說,我覺得如果要匯出很大批量的資料,可以匯出 csv 檔案,沒有必要非得匯出 Excel 檔案,畢竟現在機器學習資料訓練等很多都是用的 csv,而且 csv 的格式簡單,更方便匯出,匯出效能會Excel更好更高效。

不過有些場景可能必須要用 Excel,所以想了一下還是加一下這個功能吧,目前支援 ListDataTable 直接匯出 Excel

使用示例

使用起來比較簡單,和之前的使用並沒有什麼不同,可以參考下面的單元測試:

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);
}

More

除了上面的示例,還提供了兩個擴充套件方法 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

Reference

相關文章