[]
        
立即试用
(Showing Draft Content)

公式计算

GcExcel Java 允许您直接在代码中计算 Excel 公式,无需将公式写入工作表单元格。您可以使用 IWorksheet 接口的 Evaluate2() 方法来传递任何受 MS Excel 支持的公式。Evaluate2() 方法会计算该公式并返回一个 Object 对象。

  • 对于标准公式:该方法返回单个值。

  • 对于范围(引用)公式:该方法返回一个 IRange 对象。

  • 对于动态数组公式:该方法返回一个二维 Object 数组。

Evaluate() 方法也可用于计算公式,但它仅兼容 MS Excel 2019 及更早版本,且不支持动态数组。为获得更广泛的兼容性,建议使用 Evaluate2()

示例 1:标准公式

参考以下代码计算 A2、A3 和 A4 单元格中值的总和,并将结果写入 B6 单元格。

// 创建一个新工作簿。
Workbook workbook = new Workbook();
IWorksheet sheet = workbook.getWorksheets().get(0);

// 设置数据。
sheet.getRange("A1").setValue("类型");
sheet.getRange("B1").setValue("数量");
sheet.getRange("A2").setValue("足球");
sheet.getRange("A3").setValue("篮球");
sheet.getRange("A4").setValue("橄榄球");
sheet.getRange("B2").setValue(80);
sheet.getRange("B3").setValue(90);
sheet.getRange("B4").setValue(100);

// 设置标题样式。
IRange header = sheet.getRange("A1:B1");
header.getFont().setBold(true);
header.setHorizontalAlignment(HorizontalAlignment.Center);

// 计算球的总数并将结果写入 B6。
sheet.getRange("A6").setValue("总计");
Object sum = sheet.evaluate2("=SUM(B2:B4)");
sheet.getRange("B6").setValue(sum);

sheet.getColumns().get(0).autoFit();
sheet.getColumns().get(1).autoFit();

// 保存 Excel 文件。
workbook.save("Evaluate2forSingleValue.xlsx");

输出结果如下图所示:

image

示例 2:范围公式

参考以下代码,使用 Evaluate2() 方法将 B3:C11 范围的内容复制到 E3:F11。在这种情况下,返回的结果是一个 IRange 对象。

// 创建一个新工作簿。
Workbook workbook = new Workbook();
IWorksheet sheet = workbook.getWorksheets().get(0);

// 设置数据。
Object[][] data = {
        { "产品","数量" },
        { "苹果",5},
        { "葡萄",6},
        { "梨",10},
        { "香蕉",50},
        { "椰子",20},
        { "草莓",15},
        { "橙子",30},
        { "菠萝",30}
};
sheet.getRange("B3:C11").setValue(data);

ITable table = sheet.getTables().add(sheet.getRange("B3:C11"), true);

// 使用以范围公式作为输入的 Evaluate2() 方法,返回一个 IRange 对象。
Object rangeres = sheet.evaluate2("=(B3:C11)");
if (rangeres instanceof IRange) {
    sheet.getRange("E3:F11").setValue(((IRange)rangeres).getValue());
}

// 保存 Excel 文件。
workbook.save("Evaluate2forIRange.xlsx");

输出结果如下图所示:

image

示例 3:动态数组公式

参考以下代码,批量计算 B4:B11 范围中每个文本的字符长度,并将结果输出到 D4:D11 范围。

// 创建一个新工作簿。
Workbook workbook = new Workbook();
IWorksheet sheet = workbook.getWorksheets().get(0);
// 设置数据。
Object[][] data = new Object[][] {
        { "产品" },
        { "苹果" },
        { "葡萄" },
        { "梨" },
        { "香蕉" },
        { "椰子" },
        { "草莓" },
        { "橙子" },
        { "菠萝" }
};
sheet.getRange("B3:B11").setValue(data);

ITable table = sheet.getTables().add(sheet.getRange("B3:B11"), true);
ITable table1 = sheet.getTables().add(sheet.getRange("D3:D11"), true);
table.convertToRange();
table1.convertToRange();
sheet.getRange("D3").setValue("Evaluate2 结果:");
sheet.getRange("B:D").autoFit();

// 使用 Evaluate2() 方法计算 B4:B11 中每个单元格的文本长度,并将结果数组输出到 D4:D11。
Object evaluateRes = sheet.evaluate2("=LEN(B4:B11)");
sheet.getRange("D4:D11").setValue(evaluateRes);  
  
// 保存到 Excel 文件。
workbook.save("Evaluate2forDynamicArray.xlsx");

输出结果如下图所示:

image