internal void WriteValue(object v, ColumnMeta columnMeta, JsonWriter writer)
        {
            if (columnMeta is null)
            {
                throw new ArgumentNullException(nameof(columnMeta));
            }

            writer.WritePropertyName("v");
            if (v is null)
            {
                writer.WriteNull();
                return;
            }

            object val = v;
            string?formattedVal;

            if (v is Cell cell)
            {
                val          = cell.Value;
                formattedVal = cell.Formatted;
            }


            if (columnMeta.WriterAction != null)
            {
                columnMeta.WriterAction(writer);
            }
            else
            {
                switch (columnMeta.ColumnType)
                {
                case ColumnType.Number:

                    var nullValType = Nullable.GetUnderlyingType(columnMeta.ValueType);
                    if (nullValType != null && val is null)
                    {
                        writer.WriteNull();
                    }
                    else
                    {
                        if (val is decimal dec)
                        {
                            writer.WriteValue(dec);
                        }
                        else if (val is double dou)
                        {
                            writer.WriteValue(dou);
                        }
                        else if (val is float flo)
                        {
                            writer.WriteValue(flo);
                        }
                        else if (val is int i)
                        {
                            writer.WriteValue(i);
                        }
                        else if (val is long l)
                        {
                            writer.WriteValue(l);
                        }
                        else
                        {
                            throw new NotSupportedException("Unsupported type " + v.GetType().FullName);
                        }
                    }

                    break;

                case ColumnType.String:
                    writer.WriteValue(val.ToString());
                    break;

                case ColumnType.Boolean:
                    writer.WriteValue((bool)val);
                    break;

                case ColumnType.Date:
                    var d = (DateTime)val;
                    writer.WriteValue(string.Format("Date({0}, {1}, {2})", d.Year, d.Month - 1, d.Day));
                    break;

                case ColumnType.Datetime:
                    var dt = (DateTime)val;
                    writer.WriteValue(string.Format("Date({0}, {1}, {2}, {3}, {4}, {5})", dt.Year, dt.Month - 1, dt.Day,
                                                    dt.Hour, dt.Minute, dt.Second));
                    break;

                case ColumnType.Timeofday:
                    var tod = val is DateTime time ? time.TimeOfDay : (TimeSpan)val;

                    writer.WriteStartArray();
                    writer.WriteValue(tod.Hours);
                    writer.WriteValue(tod.Minutes);
                    writer.WriteValue(tod.Seconds);
                    writer.WriteEndArray();


                    //writer.WriteRaw( string.Format("[{0}, {1}, {2}]", tod.Hours, tod.Minutes, tod.Seconds));
                    break;

                default:
                    throw new Exception($"Columntype '{columnMeta.ColumnType}' not supported");
                }
            }
        }