[]
        
(Showing Draft Content)

반복 계산

SpreadJS는 Excel과 마찬가지로 반복 계산(순환 참조)을 지원합니다. 일반적으로 반복 계산은 워크시트에서 특정 숫자 조건이 충족될 때까지 수식을 반복적으로 계산하는 방법입니다. 셀이 수식에서 자신의 셀을 직접 또는 간접적으로 참조하여 수식을 재계산하며, 특정 결과가 나올 때까지 이 과정을 반복합니다.

반복 계산을 워크시트에서 활성화하려면 iterativeCalculation 속성을 사용하면 됩니다. 또한, 수식이 몇 번 재계산될지 지정하려면 iterativeCalculationMaximumIterations 속성을 설정할 수 있습니다. 추가로, 두 계산 값 사이의 최대 변화를 지정하려면 iterativeCalculationMaximumChange 속성을 설정할 수 있습니다.

반복 계산을 활성화하면 모든 순환 참조는 반복적으로 계산되어 값의 변화가 IterativeCalculationMaximumChange보다 작거나 반복 횟수가 IterativeCalculationMaximumIterations에 도달할 때까지 계속됩니다. 그러나 반복 계산을 비활성화하면 모든 순환 참조 셀 값이 0으로 설정되고, 이를 참조하는 다른 셀 값들도 0으로 설정됩니다.

사용 사례

반복 계산은 다음과 같은 사용 사례에서 사용할 수 있습니다:

고객의 미래 투자 가치를 계산하기

고객이 $50,000를 가지고 있고, 이 돈을 현금 예금(CD) 계좌에 투자하여 월 이자율 4.75%를 얻고자 한다고 가정합시다. 2년 후의 총 가치를 계산하기 위해, 우리는 매월의 원금을 계산하고 이전 달의 이자를 더해가며 계산할 것입니다. 여기서 iterativeCalculation 속성을 True로 설정하여 반복 계산을 활성화하고, 최대 반복 횟수를 24로 설정하여 24개월 후(2년)의 이자를 계산합니다. 즉, 25번째 달 말의 총 현금 가치를 계산합니다.




이 사용 사례는 아래의 코드 샘플을 사용하여 설명할 수 있습니다:

$(document).ready(function () {
    // Spread 초기화
    var spread = new GC.Spread.Sheets.Workbook(document.getElementById('ss'), { sheetCount: 1 });
    // 활성 시트 가져오기
    var sheet = spread.getSheet(0);
    
    // 열 너비 설정
    sheet.setColumnWidth(0, 30);
    sheet.setColumnWidth(1, 110);
    sheet.setColumnWidth(2, 130);
    sheet.setColumnWidth(3, 30);
    sheet.setColumnWidth(4, 30);
    sheet.setColumnWidth(5, 230);
    sheet.setColumnWidth(6, 130);
    
    // IterativeCalculation 설정
    spread.options.iterativeCalculation = true;
    spread.options.iterativeCalculationMaximumIterations = 24;
    spread.options.iterativeCalculationMaximumChange = 0.1;
    
    // 텍스트 및 값 설정
    sheet.setText(1, 1, "Initial Cash");
    sheet.setValue(1, 2, 50000);
    sheet.setText(2, 1, "Interest");
    sheet.setValue(2, 2, 0.0475);
    sheet.setText(4, 1, "Month/ Year");
    sheet.setText(4, 2, "Total Cash");
    
    // 배열 생성
    var items = [
    "Jan' 2019", "Feb' 2019", "Mar' 2019", "April' 2019", "May' 2019", "June' 2019", "July' 2019", "Aug' 2019", "Sept' 2019", "Oct' 2019", "Nov' 2019", "Dec' 2019",
    "Jan' 2020", "Feb' 2020", "Mar' 2020", "April' 2020", "May' 2020", "June' 2020", "July' 2020", "Aug' 2020", "Sept' 2020", "Oct' 2020", "Nov' 2020", "Dec' 2020", "Jan' 2021"
    ];
    // 배열 설정
    sheet.setArray(5, 1, items);
    
    // 수식 설정
    sheet.setFormula(5, 2, '=C2*(1+C3)');
    sheet.setFormula(6, 2, '=C6*(1+C3)');
    for (var i = 6; i < 30; i++) {
        sheet.setFormula(i, 2, '=C' + i + '*(1+C3)');
    }
    
    // 이 사용 사례는 아래의 코드 샘플을 사용하여 설명할 수 있습니다:
    sheet.tables.add("Table1", 4, 1, 26, 2, GC.Spread.Sheets.Tables.TableThemes.medium6);
    // set values and formulas
    sheet.setText(1, 5, "Initial Cash");
    sheet.setValue(1, 6, 50000);
    sheet.setText(2, 5, "Interest");
    sheet.setValue(2, 6, 0.0475);
    sheet.setText(3, 5, "Total Cash after 2 yrs (as on Jan' 2021)");
    sheet.setFormula(3, 6, '=G2*(1+G3)');
    
    // 이 수식은 순환 참조를 생성합니다.
    sheet.setFormula(1, 6, '=G4');
    
    // 포맷터 설정
    sheet.setFormatter(1, 2, '$#,##0.00');
    sheet.setFormatter(2, 2, '0.00%');
    sheet.setFormatter(1, 6, '$#,##0.00');
    sheet.setFormatter(2, 6, '0.00%');
    sheet.setFormatter(3, 6, '$#,##0.00');
    sheet.setFormatter(5, 2, '$#,##0.00');
    for (var i = 6; i < 30; i++) {
        sheet.setFormatter(i, 2, '$#,##0.00');
    }
    
    // 셀 범위에 테두리 설정하기
    sheet.getRange("B2:C3", GC.Spread.Sheets.SheetArea.viewport).setBorder(new GC.Spread.Sheets.LineBorder("black", GC.Spread.Sheets.LineStyle.thin), { all: true }, 3);
    sheet.getRange("F2:G4", GC.Spread.Sheets.SheetArea.viewport).setBorder(new GC.Spread.Sheets.LineBorder("black", GC.Spread.Sheets.LineStyle.thin), { all: true }, 3);
    sheet.getRange("B5:C30", GC.Spread.Sheets.SheetArea.viewport).setBorder(new GC.Spread.Sheets.LineBorder("black", GC.Spread.Sheets.LineStyle.thin), { all: true }, 3);
    // 셀 범위에 배경색 설정하기
    sheet.getRange("C2:C3").backColor("#D9E3F2");
    sheet.getRange("G2:G4").backColor("#D9E3F2");
});

