Magicodes.ExporterAndImporter: A Versatile Data Import-Export Solution for .NET

Features

  • Streamlines Excel-based import/export operations with extensible architecture for CSV and PDF support
  • Attribute-based configuration eliminates manual code adjustments for display logic
  • Designed for seamless integration with dedicated Data Transfer Objects (DTOs)
  • Customizable column headers with multilingual support via localization functions
  • Text processing during export for data transformation
  • Automatic template generation based on import DTO specifications
  • Comprehensive data validation rules integration
  • Dropdown list support for structured data input
  • Comment annotations for enhanced template clarity

NuGet Packages

Official NuGet packages are available for both import and export functionality.

Export Examples

Basic Export

public class ProductExportModel
{
    public string ProductName { get; set; }
    public string Category { get; set; }
    public decimal Price { get; set; }
    public int Quantity { get; set; }
}

var result = await Exporter.Export("products.xlsx", new List<ProductExportModel>
{
    new ProductExportModel { ProductName = "Widget A", Category = "Electronics", Price = 19.99m, Quantity = 100 },
    new ProductExportModel { ProductName = "Gadget B", Category = "Accessories", Price = 49.99m, Quantity = 50 }
});

Attribute-Based Export

[ExcelExporter(Name = "Product Report", TableStyle = "Light10")]
public class ProductExportWithAttributes
{
    [ExporterHeader(DisplayName = "Product Name", IsBold = true)]
    public string ProductName { get; set; }

    [ExporterHeader(DisplayName = "Category")]
    public string Category { get; set; }

    [ExporterHeader(DisplayName = "Price", Format = "C2")]
    public decimal Price { get; set; }

    [ExporterHeader(DisplayName = "Quantity", IsAutoFit = true)]
    public int Quantity { get; set; }

    [ExporterHeader(DisplayName = "Hidden Field", IsIgnore = true)]
    public string InternalId { get; set; }
}

var result = await Exporter.Export("product_report.xlsx", new List<ProductExportWithAttributes>
{
    new ProductExportWithAttributes
    {
        ProductName = "Widget A",
        Category = "Electronics",
        Price = 19.99m,
        Quantity = 100,
        InternalId = "X123"
    },
    new ProductExportWithAttributes
    {
        ProductName = "Gadget B",
        Category = "Accessories",
        Price = 49.99m,
        Quantity = 50,
        InternalId = "X456"
    }
});

Multilingual Column Headers

[ExcelExporter(Name = "Localized Report", TableStyle = "Light10")]
public class LocalizationDemoModel
{
    [ExporterHeader(DisplayName = "Product Name")]
    public string ProductName { get; set; }

    [ExporterHeader(DisplayName = "Price")]
    public decimal Price { get; set; }
}

ExcelBuilder.Create()
    .WithLocalStringFunc(key => key switch
    {
        "Product Name" => "Nom du produit",
        "Price" => "Prix",
        _ => "Unknown"
    })
    .Build();

var result = await Exporter.Export("localized_report.xlsx", new List<LocalizationDemoModel>
{
    new LocalizationDemoModel { ProductName = "Widget A", Price = 19.99m },
    new LocalizationDemoModel { ProductName = "Gadget B", Price = 49.99m }
});

Import Examples

Basic Import Template

public class ProductImportDto
{
    /// <summary>
    /// Product name
    /// </summary>
    [ImporterHeader(Name = "Product Name")]
    public string Name { get; set; }

    /// <summary>
    /// Product code
    /// </summary>
    [ImporterHeader(Name = "Product Code")]
    public string Code { get; set; }

    /// <summary>
    /// Barcode
    /// </summary>
    [ImporterHeader(Name = "Barcode")]
    public string BarCode { get; set; }
}

Multiple Data Types

public class ProductImportDto
{
    [ImporterHeader(Name = "Product Name")]
    public string Name { get; set; }

    [ImporterHeader(Name = "Product Code")]
    public string Code { get; set; }

