CloudyWing.SpreadsheetExporter 3.1.0

dotnet add package CloudyWing.SpreadsheetExporter --version 3.1.0
                    
NuGet\Install-Package CloudyWing.SpreadsheetExporter -Version 3.1.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="CloudyWing.SpreadsheetExporter" Version="3.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="CloudyWing.SpreadsheetExporter" Version="3.1.0" />
                    
Directory.Packages.props
<PackageReference Include="CloudyWing.SpreadsheetExporter" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add CloudyWing.SpreadsheetExporter --version 3.1.0
                    
#r "nuget: CloudyWing.SpreadsheetExporter, 3.1.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package CloudyWing.SpreadsheetExporter@3.1.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=CloudyWing.SpreadsheetExporter&version=3.1.0
                    
Install as a Cake Addin
#tool nuget:?package=CloudyWing.SpreadsheetExporter&version=3.1.0
                    
Install as a Cake Tool

SpreadsheetExporter

License: MIT

此專案只是我為懶得計算 Excel 座標和處理合併儲存格開發出來的套件,只有在我比較常使用 Excel 那段時間會進行維護,且可能一加功能就是破壞性變更的大改版,不建議其他人使用。

專案內容

SpreadsheetExporter 採用了「先描述活頁簿,再交給 Renderer 輸出」的架構。核心專案負責建立 SpreadsheetDocumentSheetDefinition 與各種模板;實際 .xlsx 產出則由 ClosedXML Renderer 負責。

Solution 內容

Installation

.NET CLI

dotnet add package CloudyWing.SpreadsheetExporter
dotnet add package CloudyWing.SpreadsheetExporter.Renderer.ClosedXML

Quick Start

若是 Console、腳本或沒有導入 DI 的專案,建議直接用 SpreadsheetManager.SetRenderer(...) 作為最短路徑:

using CloudyWing.SpreadsheetExporter;
using CloudyWing.SpreadsheetExporter.Renderer.ClosedXML;
using CloudyWing.SpreadsheetExporter.Templates;
using CloudyWing.SpreadsheetExporter.Templates.RecordSet;

SpreadsheetManager.SetRenderer(static () => new ExcelRenderer());

SpreadsheetDocument document = SpreadsheetManager.CreateDocument();
SheetDefinition sheet = document.CreateSheet("Orders", defaultRowHeight: 20);

RecordSetTemplate<Order> template = new(GetOrders()) {
    HeaderHeight = 22,
    RecordHeight = 20
};

template.Columns
    .Add("Order ID", order => order.OrderId)
    .Add("Customer", order => order.Customer)
    .Add(
        "Amount",
        order => order.Amount,
        fieldStyleGenerator: _ => SpreadsheetManager.DefaultCellStyles.FieldStyle with {
            HorizontalAlignment = HorizontalAlignment.Right,
            DataFormat = "#,##0.00"
        }
    );

sheet.AddTemplate(template);
sheet
    .SetFreezePanes(0, 1)
    .SetAutoFilterEnabled();

document.ExportFile("orders.xlsx");

若你偏好以設定檔描述報表,也可以使用:

SpreadsheetManager.SetRenderer(static () => new ExcelRenderer());
SpreadsheetDocument document = SpreadsheetDocument.FromJson(json);
byte[] bytes = document.Export();

若你的專案已經使用 DI,也可以在組合根先完成初始化,再建立文件:

using CloudyWing.SpreadsheetExporter;
using CloudyWing.SpreadsheetExporter.Renderer.ClosedXML;
using Microsoft.Extensions.DependencyInjection;

ServiceCollection services = new();
services.AddSingleton<ISpreadsheetRenderer>(_ => new ExcelRenderer());
services.AddSingleton(_ => {
    SpreadsheetManager.DefaultCellStyles = new CellStyleConfiguration {
        FieldStyle = SpreadsheetManager.DefaultCellStyles.FieldStyle with {
            DataFormat = "#,##0.00"
        }
    };

    return 0;
});

ServiceProvider serviceProvider = services.BuildServiceProvider();
ISpreadsheetRenderer renderer = serviceProvider.GetRequiredService<ISpreadsheetRenderer>();

SpreadsheetDocument document = new(renderer);

Sample 與 Benchmark

執行 Sample

dotnet run --project .\samples\SpreadsheetExporter.Sample

Sample 會在執行輸出目錄下的 artifacts 目錄建立:

  • sales-report.xlsx
  • sales-report-json.xlsx

執行 Benchmarks

dotnet run -c Release --project .\benchmarks\SpreadsheetExporter.Benchmarks -- --filter *

目前 benchmark 聚焦於兩類工作負載:

  • TemplateBenchmarks:量測模板建立與 JSON 解析成本。
  • ExporterBenchmarks:量測 ClosedXML 匯出基本版與含樣式版活頁簿的成本。

Documentation

完整文件請參考:https://cloudywing.github.io/SpreadsheetExporter/

主要文件入口:

License

This project is MIT licensed.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (3)

Showing the top 3 NuGet packages that depend on CloudyWing.SpreadsheetExporter:

Package Downloads
CloudyWing.SpreadsheetExporter.Excel.NPOI

封裝NPOI套件來進行Excel匯出

CloudyWing.SpreadsheetExporter.Excel.EPPlus

封裝EPPlus 4套件來進行Excel匯出

CloudyWing.SpreadsheetExporter.Renderer.ClosedXML

SpreadsheetExporter 的 ClosedXML Excel 匯出實作。

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
3.1.0 114 5/24/2026
3.0.0 151 3/29/2026
2.2.0 204 1/21/2026
2.1.2 247 1/10/2025
2.1.1 75 11/18/2024
2.1.0 150 11/17/2024
2.0.0 296 9/17/2024
1.0.0 420 6/19/2023
0.2.2 504 12/23/2021
0.2.1 445 12/23/2021
0.2.0 831 12/19/2021 0.2.0 is deprecated because it has critical bugs.
0.1.1 450 12/12/2021
0.1.0 667 8/26/2021
0.0.5 545 1/27/2021