Как указано в вопросе, единственные случаи этой ошибки были связаны с написанием книги дважды ( SO вопрос , bugzilla ). Так что мне стало интересно, что я делаю не так. Я понятия не имел, с чего начать, поскольку все, что связано с ошибкой, не имеет ничего общего с моей проблемой.
Мой первый взгляд был сделан на документацию void org.apache.poi.xssf.usermodel.XSSFColorScaleFormatting.setNumControlPoints(int num)
, в которой говорится следующее:
Устанавливает количество контрольных точек, используемых для сопоставления цветов. Должен
обычно 2 или 3.
После обновления необходимо убедиться, что пороговое значение и цвет
количество совпадений
Вторая часть привлекла мое внимание. Я думал что-то вроде:
Я создаю пороги прямо на ColorScaleFormatting
с getColorScaleFormatting().createThreshold()
. Так что, если setNumControlPoints()
фактически сбрасывает все пороги, которые были ранее созданы?
И в этот момент я просто переместился на rule.getColorScaleFormatting().setNumControlPoints(3);
до создания всего XSSFConditionalFormattingThreshold
, и мой код работал нормально.
Взглянув на метод 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.sizeOfCfvoArray()
(я бы предположил 0). И из-за этого я не мог понять, как происходит удаление материала, потому что я создал 3 порога (_scale.sizeOfCfvoArray()
должно быть 3), а затем я позвонил setNumControlPoints(3)
, чтобы у нас было num == _scale.sizeOfCfvoArray()
, и я ничего не смог найти за то, что происходит в этом случае (похоже, полное удаление всего).
В заключение, setNumControlPoints(int num)
всегда следует вызывать как первое после создания правила и перед созданием любых порогов.
Если кто-то может указать, почему все сбрасывается, если num == _scale.sizeOfCfvoArray()
, не стесняйтесь комментировать или редактировать.