셀에 타임스탬프 추가하기

반복 계산은 워크시트에서 타임스탬프를 설정하는 데 사용할 수 있습니다. 예를 들어, 작업 목록을 관리하고 있고 각 작업 뒤에 날짜와 시간을 인접 셀에 추가하고 싶을 때, 반복 계산을 활성화할 수 있습니다. 타임스탬프 사용 사례를 위해 iterativeCalculation 속성을 true로 설정하여 반복 계산을 활성화합니다. 여기서는 iterativeCalculationMaximumIterations 속성을 사용하여 24로 설정했는데, 이는 SpreadJS에 수식을 실행할 최대 횟수를 알려줍니다. 반복 계산을 사용하면 'Employee Name' 열에 새로운 항목을 입력할 때마다 'TimeStamp' 열에 타임스탬프가 자동으로 업데이트되며, 23번째 행에 도달할 때까지 계속됩니다.




이 사용 사례는 아래의 코드 샘플을 사용하여 설명할 수 있습니다:

$(document).ready(function () {
    // Spread 초기화
    var spread = new GC.Spread.Sheets.Workbook(document.getElementById('ss'), { sheetCount: 1 });
    // 활성 시트 가져오기
    var sheet = spread.getSheet(0);
    sheet.suspendPaint();
    // 열 너비 설정
    sheet.setColumnWidth(0, 200);
    sheet.setColumnWidth(1, 200);
    
    // IterativeCalculation 설정
    spread.options.iterativeCalculation = true;
    spread.options.iterativeCalculationMaximumIterations = 24;
    spread.options.iterativeCalculationMaximumChange = 0.1;
    
    // 셀 범위에 배경색 설정하기
    sheet.getRange("A1:B1").backColor("#D9E3F2");
    // 셀에 텍스트 설정하기
    sheet.setText(0, 0, "Employee Name");
    sheet.setText(0, 1, "TimeStamp");
    for (var i = 2; i < spread.options.iterativeCalculationMaximumIterations; i++) {
        sheet.setFormula(i - 1, 1, '=IF(A' + i + '<>"",IF(B' + i + '<>"",B' + i + ',NOW()),"")');
        sheet.setFormatter(i - 1, 1, 'dd-mm-yyyy hh:mm:ss');
    }
    
    // 샘플 데이터
    sheet.setText(1, 0, "Andy");
    var style = new GC.Spread.Sheets.Style();
    style.font = "bold 12px Arial";
    style.foreColor = "white";
    style.backColor = "#5B9BD5";
    style.hAlign = GC.Spread.Sheets.HorizontalAlign.center;
    style.vAlign = GC.Spread.Sheets.VerticalAlign.center;
    for (var i = 0; i < 2; i++)
        sheet.setStyle(0, i, style, GC.Spread.Sheets.SheetArea.viewport);
    sheet.resumePaint();
});