Custom

You can customize how groups are shown to fit your needs.

The detail columns and grouping outline can be hidden, and each group can be collapsed.

Description
app.js
index.html
styles.css
Copy to CodeMine

TableSheet can be grouped by multiple group fields.

sheet.groupBy([
    {
        field: "carrier_name", caption: "Carrier Name"
    },
    {
        field: "year", caption: "Year"
    },
    {
        field: "month", caption: "Month", summaryFields: [
            {
                caption: "Arrived",
                formula: "=SUM([arr_flights])",
                width: 80,
                style: { foreColor: "green" }
            },
            {
                caption: "Delayed",
                formula: "=SUM([arr_del15])",
                width: 80,
                style: { foreColor: "orange" }
            },
            {
                caption: "Cancelled",
                formula: "=SUM([arr_cancelled])",
                width: 90,
                style: { foreColor: "red" }
            },
            {
                caption: "Diverted",
                formula: "=SUM([arr_diverted])",
                width: 80,
                style: { foreColor: "blue" }
            }
        ]
    }
]);
  /**
   * Whether to show or hide the detail columns after TableSheet is grouped.
   * @param {boolean} value - A boolean value which indicates the visibility of the detail columns.
   * @returns {boolean} Returns the visibility of the detail columns.
   */
  detailColumnsVisible (value?: boolean): boolean

After TableSheet is grouped, the detail columns can be hidden.

sheet.detailColumnsVisible(false);
  /**
   * Whether to show or hide the grouping outline in viewport area and column header area, or row header area after TableSheet is grouped.
   * @param {GC.Spread.Sheets.TableSheet.GroupOutlinePosition} value - A value which indicates the position of the grouping outline.
   * @returns {GC.Spread.Sheets.TableSheet.GroupOutlinePosition} Returns the position of the grouping outline.
   */
  groupOutlinePosition (value?: GC.Spread.Sheets.TableSheet.GroupOutlinePosition): GC.Spread.Sheets.TableSheet.GroupOutlinePosition

After TableSheet is grouped, the grouping outline in the row header can be hidden.

sheet.groupOutlinePosition(GC.Spread.Sheets.TableSheet.GroupOutlinePosition.none);
  /**
   * Expands or collapses one level grouping by the specified field.
   * @param {string} field - The field name.
   * @param {boolean} expand - A boolean value, true means expanding the grouping, false means collapsing the grouping.
   */
  expandGroup (field: string, expand: boolean): void

After TableSheet is grouped, the groups that are separated by the "month field can be collapsed.

sheet.expandGroup("month", false);
  /**
   * Expands or collapses one grouping by the specified level and index.
   * @param {number} level - The grouping level.
   * @param {number} index - The grouping start index.
   * @param {boolean} expand - A boolean value, true means expanding the grouping, false means collapsing the grouping.
   */
  expandGroupItem(level: number, index: number, expand: boolean): void

After TableSheet is grouped, the group which level is 2 and start index is 0 could be collapsed.

