[]
GcExcel Java 允许您直接在代码中计算 Excel 公式,无需将公式写入工作表单元格。您可以使用 IWorksheet 接口的 Evaluate2() 方法来传递任何受 MS Excel 支持的公式。Evaluate2() 方法会计算该公式并返回一个 Object 对象。
对于标准公式:该方法返回单个值。
对于范围(引用)公式:该方法返回一个 IRange 对象。
对于动态数组公式:该方法返回一个二维 Object 数组。
Evaluate() 方法也可用于计算公式,但它仅兼容 MS Excel 2019 及更早版本,且不支持动态数组。为获得更广泛的兼容性,建议使用 Evaluate2()。
参考以下代码计算 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");输出结果如下图所示:

参考以下代码,使用 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");输出结果如下图所示:

参考以下代码,批量计算 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");输出结果如下图所示:
