매개 변수 및 ParameterUI

정적 값 대신 동적 매개 변수를 사용하여 필터에서 데이터를 재생성할 수 있습니다.

SpreadJS는 매개 변수와 parameterUI를 지원하여 이 요구 사항을 충족하는 데 도움을 제공합니다. 아래 데모에서 매개 변수를 변경하여 값을 필터링해 보십시오.

설명
app.js
index.html
styles.css
새 창에서 데모를 열어 디자이너 열기

디자이너를 여는 방법

매개 변수 인터페이스는 아래와 같습니다.

interface IParameter {
    [parameterName: string]: string | number | boolean | Date;
}
class ReportSheet {
    function setParametersUI(host: HTMLElement | string, initParametersUI: GC.Spread.Report.InitParametersUIFunctionType, onChange: GC.Spread.Report.OnChangeFunctionType): void;
}

type InitParametersUIFunctionType = (sheet: Worksheet) => void;

type OnChangeFunctionType = (sheet: ReportSheet, changedArgs: IParameterChangedArgs) => void;

interface IParameterChangedArgs {
    tag: string; // changed cell bindingPath or tag.
    oldValue: string | number | boolean | Date;
    newValue: string | number | boolean | Date;
}

현재는 필터에서만 매개 변수를 사용할 수 있습니다.

  1. reportSheet의 매개 변수 정의
    const spread = new GC.Spread.Sheets.Workbook('ss', { sheetCount: 1 });
    const ordersTable = spread.dataManager().addTable('Orders', {
        remote: {
            read: {
                url: baseApiUrl + '/Order'
            }
        }
    });
    ordersTable.fetch().then(() => {
        const reportSheet = spread.addSheetTab(0, 'report1', GC.Spread.Sheets.SheetType.reportSheet);
        reportSheet.parameter({
            customerId: "VINET",
            startDate: new Date("1996/7/1"),
            endDate: new Date("1998/7/1"),
        });
    });
  1. 템플릿 셀 필터 조건에서 매개 변수 사용
    const reportSheet = spread.getActiveSheetTab();
    const templateSheet = reportSheet.getTemplate();
    // set value and binding for the template
    templateSheet.setTemplateCell(1, 0, {
        type: 'List',
        binding: `Orders[orderId]`,
        filter: {
            condition: {
                and: [
                    {
                        column: "customerId",
                        operator: "Equal",
                        parameter: "customerId", // use parameter in filter condition.
                    },
                    {
                        column: "orderDate",
                        operator: "GreaterThanOrEqual",
                        parameter: "startDate",
                    },
                    {
                        column: "orderDate",
                        operator: "lessThanOrEqual",
                        parameter: "endDate"
                    }
                ]
            }
        }
    });
    // refresh the report
    reportSheet.refresh();
    // if users want to update the parameter.
    reportSheet.parameter({
        customerId: "TOMSP",
        startDate: new Date("1996/7/1"),
        endDate: new Date("1998/7/1"),
    });
    reportSheet.refresh();
  1. parameterUI 초기화(선택 사항)
    var reportSheet = spread.getActiveSheetTab();
    var parameterUIHost = document.getElementById("report-sheet-parameter-ui");
    reportSheet.setParametersUI(parameterUIHost, initParametersUI, parameterOnChanged);

    function initParametersUI (sheet) { // the parameterUI sheet init callback
        sheet.suspendPaint();
        sheet.suspendEvent();
        sheet.getCell(-1, -1).backColor("rgb(225, 225, 225)");
        sheet.setColumnWidth(0, 5);
        sheet.setColumnWidth(1, 220);
        sheet.setColumnWidth(2, 10);
        sheet.setColumnWidth(3, 220);
        sheet.setColumnWidth(4, 10);
        sheet.setColumnWidth(5, 220);
        sheet.setColumnWidth(6, 10);
        sheet.setColumnWidth(7, 105);
        sheet.setRowHeight(0, 10);
        sheet.setRowHeight(1, 30);
        sheet.setRowHeight(2, 30);
        sheet.setValue(1, 1, "CustomerID:");
        sheet.setValue(1, 3, "StartDate:");
        sheet.setValue(1, 5, "EndDate:");
        sheet.getCell(2, 1).bindingPath("customerId"); // bind parameter
        sheet.getCell(2, 3).bindingPath("startDate");
        sheet.getCell(2, 5).bindingPath("endDate");

        let submitButton = new GC.Spread.Sheets.CellTypes.Button(); // add submit button
        submitButton.text("Submit");
        submitButton.buttonBackColor("#00897B");
        submitButton.buttonClickColor("#004D40");
        sheet.getCell(2, 7).tag("submitButton").foreColor("white").cellType(submitButton);
        let style = sheet.getStyle(2, 7);
        style.hAlign = HorizontalAlign.center;
        style.vAlign = VerticalAlign.center;
        style.textIndent = 0;
        sheet.setStyle(2, 7, style);

        sheet.resumeEvent();
        sheet.resumePaint();
    };
    function parameterOnChanged (reportSheet, valueChangedArgs) { // the parameterUI changed callback
        if (valueChangedArgs.tag === "submitButton") { // judge the changed parameter.
            reportSheet.regenerateReport();
        }
    }
