SUMIFS should sum and treat booleans and strings as zero

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1891900 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
PJ Fanning 2021-07-30 12:47:03 +00:00
parent 0d6bd263fe
commit c61d6bfbbc
3 changed files with 59 additions and 3 deletions

View File

@ -38,23 +38,32 @@ final class TestSum {
@Test
void testSum() throws IOException {
try (HSSFWorkbook wb = initWorkbook1()) {
try (HSSFWorkbook wb = initWorkbookWithNA()) {
HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);
HSSFCell cell = wb.getSheetAt(0).getRow(0).createCell(100);
confirmDouble(fe, cell, "SUM(B2:B5)", 70000);
}
}
@Test
void testSumWithBooleanAndString() throws IOException {
try (HSSFWorkbook wb = initWorkbookWithBooleanAndString()) {
HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);
HSSFCell cell = wb.getSheetAt(0).getRow(0).createCell(100);
confirmDouble(fe, cell, "SUM(B2:B7)", 70000);
}
}
@Test
void testSumWithNA() throws IOException {
try (HSSFWorkbook wb = initWorkbook1()) {
try (HSSFWorkbook wb = initWorkbookWithNA()) {
HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);
HSSFCell cell = wb.getSheetAt(0).getRow(0).createCell(100);
confirmError(fe, cell, "SUM(B2:B6)", FormulaError.NA);
}
}
private HSSFWorkbook initWorkbook1() {
private HSSFWorkbook initWorkbookWithNA() {
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();
addRow(sheet, 0, "Property Value", "Commission", "Data");
@ -66,6 +75,19 @@ final class TestSum {
return wb;
}
private HSSFWorkbook initWorkbookWithBooleanAndString() {
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();
addRow(sheet, 0, "Property Value", "Commission", "Data");
addRow(sheet, 1, 100000, 7000, 250000);
addRow(sheet, 2, 200000, 14000);
addRow(sheet, 3, 300000, 21000);
addRow(sheet, 4, 400000, 28000);
addRow(sheet, 5, 500000, true);
addRow(sheet, 6, 600000, "abc");
return wb;
}
private static void confirmDouble(HSSFFormulaEvaluator fe, HSSFCell cell, String formulaText, double expectedResult) {
cell.setCellFormula(formulaText);
fe.notifyUpdateCell(cell);

View File

@ -127,6 +127,15 @@ final class TestSumif {
}
}
@Test
void testMicrosoftExample1WithBooleanAndString() throws IOException {
try (HSSFWorkbook wb = initWorkbook1WithBooleanAndString()) {
HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);
HSSFCell cell = wb.getSheetAt(0).getRow(0).createCell(100);
confirmDouble(fe, cell, "SUMIF(A2:A7,\">160000\",B2:B7)", 63000);
}
}
@Test
void testMicrosoftExample2() throws IOException {
try (HSSFWorkbook wb = initWorkbook2()) {
@ -158,6 +167,14 @@ final class TestSumif {
return wb;
}
private HSSFWorkbook initWorkbook1WithBooleanAndString() {
HSSFWorkbook wb = initWorkbook1();
HSSFSheet sheet = wb.getSheetAt(0);
addRow(sheet, 5, 500000, true);
addRow(sheet, 6, 600000, "abc");
return wb;
}
private HSSFWorkbook initWorkbook2() {
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();

View File

@ -5,6 +5,11 @@ import org.apache.poi.ss.usermodel.FormulaError;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Calendar;
import java.util.Date;
public class Utils {
public static void addRow(Sheet sheet, int rownum, Object... values) {
Row row = sheet.createRow(rownum);
@ -12,6 +17,18 @@ public class Utils {
Cell cell = row.createCell(i);
if (values[i] instanceof Integer) {
cell.setCellValue((Integer) values[i]);
} else if (values[i] instanceof Double) {
cell.setCellValue((Double) values[i]);
} else if (values[i] instanceof Boolean) {
cell.setCellValue((Boolean) values[i]);
} else if (values[i] instanceof Calendar) {
cell.setCellValue((Calendar) values[i]);
} else if (values[i] instanceof Date) {
cell.setCellValue((Date) values[i]);
} else if (values[i] instanceof LocalDate) {
cell.setCellValue((LocalDate) values[i]);
} else if (values[i] instanceof LocalDateTime) {
cell.setCellValue((LocalDateTime) values[i]);
} else if (values[i] instanceof FormulaError) {
cell.setCellErrorValue(((FormulaError)values[i]).getCode());
} else if (values[i] == null) {