[]
SpreadJS는 수식에서 참조된 값(셀, 값 또는 수식에서 참조된 이름)이 변경되면 수식을 자동으로 업데이트합니다. 그러나 참조된 셀에 변경이 있을 때마다 수식이 즉시 다시 계산되지 않도록 제어하려면 자동 계산을 수동으로 전환할 수 있습니다. SpreadJS API의 CalculationMode 열거형을 사용하면 계산 옵션을 auto 또는 manual로 설정할 수 있습니다.
CalculationMode가 auto(기본 모드)로 설정되면, 참조된 셀이 변경될 때마다 SpreadJS는 모든 더티 셀을 자동으로 계산합니다. 예를 들어 복사-붙여넣기 또는 셀 입력 시 계산이 이루어집니다. SpreadJS는 셀이 변경되어 결과적으로 다시 계산이 필요할 때 해당 셀을 더티 상태로 간주합니다.
반면 CalculationMode가 manual로 설정되면, 사용자가 명시적으로 요청할 때만 SpreadJS가 수식을 계산하고 업데이트합니다. 이는 복잡한 수식이 많은 대형 워크시트에서 빈번한 재계산을 피하여 성능과 반응성을 향상시키는 데 유용합니다. 예를 들어, SpreadJS는 값 잘라내기 또는 복사-붙여넣기 시 수식과 셀 값을 재설정하지만 수식을 다시 계산하지는 않습니다.
참고: SpreadJS는 Excel로 내보낼 때 CalculationMode 옵션을 지원합니다.
다음 코드 샘플은 워크북을 초기화할 때 수동 계산 옵션을 설정하는 방법을 보여줍니다.
// 워크북 초기화 시 수동 모드로 전환합니다.
var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), {calculationMode: GC.Spread.Sheets.CalculationMode.manual});
Or
spread.options.calculationMode = GC.Spread.Sheets.CalculationMode.manual;
수동 계산 모드로 전환한 후에는, calculate() 메서드를 사용하여 워크시트의 수식을 수동으로 업데이트해야 합니다. 이 메서드는 CalculationType 열거형 값을 매개변수로 받습니다.
CalculationType 열거형은 계산 유형을 지정합니다. 이 열거형의 사용 가능한 멤버는 아래에 설명되어 있습니다.
멤버 | 설명 |
---|---|
all | 범위 내의 모든 셀을 계산을 위해 더티 상태로 표시합니다. 기본 계산 유형입니다. |
rebuild | 범위 내의 모든 수식을 다시 구성한 후 계산을 위해 더티 상태로 표시합니다. |
minimal | 수식을 더티 상태로 표시하지만 변동 셀과 순환 참조 셀은 계산하지 않습니다. |
regular | 변동 셀 및 순환 참조 셀을 계산을 위해 더티 상태로 표시합니다. |
다음 표를 통해 다양한 수식 및 그 의존성을 기준으로 자동 및 수동 계산 모드에서 SpreadJS의 동작을 확인할 수 있습니다.
사용한 수식 조합 | 자동 (기본 모드) | 수동 |
---|---|---|
suspendCalcService(true) | 계산 엔진을 비활성화하고 어떤 셀도 다시 계산하지 않습니다. | |
resumeCalcService(false) | 계산 엔진을 활성화하고 변동 셀, 순환 참조 셀, 더티 셀을 계산합니다. | 계산 엔진만 활성화하고 더티 셀은 계산하지 않음 |
resumeCalcService(true) | 계산 엔진을 활성화하고 모든 셀을 계산합니다. | 계산 엔진을 활성화하고 모든 셀을 더티 상태로 만들지만 계산하지 않음 |
resumeCalcService(false) 및 sheet.setFormula | 수식과 해당 의존성을 계산합니다. | 수식만 계산됨 |
resumeCalcService(false) 및 spread.calculate() | 모든 열린 워크시트의 모든 수식을 계산합니다. | |
resumeCalcService(false) 및 spread.calculate(GC.Spread.Sheets.CalculationType.regular) | 변동 데이터 및 더티로 표시된 셀을 포함하여 모든 더티 셀을 계산합니다. | |
resumeCalcService(false) 및 spread.calculate(GC.Spread.Sheets.CalculationType.rebuild) | 모든 수식을 재구성하고 계산합니다. | |
resumeCalcService(false) 및 spread.calculate(null, "Sheet1") | Sheet1의 모든 수식을 더티로 만들고 범위 밖의 의존성도 더티 처리하여 계산합니다. | Sheet1의 더티 셀을 계산하고 다른 셀은 더티 상태 유지 |
참고: 셀의 수식을 다시 계산하기 위한 기존 메서드인 sheet.recalcAll()은 SpreadJS v16.2 버전부터 더 이상 사용되지 않습니다. 대신 spread.calculate() 메서드를 사용할 수 있습니다.
다음 코드 샘플은 SpreadJS에서 다양한 계산 모드와 유형을 사용하는 예를 보여줍니다.
spread.sheets[0].setFormula(0,0,"RAND()");
spread.sheets[0].setFormula(1,0,"=Sheet2!A1");
spread.sheets[0].setFormula(2,0,"=1+2");
spread.sheets[1].setFormula(0,0,"RAND()");
spread.sheets[1].setFormula(1,0,"=Sheet1!A1");
// 모든 셀 계산
spread.calculate(); spread.calculate(GC.Spread.Sheets.CalculationType.regular);
// Sheet1!A1 및 Sheet2!A2는 새 숫자로 계산되고, Sheet1!A2 및 Sheet1!A3도 계산됩니다.
spread.calculate(GC.Spread.Sheets.CalculationType.all, "Sheet1");
// Sheet1!A1 및 Sheet2!A2는 새 숫자로 계산됩니다.
spread.calculate(GC.Spread.Sheets.CalculationType.regular, "Sheet1!A1");
// 아무 셀도 계산되지 않습니다.
spread.calculate(GC.Spread.Sheets.CalculationType.regular, "Sheet1!A2");
// Sheet1!A1은 새 숫자로 계산되며 Sheet1!A2 및 Sheet1!A3도 계산되지만 변경되지 않음, Sheet2!A2는 수동 모드에서 더티 상태 유지
spread.calculate(GC.Spread.Sheets.CalculationType.all, "Sheet1");
// Sheet1!A1은 새 숫자로 계산되며 Sheet2!A2는 수동 모드에서 더티 상태 유지
spread.calculate(GC.Spread.Sheets.CalculationType.regular, "Sheet1");
// Sheet2!A2는 더티 상태이므로 계산됩니다.
spread.calculate(GC.Spread.Sheets.CalculationType.minimal);
SpreadJS 디자이너에서는 수식(FORMULAS) >계산(Calculations) 탭 그룹의 '계산 옵션(Calculation Options)' 버튼을 선택하여 원하는 계산 옵션을 설정할 수 있습니다.
수동 계산 모드에서는 워크북의 어느 영역을 다시 계산할 것인지 선택해야 합니다.
지금 계산(Calculate Now) 버튼을 클릭하면 모든 열린 워크시트에서 변경 사항을 업데이트합니다.
시트 계산(Calculate Sheet) 버튼을 클릭하면 현재 워크시트에서만 변경 사항을 반영합니다.