CloudyWing.SpreadsheetExporter.Renderer.ClosedXML 3.1.0

dotnet add package CloudyWing.SpreadsheetExporter.Renderer.ClosedXML --version 3.1.0
                    
NuGet\Install-Package CloudyWing.SpreadsheetExporter.Renderer.ClosedXML -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.Renderer.ClosedXML" 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.Renderer.ClosedXML" Version="3.1.0" />
                    
Directory.Packages.props
<PackageReference Include="CloudyWing.SpreadsheetExporter.Renderer.ClosedXML" />
                    
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.Renderer.ClosedXML --version 3.1.0
                    
#r "nuget: CloudyWing.SpreadsheetExporter.Renderer.ClosedXML, 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.Renderer.ClosedXML@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.Renderer.ClosedXML&version=3.1.0
                    
Install as a Cake Addin
#tool nuget:?package=CloudyWing.SpreadsheetExporter.Renderer.ClosedXML&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

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
3.1.0 100 5/24/2026
3.0.0 128 3/29/2026