[]
        
(Showing Draft Content)

计算模式

有时,在打开具有许多公式的大型工作簿可能需要很长时间,因为 Excel 在打开工作簿之前会重新计算所有公式,这导致处理时间较长。此外,当导出包含公式或跨工作表公式的特定工作表时,Excel 需要大量时间,因为它在完成导出过程之前会计算所有公式。为了提高打开或导出具有大量公式的大型 Excel 工作簿的速度,GcExcel 在 IFormulaOptions 接口中提供了 setCalculationMode 方法。此方法允许您从 CalculationMode 枚举选项中进行选择,从而控制 Excel 在打开或导出工作簿之前如何计算公式。

CalculationMode 枚举提供以下三种计算模式:

计算模式

描述

Automatic 自动

在此模式下,Excel 会计算所有内容,并在每次打开工作簿时更改时重新计算。

Semiautomatic 半自动

在此模式下,Excel 会计算除模拟运算表之外的所有内容。

Manual 手动

在此模式下,Excel 不计算任何内容;只有在用户通过按 F9 或 CTRL+ALT+F9 请求或保存工作簿时,它才会重新计算。

setCalculationMode 方法不会影响 GcExcel 的内部计算引擎的功能,它只会影响 Excel 和 SpreadJS I/O 中的计算模式设置。此方法不会影响 GcExcel 的运行时状态。如果要禁用当前工作簿的计算,请使用 Workbook 类和 IWorkbook 接口的 setEnableCalculation 方法。

请参考以下示例代码,将 setCalculationMode 设置为 “Manual” 以计算 “总计” 值:

// 创建新工作簿
Workbook workbook = new Workbook();
        
// 添加表格数据
Object data = new Object[][]{
        {"Name", "City", "Birthday", "Eye color", "Weight", "Height"},
        {"Richard", "New York", new GregorianCalendar(1968, 5, 8), "Blue", 67, 165},
        {"Nia", "New York", new GregorianCalendar(1972, 6, 3), "Brown", 62, 134},
        {"Jared", "New York", new GregorianCalendar(1964, 2, 2), "Hazel", 72, 180},
        {"Natalie", "Washington", new GregorianCalendar(1972, 7, 8), "Blue", 66, 163},
        {"Damon", "Washington", new GregorianCalendar(1986, 1, 2), "Hazel", 76, 176},
        {"Angela", "Washington", new GregorianCalendar(1993, 1, 15), "Brown", 68, 145}
};

// 将数据添加到范围中
IWorksheet worksheet = workbook.getWorksheets().get(0);
worksheet.getRange("A1:F7").setValue(data);
worksheet.getRange("A:F").setColumnWidth(15);

// 添加表格
worksheet.getTables().add(worksheet.getRange("A1:F7"), true);

// 显示总计
worksheet.getTables().get(0).setShowTotals(true);
worksheet.getTables().get(0).getColumns().get(4).setTotalsCalculation(TotalsCalculation.Average);
worksheet.getTables().get(0).getColumns().get(5).setTotalsCalculation(TotalsCalculation.Average);

// 添加注释以通知用户手动计算公式
IComment comment = worksheet.getRange("F8").addComment("Please press F9 to calculate the formula.");
comment.setVisible(true);

// 将计算模式设置为手动
workbook.getOptions().getFormulas().setCalculationMode(CalculationMode.Manual);
    
// 保存Excel文件
workbook.save("CalculationModeOptions.xlsx");

image

type=warning

注意:SpreadJS 不支持“Semiautomatic”计算。在导出 SSJSON 和 SJS 文件时,它将被视为 “Automatic” 计算。