새 창에서 데모를 열어 디자이너 열기 매개 변수 인터페이스는 아래와 같습니다. 현재는 필터에서만 매개 변수를 사용할 수 있습니다. reportSheet의 매개 변수 정의 템플릿 셀 필터 조건에서 매개 변수 사용 parameterUI 초기화(선택 사항)
window.onload = async () => { const loadingTip = addLoadingTip(); const { spread, designer } = createSpreadAndDesigner(); const res = await fetch('$DEMOROOT$/ko/sample/features/report-sheet/data-settings/parameter/spread.json'); await spread.fromJSON(await res.json()); if (!designer) { initParameterFilterReportParameterUI(spread.getActiveSheetTab()); } loadingTip.remove(); if (designer) { let parameterUIHost = document.getElementById('report-sheet-parameter-ui'); let demoHost = document.getElementById('demo-host') if (parameterUIHost) { parameterUIHost.style.display = 'none'; } if (demoHost) { demoHost.classList.add("full-height"); } designer.refresh(); } } function initParameterFilterReportParameterUI (reportSheet) { let parameterUIHost = document.getElementById("report-sheet-parameter-ui"); reportSheet.setParametersUI(parameterUIHost, initParametersUI, parameterOnChanged); } function initParametersUI (sheet) { } function parameterOnChanged (sheet, valueChangedArgs) { if (valueChangedArgs.tag === "submitOnChangeButton") { sheet.regenerateReport(); } } function addLoadingTip() { const div = document.createElement('div'); div.style.position = 'absolute'; div.style.inset = '0'; div.style.display = 'flex'; div.style.alignItems = 'center'; div.style.justifyContent = 'center'; div.style.background = 'white'; div.style.zIndex = '100'; div.textContent = 'Loading data from server ...'; document.body.appendChild(div); return div; } function createSpreadAndDesigner() { const demoHost = document.getElementById('demo-host'); if (window !== top) { return { spread: new GC.Spread.Sheets.Workbook(demoHost, { sheetCount: 1 }), } } else { const designer = new GC.Spread.Sheets.Designer.Designer(demoHost, undefined, undefined, { sheetCount: 1 }); return { designer, spread: designer.getWorkbook(), } } }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta name="spreadjs culture" content="ko-kr"/> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets-designer/styles/gc.spread.sheets.designer.min.css"> <link rel="stylesheet" type="text/css" href="styles.css"> <script src="$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets/dist/gc.spread.sheets.all.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets-print/dist/gc.spread.sheets.print.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets-shapes/dist/gc.spread.sheets.shapes.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets-charts/dist/gc.spread.sheets.charts.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets-reportsheet-addon/dist/gc.spread.report.reportsheet.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets-resources-ko/dist/gc.spread.sheets.resources.ko.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script> <script> const designerDependencyScripts = [ '$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets-barcode/dist/gc.spread.sheets.barcode.min.js', '$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets-pdf/dist/gc.spread.sheets.pdf.min.js', '$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets-pivot-addon/dist/gc.spread.pivot.pivottables.min.js', '$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets-slicers/dist/gc.spread.sheets.slicers.min.js', '$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets-tablesheet/dist/gc.spread.sheets.tablesheet.min.js', '$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets-ganttsheet/dist/gc.spread.sheets.ganttsheet.min.js', '$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets-formula-panel/dist/gc.spread.sheets.formulapanel.min.js', '$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets-io/dist/gc.spread.sheets.io.min.js', '$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-excelio/dist/gc.spread.excelio.min.js', '$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets-designer-resources-ko/dist/gc.spread.sheets.designer.resource.ko.min.js', '$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets-designer/dist/gc.spread.sheets.designer.all.min.js', '$DEMOROOT$/spread/source/js/designer/license.js', ] function appendScriptNode (src) { const script = document.createElement('script'); script.src = src; script.async = false; script.type = 'text/javascript'; document.head.appendChild(script); } if (top === window) { // not in iframe designerDependencyScripts.forEach(appendScriptNode); } </script> <script src="app.js" type="text/javascript"></script> </head> <body> <div class="sample-tutorial"> <div id="report-sheet-parameter-ui" class="parameter-ui"></div> <div id="demo-host" class="sample-spreadsheets"></div> <div id="optionContainer" class="optionContainer"> </div> </div> </body> </html>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } .parameter-ui { width: 100%; height: 100px; overflow: hidden; float: left; } .sample-spreadsheets { width: 100%; height: calc(100% - 100px); overflow: hidden; float: left; } .full-height { height: 100% !important; }