{"id":21623038,"url":"https://github.com/pandatecham/be-lib-file-exporter","last_synced_at":"2026-04-20T09:03:27.787Z","repository":{"id":231527121,"uuid":"647737465","full_name":"PandaTechAM/be-lib-file-exporter","owner":"PandaTechAM","description":"Export given data into Excel/PDF","archived":false,"fork":false,"pushed_at":"2026-02-28T15:40:32.000Z","size":2575,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"development","last_synced_at":"2026-02-28T18:52:32.566Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/PandaTechAM.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-05-31T12:18:44.000Z","updated_at":"2026-02-28T15:40:19.000Z","dependencies_parsed_at":"2025-05-19T13:28:17.301Z","dependency_job_id":"c036917c-4a26-43f5-9d94-4833e66c1f98","html_url":"https://github.com/PandaTechAM/be-lib-file-exporter","commit_stats":null,"previous_names":["pandatecham/be-lib-file-exporter"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/PandaTechAM/be-lib-file-exporter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PandaTechAM%2Fbe-lib-file-exporter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PandaTechAM%2Fbe-lib-file-exporter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PandaTechAM%2Fbe-lib-file-exporter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PandaTechAM%2Fbe-lib-file-exporter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/PandaTechAM","download_url":"https://codeload.github.com/PandaTechAM/be-lib-file-exporter/tar.gz/refs/heads/development","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PandaTechAM%2Fbe-lib-file-exporter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32040353,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-20T00:18:06.643Z","status":"online","status_checked_at":"2026-04-20T02:00:06.527Z","response_time":94,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-25T00:11:21.665Z","updated_at":"2026-04-20T09:03:27.777Z","avatar_url":"https://github.com/PandaTechAM.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PandaTech.FileExporter\n\nHigh-performance CSV and XLSX exporting library for .NET 8+ with convention-based defaults, fluent configuration, async\nstreaming, multi-sheet support, and automatic compression.\n\n## Installation\n\n```bash\ndotnet add package PandaTech.FileExporter\n```\n\n## Quick Start\n\n### 1. Register in Program.cs\n\n```csharp\nusing FileExporter.Extensions;\n\nvar builder = WebApplication.CreateBuilder(args);\n\n// Scan for ExportRule\u003cT\u003e configurations\nbuilder.AddFileExporter(typeof(Program).Assembly);\n```\n\n### 2. Export Data (Zero Configuration)\n\n```csharp\nusing FileExporter.Extensions;\n\nvar products = await db.Products.ToListAsync();\n\n// CSV export with automatic file naming and formatting\nvar csvFile = await products.ToFileFormatAsync(ExportFormat.Csv);\n\n// XLSX export with multi-sheet support for large datasets\nvar excelFile = await products.ToFileFormatAsync(ExportFormat.Xlsx);\n\n// Return from minimal API\nreturn csvFile.ToFileResult();\n```\n\n**That's it!** The library uses conventions to:\n\n- Auto-detect property types and apply formatting\n- Generate column headers from property names (e.g., `CreatedDate` → \"Created Date\")\n- Apply sensible column widths\n- Handle nulls, enums, dates, decimals automatically\n\n## Custom Configuration\n\n### Define Export Rules\n\n```csharp\nusing FileExporter.Rules;\nusing FileExporter.Enums;\n\npublic class Product\n{\n    public int Id { get; set; }\n    public string Name { get; set; }\n    public decimal Price { get; set; }\n    public DateTime CreatedDate { get; set; }\n    public ProductStatus Status { get; set; }\n}\n\npublic class ProductExportRule : ExportRule\u003cProduct\u003e\n{\n    public ProductExportRule()\n    {\n        // Custom file name (supports {DateTime} placeholder)\n        WithName(\"Product Report {DateTime}\");\n        \n        // Configure columns\n        RuleFor(x =\u003e x.Id)\n            .WriteToColumn(\"Product ID\")\n            .HasOrder(1);\n        \n        RuleFor(x =\u003e x.Name)\n            .WriteToColumn(\"Product Name\")\n            .HasOrder(2)\n            .HasWidth(30);\n        \n        RuleFor(x =\u003e x.Price)\n            .WriteToColumn(\"Price (USD)\")\n            .HasFormat(ColumnFormatType.Currency)\n            .HasPrecision(2)\n            .HasOrder(3);\n        \n        RuleFor(x =\u003e x.CreatedDate)\n            .WriteToColumn(\"Created\")\n            .HasFormat(ColumnFormatType.DateTime)\n            .HasOrder(4);\n        \n        RuleFor(x =\u003e x.Status)\n            .WriteToColumn(\"Status\")\n            .WithEnumFormat(EnumFormatMode.Name) // Int, Name, or MixedIntAndName\n            .HasOrder(5);\n    }\n}\n```\n\n## Features\n\n### Convention-Based Defaults\n\nWithout configuration, the library automatically:\n\n| Property Type       | Format Applied     | Column Width    | Example Output      |\n|---------------------|--------------------|-----------------|---------------------|\n| `string`            | Text               | Based on header | \"Product Name\"      |\n| `int`, `long`       | Integer            | 12              | 1234                |\n| `decimal`, `double` | Decimal (2 places) | 12              | 99.99               |\n| `DateTime`          | DateTime           | 19              | 2024-01-15 14:30:00 |\n| `DateOnly`          | Date               | 12              | 2024-01-15          |\n| `bool`              | Yes/No             | 8               | Yes                 |\n| `enum`              | Mixed int + name   | Based on header | 1 - Active          |\n\n### Column Configuration API\n\n| Method                           | Description              | Example                                 |\n|----------------------------------|--------------------------|-----------------------------------------|\n| `WriteToColumn(string)`          | Set column header        | `.WriteToColumn(\"Full Name\")`           |\n| `HasOrder(int)`                  | Set column position      | `.HasOrder(1)`                          |\n| `HasWidth(int)`                  | Set column width (chars) | `.HasWidth(25)`                         |\n| `HasFormat(ColumnFormatType)`    | Set format type          | `.HasFormat(ColumnFormatType.Currency)` |\n| `HasPrecision(int)`              | Set decimal places       | `.HasPrecision(4)`                      |\n| `WithEnumFormat(EnumFormatMode)` | Enum display mode        | `.WithEnumFormat(EnumFormatMode.Name)`  |\n| `WithDefaultValue(string)`       | Default for nulls        | `.WithDefaultValue(\"N/A\")`              |\n| `Transform(Func)`                | Custom transformation    | `.Transform(x =\u003e x?.ToUpper())`         |\n| `Ignore()`                       | Exclude from export      | `.Ignore()`                             |\n\n### Format Types\n\n```csharp\npublic enum ColumnFormatType\n{\n    Default,      // Auto-detect from property type\n    Text,         // Force as text\n    Integer,      // Whole numbers\n    Decimal,      // Fixed decimal places\n    Currency,     // Currency formatting with symbol\n    Percentage,   // Percentage with % symbol\n    Date,         // Date only (yyyy-MM-dd)\n    DateTime,     // Date and time\n    Boolean       // Yes/No\n}\n```\n\n### Enum Formatting\n\n```csharp\npublic enum EnumFormatMode\n{\n    MixedIntAndName, // \"1 - Active\" (default)\n    Int,             // \"1\"\n    Name             // \"Active\"\n}\n```\n\n## Advanced Features\n\n### Multi-Sheet XLSX\n\nFiles with \u003e1,048,575 rows automatically split into multiple sheets:\n\n```csharp\nvar hugeDataset = await db.Orders.ToListAsync(); // 3 million rows\n\nvar file = await hugeDataset.ToFileFormatAsync(ExportFormat.Xlsx);\n// Creates single .xlsx with 3 sheets: \"Orders\", \"Orders_2\", \"Orders_3\"\n```\n\n### Auto-Compression\n\nFiles \u003e10MB automatically compress to ZIP:\n\n```csharp\nvar largeExport = await data.ToFileFormatAsync(ExportFormat.Csv);\n// If \u003e10MB: returns \"Report 2024-01-15.zip\" containing \"Report 2024-01-15.csv\"\n// If \u003c10MB: returns \"Report 2024-01-15.csv\" directly\n```\n\n### Async Streaming\n\n```csharp\nIAsyncEnumerable\u003cProduct\u003e GetProductsAsync()\n{\n    await foreach (var product in db.Products.AsAsyncEnumerable())\n    {\n        yield return product;\n    }\n}\n\nvar stream = GetProductsAsync();\nvar file = await stream.ToCsvAsync();\n```\n\n### Custom Transformations\n\n```csharp\nRuleFor(x =\u003e x.Email)\n    .Transform(email =\u003e email?.Contains(\"@\") == true \n        ? MaskEmail(email) \n        : \"N/A\");\n\nRuleFor(x =\u003e x.Price)\n    .Transform(price =\u003e price * 1.20m) // Add 20% markup\n    .HasFormat(ColumnFormatType.Currency);\n\nRuleFor(x =\u003e x.Tags)\n    .Transform(tags =\u003e string.Join(\", \", tags)); // List\u003cstring\u003e → \"tag1, tag2\"\n```\n\n### Minimal API Integration\n\n```csharp\napp.MapGet(\"/export/products/csv\", async (AppDbContext db) =\u003e\n{\n    var products = await db.Products.ToListAsync();\n    var file = await products.ToFileFormatAsync(ExportFormat.Csv);\n    return file.ToFileResult();\n});\n\napp.MapGet(\"/export/products/xlsx\", async (AppDbContext db) =\u003e\n{\n    var products = await db.Products.ToListAsync();\n    var file = await products.ToFileFormatAsync(ExportFormat.Xlsx);\n    return file.ToFileResult();\n});\n```\n\n### File Naming\n\n**Default naming:**\n\n```csharp\ntypeof(Product) → \"Product 2024-01-15 14:30:00\"\n```\n\n**Custom naming with placeholder:**\n\n```csharp\nWithName(\"Sales Report {DateTime}\")\n// Output: \"Sales Report 2024-01-15 14:30:00\"\n```\n\n**Fixed name:**\n\n```csharp\nWithName(\"Monthly_Export\")\n// Output: \"Monthly Export 2024-01-15 14:30:00\" (DateTime still appended)\n```\n\n## Extension Methods\n\n### IEnumerable\u003cT\u003e\n\n```csharp\nvar file = await data.ToFileFormatAsync(ExportFormat.Csv);\nvar file = await data.ToFileFormatAsync(ExportFormat.Xlsx);\n```\n\n### IAsyncEnumerable\u003cT\u003e\n\n```csharp\nvar file = await asyncData.ToCsvAsync();\nvar file = await asyncData.ToXlsxAsync();\nvar file = await asyncData.ToFileFormatAsync(ExportFormat.Csv);\n```\n\n### ExportFile\n\n```csharp\nvar file = await data.ToFileFormatAsync(ExportFormat.Xlsx);\n\n// Get file properties\nstring name = file.Name;         // \"Products 2024-01-15 14:30:00.xlsx\"\nstring mimeType = file.MimeType; // \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\nbyte[] content = file.Content;\n\n// Return from API\nreturn file.ToFileResult();\n```\n\n## Performance\n\nBuilt on industry-standard libraries:\n\n- **CsvHelper** (33.1.0) - Fast, reliable CSV parsing/writing\n- **SpreadCheetah** (1.25.0) - High-performance XLSX generation\n\n**Benchmarks** (1M rows, 10 columns):\n\n- CSV export: ~3 seconds, ~100MB file\n- XLSX export: ~8 seconds, ~40MB file\n- Memory: Streaming-based, low memory footprint\n\n## Limits\n\n| Feature              | Limit         | Behavior                       |\n|----------------------|---------------|--------------------------------|\n| XLSX rows per sheet  | 1,048,575     | Auto-creates additional sheets |\n| XLSX sheet name      | 31 characters | Auto-truncates                 |\n| File size before zip | 10 MB         | Auto-compresses to ZIP         |\n\n## Complete Example\n\n```csharp\n// Model\npublic class Order\n{\n    public int OrderId { get; set; }\n    public string CustomerName { get; set; }\n    public decimal TotalAmount { get; set; }\n    public DateTime OrderDate { get; set; }\n    public OrderStatus Status { get; set; }\n    public string? Notes { get; set; }\n}\n\n// Export configuration\npublic class OrderExportRule : ExportRule\u003cOrder\u003e\n{\n    public OrderExportRule()\n    {\n        WithName(\"Order Export {DateTime}\");\n        \n        RuleFor(x =\u003e x.OrderId)\n            .WriteToColumn(\"Order #\")\n            .HasOrder(1);\n        \n        RuleFor(x =\u003e x.CustomerName)\n            .WriteToColumn(\"Customer\")\n            .HasWidth(30)\n            .HasOrder(2);\n        \n        RuleFor(x =\u003e x.TotalAmount)\n            .WriteToColumn(\"Total\")\n            .HasFormat(ColumnFormatType.Currency)\n            .HasPrecision(2)\n            .HasOrder(3);\n        \n        RuleFor(x =\u003e x.OrderDate)\n            .WriteToColumn(\"Date\")\n            .HasFormat(ColumnFormatType.DateTime)\n            .HasOrder(4);\n        \n        RuleFor(x =\u003e x.Status)\n            .WriteToColumn(\"Status\")\n            .WithEnumFormat(EnumFormatMode.Name)\n            .HasOrder(5);\n        \n        RuleFor(x =\u003e x.Notes)\n            .WriteToColumn(\"Notes\")\n            .WithDefaultValue(\"No notes\")\n            .HasOrder(6);\n    }\n}\n\n// Usage\nvar orders = await db.Orders.ToListAsync();\nvar file = await orders.ToFileFormatAsync(ExportFormat.Xlsx);\nreturn file.ToFileResult();\n```\n\n## License\n\nMIT","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpandatecham%2Fbe-lib-file-exporter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpandatecham%2Fbe-lib-file-exporter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpandatecham%2Fbe-lib-file-exporter/lists"}