    [ImporterHeader(Name = "Barcode")]
    public string BarCode { get; set; }

    [ImporterHeader(Name = "Customer ID")]
    public long CustomerId { get; set; }

    [ImporterHeader(Name = "Model")]
    public string Model { get; set; }

    [ImporterHeader(Name = "Declared Value")]
    public double DeclareValue { get; set; }

    [ImporterHeader(Name = "Currency")]
    public string CurrencyUnit { get; set; }

    [ImporterHeader(Name = "Brand")]
    public string BrandName { get; set; }

    [ImporterHeader(Name = "Dimensions (LxWxH)")]
    public string Size { get; set; }

    [ImporterHeader(Name = "Weight (KG)")]
    public double Weight { get; set; }

    [ImporterHeader(Name = "Type")]
    public ProductType Type { get; set; }

    [ImporterHeader(Name = "Status")]
    public bool IsActive { get; set; }
}

public enum ProductType
{
    [Display(Name = "Electronics")]
    Electronics,

    [Display(Name = "Clothing")]
    Clothing,

    [Display(Name = "Furniture")]
    Furniture
}

Data Validation

public class ProductImportDto
{
    /// <summary>
    /// Product name (required)
    /// </summary>
    [ImporterHeader(Name = "Product Name", Description = "Required field")]
    [Required(ErrorMessage = "Product name is mandatory")]
    public string Name { get; set; }

    /// <summary>
    /// Product code (max 8 characters)
    /// </summary>
    [ImporterHeader(Name = "Product Code", Description = "Max 8 characters")]
    [MaxLength(8, ErrorMessage = "Code cannot exceed 8 characters")]
    public string Code { get; set; }

    /// <summary>
    /// Barcode (numeric only)
    /// </summary>
    [ImporterHeader(Name = "Barcode")]
    [MaxLength(10, ErrorMessage = "Barcode must be 10 digits or less")]
    [RegularExpression(@"^\d+$", ErrorMessage = "Barcode must contain only digits")]
    public string BarCode { get; set; }

    [ImporterHeader(Name = "Customer ID")]
    public long CustomerId { get; set; }

    // ... other properties omitted for brevity
}

Docker Integration

To use the library in Docker environments, install libgdiplus for Excel export functionality:

RUN apt-get update && apt-get install -y libgdiplus libc6-dev
RUN ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll

Dockerfile Example

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src

# Copy project files and restore dependencies
COPY ["src/web/Admin.Host/Admin.Host.csproj", "src/web/Admin.Host/"]
COPY ["src/web/Admin.Web.Core/Admin.Web.Core.csproj", "src/web/Admin.Web.Core/"]
COPY ["src/application/Admin.Application/Admin.Application.csproj", "src/application/Admin.Application/"]
COPY ["src/core/Magicodes.Admin.Core/Magicodes.Admin.Core.csproj", "src/core/Magicodes.Admin.Core/"]
COPY ["src/data/Magicodes.Admin.EntityFrameworkCore/Magicodes.Admin.EntityFrameworkCore.csproj", "src/data/Magicodes.Admin.EntityFrameworkCore/"]
COPY ["src/core/Magicodes.Admin.Core.Custom/Magicodes.Admin.Core.Custom.csproj", "src/core/Magicodes.Admin.Core.Custom/"]
COPY ["src/application/Admin.Application.Custom/Admin.Application.Custom.csproj", "src/application/Admin.Application.Custom/"]

RUN dotnet restore "src/web/Admin.Host/Admin.Host.csproj"

# Build the application
COPY . .
WORKDIR "/src/src/web/Admin.Host"
RUN dotnet build "Admin.Host.csproj" -c Release -o /app

# Publish the application
FROM build AS publish
RUN dotnet publish "Admin.Host.csproj" -c Release -o /app

# Final runtime image
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Admin.Host.dll"]

Tags: .NET Excel data-import data-export dto

Posted on Sat, 24 Oct 2026 16:02:50 +0000 by rwcurry