iOfficeAI/OfficeCLI · error · ArgumentException

Invalid 'crossBetween' value: '{value}'. Valid: midCat, betw

Error message

Invalid 'crossBetween' value: '{value}'. Valid: midCat, between.

What it means

Thrown when 'crossBetween' is not midCat/midpoint or between (OOXML ST_CrossBetween). Validated BEFORE mutating to avoid dropping a prior value, then inserted in CT_ValAx schema order (after crossesAt/crosses/crossAx). midCat = data points cross midway between categories; between = data crosses between category boundaries.

Source

Thrown at src/officecli/Core/Chart/ChartHelper.Setter.cs:1972

                    // overriding form; leaving the default crosses element in
                    // place makes dump→replay surface a spurious crosses=autoZero
                    // prop (R57 tester-1).
                    if (!properties.ContainsKey("crosses"))
                        valAx.RemoveAllChildren<C.Crosses>();
                    break;
                }

                case "crossbetween":
                {
                    var plotArea2 = chart.GetFirstChild<C.PlotArea>();
                    var valAx = plotArea2?.GetFirstChild<C.ValueAxis>();
                    if (valAx == null) { unsupported.Add(key); break; }
                    // Validate BEFORE mutating.
                    var cbVal = value.ToLowerInvariant() switch
                    {
                        "midcat" or "midpoint" => C.CrossBetweenValues.MidpointCategory,
                        "between" => C.CrossBetweenValues.Between,
                        _ => throw new ArgumentException($"Invalid 'crossBetween' value: '{value}'. Valid: midCat, between.")
                    };
                    valAx.RemoveAllChildren<C.CrossBetween>();
                    // CT_ValAx schema: crossAx, crosses?, crossesAt?, crossBetween?,
                    // majorUnit?, minorUnit?, dispUnits?, extLst?. AppendChild lands
                    // it after majorUnit / minorUnit which the validator rejects.
                    var cb = new C.CrossBetween { Val = cbVal };
                    var cbAnchor = valAx.GetFirstChild<C.CrossesAt>() as OpenXmlElement
                        ?? valAx.GetFirstChild<C.Crosses>() as OpenXmlElement
                        ?? valAx.GetFirstChild<C.CrossingAxis>() as OpenXmlElement;
                    if (cbAnchor != null) cbAnchor.InsertAfterSelf(cb);
                    else valAx.AppendChild(cb);
                    break;
                }

                case "axisorientation" or "axisreverse":
                {
                    var plotArea2 = chart.GetFirstChild<C.PlotArea>();
                    var valAx = plotArea2?.GetFirstChild<C.ValueAxis>();

View on GitHub (pinned to 1ced45e900)

Solutions

  1. Use midCat (or midpoint) for mid-category crossing, or between for between-category crossing.
  2. Trim and ToLowerInvariant the value.
  3. Whitelist against the two enum values before calling Set.

Example fix

// before
SetChartProperties(part, new() { ["crossBetween"] = "auto" });
// after
SetChartProperties(part, new() { ["crossBetween"] = "midCat" });
Defensive patterns

Strategy: validation

Validate before calling

static readonly HashSet<string> CrossBetween =
    new[]{"midcat","midpoint","between"}, StringComparer.OrdinalIgnoreCase);

static bool IsValidCrossBetween(string v) =>
    !string.IsNullOrWhiteSpace(v) && CrossBetween.Contains(v.Trim().ToLowerInvariant());

Type guard

static bool IsKnownCrossBetween(string v) =>
    (v?.Trim().ToLowerInvariant()) is "midcat" or "midpoint" or "between";

Try / catch

try { SetChartProperties(part, props); }
catch (ArgumentException ex) when (ex.Message.StartsWith("Invalid 'crossBetween'"))
{ /* default to between for bar/column or midCat for line and retry */ }

Prevention

When it happens

Trigger: SetChartProperties with { ["crossBetween"] = "auto" }, "inside", or a misspelled token on the value axis.

Common situations: Confusing crossBetween with labelPos/crosses vocabulary; defaulting to 'auto' which is not a valid enum here.

Related errors


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