iOfficeAI/OfficeCLI · error · CliException

invalid_value

invalid_value

Error message

Invalid trendline type '{parts[0]}'. Valid: linear, exp, log, poly, power, movingAvg. For per-series different trendlines use seriesN.trendline keys, not pipe-separated lists.

What it means

Thrown by BuildTrendline (ChartHelper.SetterHelpers.cs:81) as a CliException with Code='invalid_value' when the first colon-separated slot of a trendline spec does not match linear, exp/exponential, log/logarithmic, poly/polynomial, power, or movingavg/moving/movingaverage. The message also directs users who want per-series different trendlines to use seriesN.trendline keys instead of pipe-separated lists. Unlike most chart parsers this one throws a CliException (structured code) rather than a plain ArgumentException.

Source

Thrown at src/officecli/Core/Chart/ChartHelper.SetterHelpers.cs:81

    internal static C.Trendline BuildTrendline(string spec)
    {
        // Format: "type" or "type:order" or "type:forward:backward"
        // e.g. "linear", "poly:3", "exp:2:1", "movingAvg:3"
        var parts = spec.Split(':');
        var typeStr = parts[0].Trim().ToLowerInvariant();

        var trendline = new C.Trendline();

        var trendType = typeStr switch
        {
            "linear" => C.TrendlineValues.Linear,
            "exp" or "exponential" => C.TrendlineValues.Exponential,
            "log" or "logarithmic" => C.TrendlineValues.Logarithmic,
            "poly" or "polynomial" => C.TrendlineValues.Polynomial,
            "power" => C.TrendlineValues.Power,
            "movingavg" or "moving" or "movingaverage" => C.TrendlineValues.MovingAverage,
            _ => throw new CliException(
                $"Invalid trendline type '{parts[0]}'. " +
                "Valid: linear, exp, log, poly, power, movingAvg. " +
                "For per-series different trendlines use seriesN.trendline keys, " +
                "not pipe-separated lists.")
                { Code = "invalid_value" }
        };
        trendline.AppendChild(new C.TrendlineType { Val = trendType });

        // Polynomial order or moving average period
        if (parts.Length > 1 && int.TryParse(parts[1], out var order))
        {
            if (trendType == C.TrendlineValues.Polynomial)
                trendline.AppendChild(new C.PolynomialOrder { Val = (byte)Math.Clamp(order, 2, 6) });
            else if (trendType == C.TrendlineValues.MovingAverage)
            {
                // OOXML ST_Skip MinInclusive=2 (c:period inside c:trendline).
                // Pre-fix code silently accepted order=0/1 which Word 422s on.
                if (order < 2)

View on GitHub (pinned to 1ced45e900)

Solutions

  1. Use a supported type: linear, exp, log, poly, power, movingAvg (aliases: exponential, logarithmic, polynomial, moving, movingAverage).
  2. For per-series different trendlines, set seriesN.trendline=<spec> per series rather than a pipe-separated list.
  3. For multiple trendlines on one series, join specs with semicolons (e.g. series1.trendline=linear;poly:3), not pipes.

Example fix

// before
series1.trendline=avg:3
// after
series1.trendline=movingAvg:3
Defensive patterns

Strategy: validation

Validate before calling

static readonly HashSet<string> TrendlineTypes = new(StringComparer.OrdinalIgnoreCase)
{ "linear","exp","exponential","log","logarithmic","poly","polynomial","power","movingavg","moving","movingaverage" };
static string ValidateTrendlineSpec(string spec)
{
    var typeStr = spec.Split(':')[0].Trim().ToLowerInvariant();
    return TrendlineTypes.Contains(typeStr) ? typeStr : throw new ArgumentException($"invalid trendline type '{spec}'");
}

Type guard

static bool IsValidTrendlineType(string spec) =>
    TrendlineTypes.Contains((spec.Split(':')[0]).Trim().ToLowerInvariant());

Try / catch

try { /* set series1.trendline=... */ }
catch (CliException ex) when (ex.Code == "invalid_value" && ex.Message.Contains("Invalid trendline type"))
{ /* list supported types, suggest per-series keys */ }

Prevention

When it happens

Trigger: Setting trendline=<spec> where spec's type slot is unrecognized, e.g. 'spline', 'avg', 'std', 'exponential2' (no separator), 'polyomial' (typo). Also when trying to apply multiple different trendlines via a pipe list to a single seriesN.trendline key.

Common situations: Abbreviating 'movingAvg' as 'avg' or 'ma'; typoing 'polynomial'/'logarithmic'; attempting 'spline' which OOXML does not support; passing a pipe list like 'linear|poly:3' to one key instead of separate seriesN.trendline keys.

Related errors


AI-assisted analysis of iOfficeAI/OfficeCLI@1ced45e900 (2026-08-13). Data as JSON: /api/errors/4b6eb57202f9147b. Report an issue: GitHub.