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
- Use midCat (or midpoint) for mid-category crossing, or between for between-category crossing.
- Trim and ToLowerInvariant the value.
- 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
- Use midCat for line-style mid-category crossing, between for bar/column boundary crossing.
- Whitelist crossBetween to its two enum values (plus midpoint alias).
- Do not send 'auto' — it is not a valid ST_CrossBetween.
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
- axisMin={value} is invalid on a log-scaled axis: a logarithm
- Invalid majorUnit '{value}': must be a positive number (OOXM
- Invalid minorUnit '{value}': must be a positive number (OOXM
- Invalid 'tickLabelPos' value: '{value}'. Valid: none, high,
- Invalid 'axisPos' value: '{value}'. Valid: top, bottom, left
AI-assisted analysis of iOfficeAI/OfficeCLI@1ced45e900 (2026-08-13).
Data as JSON: /api/errors/26e5970c8fc9fb06.
Report an issue: GitHub.