Browse Source

[bug-65939] add partial fix for clearing formula with circular ref

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1898677 13f79535-47bb-0310-9956-ffa450edef68
tags/REL_5_2_2
PJ Fanning 2 years ago
parent
commit
3317b6393f

+ 28
- 0
poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestFormulaEval.java View File

@@ -0,0 +1,28 @@
package org.apache.poi.xssf.usermodel;

import org.apache.poi.ss.usermodel.CellType;
import org.junit.jupiter.api.Test;

import java.io.IOException;

import static org.junit.jupiter.api.Assertions.assertEquals;

class TestFormulaEval {
@Test
void testCircularRef() throws IOException {
try (XSSFWorkbook wb = new XSSFWorkbook()) {
XSSFSheet sheet = wb.createSheet();
XSSFRow row = sheet.createRow(0);
XSSFCell cell = row.createCell(0);
cell.setCellFormula("A1");
XSSFFormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator();
// the following assert should probably be NUMERIC not ERROR (from testing in Excel itself)
assertEquals(CellType.ERROR, formulaEvaluator.evaluateFormulaCell(cell));

cell.setCellFormula(null);
formulaEvaluator.notifyUpdateCell(cell);
//the following assert should probably be BLANK not ERROR
assertEquals(CellType.ERROR, cell.getCellType());
}
}
}

+ 3
- 1
poi/src/main/java/org/apache/poi/ss/formula/CellCacheEntry.java View File

@@ -114,7 +114,9 @@ abstract class CellCacheEntry implements ICacheEntry {
for (int i = 0; i < formulaCells.length; i++) {
FormulaCellCacheEntry fc = formulaCells[i];
fc.clearFormulaEntry();
fc.recurseClearCachedFormulaResults();
if (fc != this) {
fc.recurseClearCachedFormulaResults();
}
}
}


+ 53
- 0
poi/src/test/java/org/apache/poi/ss/formula/TestFormulaEval.java View File

@@ -0,0 +1,53 @@
/*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/

package org.apache.poi.ss.formula;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellType;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;

import java.io.IOException;

import static org.junit.jupiter.api.Assertions.assertEquals;

class TestFormulaEval {

@Disabled("https://bz.apache.org/bugzilla/show_bug.cgi?id=65939")
@Test
void testCircularRef() throws IOException {
try (HSSFWorkbook wb = new HSSFWorkbook()) {
HSSFSheet sheet = wb.createSheet();
HSSFRow row = sheet.createRow(0);
HSSFCell cell = row.createCell(0);
cell.setCellFormula("A1");
HSSFFormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator();
// the following assert should probably be NUMERIC not ERROR (from testing in Excel itself)
assertEquals(CellType.ERROR, formulaEvaluator.evaluateFormulaCell(cell));

cell.setCellFormula(null); //this line fails
formulaEvaluator.notifyUpdateCell(cell);
}
}
}

Loading…
Cancel
Save