private Cell ConstructCell(ColumnContext columnContext, IPropertyContainer source)
        {
            var    propertyRenderer = columnContext.PropertyRenderer;
            string textValue        = propertyRenderer.Render(source);

            var cellMetadata = propertyRenderer.GetMetadata <ExcelCellMetadata>();

            CellValues dataType = ExcelMetadata.GetFirstDefinedValue(
                ExcelMetadata.DataType,
                cellMetadata,
                columnContext.ColumnMetadata,
                columnContext.SheetMetadata,
                columnContext.DocumentMetadata);

            Cell cell = ConstructCell(textValue, dataType);

            if (dataType == CellValues.Date)
            {
                cell.StyleIndex = _documentContext.GetCellFormatIndex("Date");

                var isLocalTime = propertyRenderer.PropertyType == typeof(LocalTime) || propertyRenderer.PropertyType == typeof(LocalTime?);
                if (isLocalTime)
                {
                    cell.StyleIndex = _documentContext.GetCellFormatIndex("Time");
                }
            }

            // External customization
            var customizeFunc = cellMetadata?.GetValue(ExcelCellMetadata.ConfigureCell);

            if (customizeFunc != null)
            {
                customizeFunc.Invoke(new CellContext(columnContext, cellMetadata, cell));
            }

            return(cell);
        }
 public CellContext(ColumnContext columnContext, IExcelMetadata cellMetadata, Cell cell)
 {
     ColumnContext = columnContext.AssertArgumentNotNull(nameof(columnContext));
     CellMetadata  = cellMetadata.AssertArgumentNotNull(nameof(cellMetadata));
     Cell          = cell;
 }