Java 创建条件格式规则时,org.apache.xmlbeans.impl.values.XmlValueDisconnectedException

Java 创建条件格式规则时,org.apache.xmlbeans.impl.values.XmlValueDisconnectedException,java,excel,apache-poi,Java,Excel,Apache Poi,我正在尝试创建一个带有3级着色的XSSFConditionFormattingRule。因此,我也需要设置阈值。但在调试时,我发现每个XSSFConditionFormattingReshold都会抛出一个com.sun.jdi.InvocationException调用方法时发生。在其CTCfvo属性上,但仅在调用rule.getColorScaleFormatting.setNumControlPoints3之后 我的完整代码如下: CellRangeAddress[] regions =

我正在尝试创建一个带有3级着色的XSSFConditionFormattingRule。因此,我也需要设置阈值。但在调试时,我发现每个XSSFConditionFormattingReshold都会抛出一个com.sun.jdi.InvocationException调用方法时发生。在其CTCfvo属性上,但仅在调用rule.getColorScaleFormatting.setNumControlPoints3之后

我的完整代码如下:

CellRangeAddress[] regions = { CellRangeAddress.valueOf("Z2:Z" + (sheet.getLastRowNum() + 1)) };

XSSFConditionalFormattingRule rule = sheet.getSheetConditionalFormatting()
        .createConditionalFormattingColorScaleRule();

XSSFConditionalFormattingThreshold thresh5 = rule.getColorScaleFormatting().createThreshold();
thresh5.setRangeType(RangeType.NUMBER);
thresh5.setValue(0.05);
XSSFConditionalFormattingThreshold thresh10 = rule.getColorScaleFormatting().createThreshold();
thresh10.setRangeType(RangeType.NUMBER);
thresh10.setValue(0.10);
XSSFConditionalFormattingThreshold thresh15 = rule.getColorScaleFormatting().createThreshold();
thresh15.setRangeType(RangeType.NUMBER);
thresh15.setValue(0.15);

rule.getColorScaleFormatting().setNumControlPoints(3);
rule.getColorScaleFormatting()
        .setThresholds(new ConditionalFormattingThreshold[] { thresh5, thresh10, thresh15 });
XSSFColor colorGreen = new XSSFColor(IndexedColors.GREEN, colorMap);
XSSFColor colorYellow = new XSSFColor(IndexedColors.YELLOW, colorMap);
XSSFColor colorRed = new XSSFColor(IndexedColors.RED, colorMap);

rule.getColorScaleFormatting().setColors(new Color[] { colorGreen, colorYellow, colorRed });

sheet.getSheetConditionalFormatting().addConditionalFormatting(regions, rule);
这是我在执行上述代码时得到的缩短堆栈跟踪:

org.apache.xmlbeans.impl.values.XmlValueDisconnectedException位于 org.apache.xmlbeans.impl.values.XmlObjectBase.check_orphanedXmlObjectBase.java:1258 在 org.apache.xmlbeans.impl.values.XmlObjectBase.newCursorXmlObjectBase.java:286 在 org.apache.xmlbeans.impl.values.XmlComplexContentImpl.arraySetterHelperXmlComplexContentImpl.java:1124 在 org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTColorScaleImpl.setCfvoArrayUnknown 来源于 org.apache.poi.xssf.usermodel.xssfcolorscaleformating.setthresholdsxssfcolorscaleformating.java:85

我在这里看到的错误是什么原因造成的?我创建XSSFConditionFormattingReshold时出错了吗?还是完全别的什么


我使用的是apache poi v4.0.0。

如问题中所述,出现此错误的唯一原因是编写了两次工作簿。这让我想知道我做错了什么。我真的不知道从哪里开始,因为与错误相关的一切都与我的问题无关

我首先查看了void org.apache.poi.xssf.usermodel.xssfcolorscaleformating.setNumControlPointsint num的文档,其中说明了以下内容:

设置用于映射颜色的控制点数量。应该 通常是2或3

更新后,需要确保阈值计数和颜色 计数匹配

第二部分引起了我的注意。我的想法大致如下:

我使用getColorScaleFormatting.CreateStorhold直接在ColorScaleFormatting上创建阈值。那么,如果setNumControlPoints实际上重置了以前创建的所有阈值,该怎么办

这就是我移动rule.getColorScaleFormatting.setNumControlPoints3的地方;在创建所有XSSFConditionFormattingReshold之前,我的代码工作得很好

查看setNumControlPoints方法,我们可以看到:

public void setNumControlPoints(int num) {
    while (num < _scale.sizeOfCfvoArray()) {
        _scale.removeCfvo(_scale.sizeOfCfvoArray()-1);
        _scale.removeColor(_scale.sizeOfColorArray()-1);
    }
    while (num > _scale.sizeOfCfvoArray()) {
        _scale.addNewCfvo();
        _scale.addNewColor();
    }
}
这清楚地表明,调用此方法时可能会删除一些内容,尽管我无法完全了解_scale.sizeofcfoarray的初始大小,我假设为0。正因为如此,我无法完全理解如何删除内容,因为我创建了3个阈值,即scale.sizeofcfoarray应该是3,然后我调用setNumControlPoints3,因此我们将使用num==\u scale.sizeofcfoarray,我找不到任何东西,因为在这种情况下发生的事情看起来像是完全删除了所有内容

总之,在创建规则之后和创建任何阈值之前,都应该首先调用setNumControlPointsint num

如果有人能指出为什么num==\u scale.sizeofcfoarray会重置所有内容,请随意评论或编辑