Universal Export Engine is a .NET Extension Service designed for the OutSystems Platform.It enables exporting any data type to Excel (.xlsx), PDF, or CSV formats with extensive customization, safety features, and full localization support.
Core Principle
Export once – use everywhere – handle everything
public class CssUniversal_Export_Engine : IssUniversal_Export_Engine
Implements: IssUniversal_Export_Engine
Namespace: OutSystems.NssUniversal_Export_Engine
Type: .NET Class Library (DLL)
Framework: .NET Framework 4.8
Integration: OutSystems Extension
EXPORT_FORMAT_EXCEL = 1 ? Excel (.xlsx)
EXPORT_FORMAT_PDF = 2 ? PDF
EXPORT_FORMAT_CSV = 3 ? CSV
DELIVERY_TYPE_DOWNLOAD = 1 ? Return file to caller
DELIVERY_TYPE_EMAIL = 2 ? Send via Email
DELIVERY_TYPE_STORAGE = 3 ? Save to server storage
Orientation
PAGE_ORIENTATION_PORTRAIT = 1
PAGE_ORIENTATION_LANDSCAPE = 2
Page Size
PAGE_SIZE_A4 = 1
PAGE_SIZE_LETTER = 2
TEXT_ALIGNMENT_LEFT = 1
TEXT_ALIGNMENT_CENTER = 2
TEXT_ALIGNMENT_RIGHT = 3
COLUMN_DATA_TYPE_TEXT = 1
COLUMN_DATA_TYPE_NUMBER = 2
COLUMN_DATA_TYPE_DATE = 3
COLUMN_DATA_TYPE_CURRENCY = 4
COLUMN_DATA_TYPE_BOOLEAN = 5
PurposeConverts OutSystems RLStringListRecordList to .NET List<string>
Process
Iterate through records
Extract ssValue
Return List<string>
Usage
Email recipients extraction
Used when configuration objects are null.
GetDefaultExportOptions()
GetDefaultLayoutConfig()
GetDefaultLocalizationConfig()
GetDefaultSecurityConfig()
GetDefaultPerformanceConfig()
GetDefaultOutputConfig()
Default values are defined in Structures.cs
PurposeConverts any OutSystems data into a unified structure.
Input
Any object (Entity, Structure, JSON, Aggregate result, etc.)
Export options
Process Flow
Serialize to JSON
Parse as JArray / JObject
Reflection fallback
Optional flattening
Graceful null handling
Output
List<Dictionary<string, object>>
Handled Edge Cases
Empty data
Mixed types
Nested objects
Arrays
Null values
Recursive JSON traversal
Array ? comma-separated string
Maintains hierarchy via prefixes
Reflection-based conversion
Flattens complex types (optional)
Skips unreadable properties safely
Checks if a type is:
Primitive
string
DateTime
decimal
Guid
Nullable<T>
Removes OutSystems prefixes and normalizes names.
Examples
ssENEmployee._ssName ? Name
Customer.Address.Street ? Street
_Status ? Status
Automatically excludes system attributes:
ChangedAttributes
OptimizedAttributes
Modes
Auto-detect
Manual configuration
Features
Column ordering
Data type detection
Display name cleanup
Width & alignment defaults
Samples first non-null values and detects:
Number
Date
Boolean
Text (default)
Applies formatting based on:
Data type
Culture
Time zone
Column overrides
Defaults
Date: yyyy-MM-dd HH:mm:ss
Boolean: Yes / No
Null: Empty string
Performs full pre-execution validation.
Validates
Data existence
Export format
Column config
Layout config
Security rules
Performance limits
Output delivery requirements
Returns
Errors (blocking)
Warnings (non-blocking)
Library: ClosedXMLFeatures
Multi-sheet ready
Auto-fit columns
Custom widths
Alignment & wrap
Type-aware formatting
UTF-8 encoding
Culture-aware formatting
Full CSV escaping
Header support
Library: iTextSharp
A4 / Letter
Portrait / Landscape
RTL support
Headers & footers
Page numbers
Watermark (opacity)
Print / Copy restrictions
Font fallback handling
Primary export entry point
Applies defaults
Processes data
Applies limits
Routes to exporter
Generates filename
Returns ExportResult
Limited rows
Prefixed filename
Ideal for testing & UAT
Validation-only execution
No file generation
Holds processed column metadata:
Key
Display name
Visibility
Order
Format
Width
Alignment
Wrap text
Default value
NuGet
ClosedXML (MIT)
DocumentFormat.OpenXml (MIT)
iTextSharp (AGPL)
Newtonsoft.Json (MIT)
OutSystems Runtime
RuntimePlatform
DatabaseAbstractionLayer
RuntimeCommon
REST / SOAP APIs
Any structure
No assumptions
Flattening support
Clean names
System attribute exclusion
Culture-aware
Timezone-safe
Per-column overrides
Arabic & English
RTL PDF
Custom fonts
Watermark
Restrictions
Audit trail
Expiry date
MaxRows
Chunking ready
Streaming ready
Large dataset safe
All configurations are optional
Defaults always applied
Designed for 1M+ rows
Fully extensible
Production-safe
Forge-ready documentation
📋 Universal Export Engine – Detailed Technical Documentation
🎯 Overview
Universal Export Engine is a .NET Extension Service designed for the OutSystems Platform.It enables exporting any data type to Excel (.xlsx), PDF, or CSV with extensive customization, security, and localization support.
Core Principle:Export once – use everywhere – handle everything
📦 Architecture & Components
Class Structure
Type: .NET Library (DLL)
🔢 Constants & Enum Values
Export Formats
EXPORT_FORMAT_EXCEL = 1 → Excel (.xlsx)
EXPORT_FORMAT_PDF = 2 → PDF (RTL, Watermark, Security)
EXPORT_FORMAT_CSV = 3 → CSV (UTF-8, Culture-aware)
Delivery Types
DELIVERY_TYPE_DOWNLOAD = 1
DELIVERY_TYPE_EMAIL = 2
DELIVERY_TYPE_STORAGE = 3
Page Configuration
Text Alignment
Column Data Types
🛠 Helper Methods – Data Conversion
ConvertRLStringListToList(...)
Purpose: Convert RLStringListRecordList to List
Process:
Iterate records
Return standard .NET list
Usage: Email recipients from OutputConfig.ssAttribute
Default Configuration Methods
Purpose: Apply defaults when configs are nullDefaults Source: Structures.cs
🔄 Data Processing Methods
ProcessData(...)
Input: Any OutSystems dataOutput: List>
Flow:
Parse JSON (JArray / JObject)
Null-safe handling
Handles: empty, null, nested, mixed types, arrays
ProcessJsonObject(...)
Recursive JSON processing
Flattens nested objects
Arrays → comma-separated values
Preserves key hierarchy
ConvertObjectToDictionary(...)
Recursive flattening (optional)
Skips unreadable properties
IsSimpleType(...)
Simple types:
Primitives, string, DateTime, decimal, Guid, Nullable
GetValue(...)
Extracts value from JValue
Returns raw object otherwise
📊 Column Processing Methods
CleanColumnName(...)
Removes OutSystems prefixes and formats names.
Examples:
ssENEmployee._ssName → Name
Customer.Address.Street → Street
_Status → Status
ShouldExcludeColumn(...)
Hardcoded exclusions:
ProcessColumns(...)
Modes:
Auto-Detect: Extract from data
Manual: Use provided config
Applies:
Exclusions
Sorting by order
DetectDataType(...)
Samples first 10 non-null values:
Default → Text
FormatValue(...)
Formats based on column data type:
Boolean → Custom text
Date → TimeZone + format
Number → Culture-aware
Currency → Culture-aware
Null → NullValueText
✅ Validation Methods
MssValidateExportDefinition(...)
Validates:
Security config
Performance config
Output config
Returns: RCValidationResultRecord
📄 Export Methods
ExportToExcel(...)
Library: ClosedXML
Headers, widths, alignment
Data formatting
Returns: byte[]
ExportToCSV(...)
Proper CSV escaping
ExportToPDF(...)
Page size & orientation
Headers / Footers
Watermark & security
RTL & font fallback
🚀 Main Public Functions
MssExportData(...)
Main entry point
Apply defaults
Process data
Limit rows
Process columns
Export by format
Generate filename
Populate result
MssPreviewExport(...)
Exports first N rows
Prefixes filename with Preview_
Used for testing & validation
Pre-execution validation only
🔧 Helper Class – ColumnInfo
Internal structure holding:
ColumnKey
DisplayName
DataType
WrapText
DefaultValue
📚 Dependencies & Libraries
NuGet:
OutSystems Runtime:
REST & SOAP APIs
✨ Key Features & Capabilities
Dynamic data handling
Smart column detection
Advanced formatting
Full localization & RTL
PDF security
Performance optimization
Large dataset support (1M+ rows)
Robust edge-case handling
📌 Important Notes
No assumptions about data shape
Full error & exception handling
Optimized for scale
Easily extensible