sheet.expandGroupItem(2, 0, false);
TableSheet can be grouped by multiple group fields. After TableSheet is grouped, the detail columns can be hidden. After TableSheet is grouped, the grouping outline in the row header can be hidden. After TableSheet is grouped, the groups that are separated by the "month field can be collapsed. After TableSheet is grouped, the group which level is 2 and start index is 0 could be collapsed.
/*REPLACE_MARKER*/ /*DO NOT DELETE THESE COMMENTS*/ window.onload = function() { var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), { sheetCount: 0 }); initSpread(spread); }; function initSpread(spread) { spread.suspendPaint(); spread.options.autoFitType = GC.Spread.Sheets.AutoFitType.cellWithHeader; //init a data manager var dataManager = spread.dataManager(); var myTable = dataManager.addTable("myTable", { data: airline_delay_causes, schema: { type: "csv", columns: { year: { dataType: "number" }, month: { dataType: "number" }, arr_flights: { dataType: "number" }, arr_del15: { dataType: "number" }, carrier_ct: { dataType: "number" }, weather_ct: { dataType: "number" }, nas_ct: { dataType: "number" }, security_ct: { dataType: "number" }, late_aircraft_ct: { dataType: "number" }, arr_cancelled: { dataType: "number" }, arr_diverted: { dataType: "number" } } } }); //init a table sheet var sheet = spread.addSheetTab(0, "TableSheet1", GC.Spread.Sheets.SheetType.tableSheet); sheet.setDefaultRowHeight(100, GC.Spread.Sheets.SheetArea.colHeader); sheet.options.allowAddNew = false; //hide new row //bind a view to the table sheet myTable.fetch().then(function () { var myView = myTable.addView("myView", [ { value: "year", caption: "Year", width: 80 }, { value: "month", caption: "Month", width: 100 }, { value: "carrier_name", caption: "Carrier name", width: 250 }, { value: "airport_name", caption: "Airport Name", width: "*" }, { value: "arr_flights", caption: "Number of flights which arrived at the airport", width: "*" }, { value: "arr_del15", caption: "Number of flights delayed (>= 15minutes late)", width: "*" }, { value: "carrier_ct", caption: "Number of flights delayed due to air carrier", width: "*" }, { value: "weather_ct", caption: "Number of flights delayed due to weather", width: "*" }, { value: "nas_ct", caption: "Number of flights delayed due to National Aviation System", width: "*" }, { value: "security_ct", caption: "Number of flights delayed due to security", width: "*" }, { value: "late_aircraft_ct", caption: "Number of flights delayed due to a previous flight using the same aircraft being late", width: "*" }, { value: "arr_cancelled", caption: "Number of cancelled flights", width: "*" }, { value: "arr_diverted", caption: "Number of diverted flights", width: "*" } ] ); spread.suspendPaint(); sheet.setDataView(myView); groupCallback(); sheet.detailColumnsVisible(false); sheet.expandGroup("month", false); spread.resumePaint(); }); spread.resumePaint(); var groupCallback = function () { sheet.groupBy([ { field: "carrier_name", caption: "Carrier Name" }, { field: "year", caption: "Year" }, { field: "month", caption: "Month", width:100, summaryFields: [ { caption: "Arrived", formula: "=SUM([arr_flights])", width: 90, style: { foreColor: "green", formatter: "#,##0"} }, { caption: "Delayed", formula: "=SUM([arr_del15])", width: 90, style: { foreColor: "orange", formatter: "#,##0"} }, { caption: "Cancelled", formula: "=SUM([arr_cancelled])", width: 100, style: { foreColor: "red", formatter: "#,##0"} }, { caption: "Diverted", formula: "=SUM([arr_diverted])", width: 90, style: { foreColor: "blue", formatter: "#,##0"} } ] } ]); }; var groupButton = document.getElementById("groupButton"); groupButton.addEventListener("click", groupCallback); var removeGroupButton = document.getElementById("removeGroupButton"); removeGroupButton.addEventListener("click", function () { sheet.removeGroupBy(); }); var detailColumnsVisibleCheckbox = document.getElementById("detailColumnsVisibleCheckbox"); detailColumnsVisibleCheckbox.addEventListener("change", function () { sheet.detailColumnsVisible(detailColumnsVisibleCheckbox.checked); }); var groupOutlinePositionSelect = document.getElementById("groupOutlinePositionSelect"); groupOutlinePositionSelect.addEventListener("change", function () { sheet.groupOutlinePosition(+groupOutlinePositionSelect.value); }); var expandGroupCheckboxes = document.getElementsByClassName("expandGroupCheckbox"); for (var i = 0; i < expandGroupCheckboxes.length; i++) { var element = expandGroupCheckboxes[i]; element.addEventListener("change", function () { sheet.expandGroup(this.getAttribute("group-field"), this.checked); }); } }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <!-- Promise Polyfill for IE, https://www.npmjs.com/package/promise-polyfill --> <script src="https://cdn.jsdelivr.net/npm/promise-polyfill@8/dist/polyfill.min.js"></script> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets/dist/gc.spread.sheets.all.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-tablesheet/dist/gc.spread.sheets.tablesheet.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/data/airline_delay_causes.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script> <script src="app.js" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="styles.css"> </head> <body> <div class="sample-tutorial"> <div id="ss" class="sample-spreadsheets"></div> <div id="optionContainer" class="optionContainer"> <div> <input type="button" value="Group" id="groupButton" /> <input type="button" value="RemoveGroup" id="removeGroupButton" /> </div> <div> <label> <input type="checkbox" id="detailColumnsVisibleCheckbox" />Detail Columns Visible </label> </div> <div> <label> Group Outline Position <select id="groupOutlinePositionSelect"> <option value="0">none</option> <option value="1" selected>groupCell</option> <option value="2">rowHeader</option> <option value="3">groupCellAll</option> </select> </label> </div> <div> <label> <input type="checkbox" checked class="expandGroupCheckbox" group-field="carrier_name" />Expand/Collapse "Carrier Name" </label> </div> <div> <label> <input type="checkbox" checked class="expandGroupCheckbox" group-field="year" />Expand/Collapse "Year" </label> </div> <div> <label> <input type="checkbox" class="expandGroupCheckbox" group-field="month" />Expand/Collapse "Month" </label> </div> </div> </div> </html>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } .sample-spreadsheets { width: calc(100% - 280px); height: 100%; overflow: hidden; float: left; } .optionContainer { float: right; width: 280px; } .optionContainer div { margin: 10px; } label { font-size: 13.3px; }