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"]