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
- Use a supported type: linear, exp, log, poly, power, movingAvg (aliases: exponential, logarithmic, polynomial, moving, movingAverage).
- For per-series different trendlines, set seriesN.trendline=<spec> per series rather than a pipe-separated list.
- 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
- Use seriesN.trendline per series for different trendlines; join multiple on one series with ';'.
- Do not use pipe-separated lists for trendlines.
- Validate the type slot before adding order/period suffixes.
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
- {fullKey}: expected boolean (true/false/1/0/yes/no/on/off),
- movingAvg period must be >= 2 (OOXML ST_Skip MinInclusive=2)
- trendline.period must be >= 2 (OOXML ST_Skip MinInclusive=2)
- invalid_value
- invalid_value
AI-assisted analysis of iOfficeAI/OfficeCLI@1ced45e900 (2026-08-13).
Data as JSON: /api/errors/4b6eb57202f9147b.
Report an issue: GitHub.