/// <summary>
        /// Initializes a new instance of the <see cref="CellContext"/> struct.
        /// </summary>
        /// <param name="columnContext">ColumnContext for this cell.</param>
        /// <param name="cellMetadata">Cell metadata.</param>
        /// <param name="cell">OpenXml cell.</param>
        public CellContext(ColumnContext columnContext, IExcelMetadata?cellMetadata, Cell cell)
        {
            columnContext.AssertArgumentNotNull(nameof(columnContext));

            ColumnContext = columnContext;
            CellMetadata  = cellMetadata;
            Cell          = cell;
        }
        private Cell ConstructHeaderCell(ColumnContext columnContext)
        {
            Cell headerCell = CreateCell(columnContext.PropertyRenderer.TargetName, CellValues.String);

            var propertyRenderer = columnContext.PropertyRenderer;
            ExcelColumnMetadata?excelColumnMetadata = propertyRenderer.GetMetadata <ExcelColumnMetadata>();

            // External customization
            var customizeFunc = excelColumnMetadata?.GetValue(ExcelColumnMetadata.ConfigureHeaderCell);

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

            return(headerCell);
        }
        private CellContext ConstructCell(ColumnContext columnContext, IPropertyContainer source, bool callCustomize = true)
        {
            var propertyRenderer = columnContext.PropertyRenderer;

            // Render value
            string?textValue = propertyRenderer.Render(source);

            textValue = textValue != null?_settings.StringProvider.GetString(textValue) : null;

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

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

            Cell cell = CreateCell(textValue, dataType);

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

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

            CellContext cellContext = new CellContext(columnContext, cellMetadata, cell);

            // External customization
            if (callCustomize)
            {
                var customizeFunc = cellMetadata?.GetValue(ExcelCellMetadata.ConfigureCell);
                customizeFunc?.Invoke(cellContext);
            }

            // TODO: omit empty cells? or omit style if cell is empty
            // Example of empty cell: <x:c r="N10052" s="2" />

            return(cellContext);
        }