Row Layout Sales Report

Row layout report is a common report style, and it is very useful when users want to show multiple records on the same row.

Description
app.js
index.html
styles.css
Copy to CodeMine
Open the demo in new window can open the designer

How to open desgnr

You can create a row-layout sales report in the following steps.

  • Define the sales table in the DataManager.
  • Set the style for the template.
  • Bind the data column to the template and use the ‘Group' cell type.
  • Set the row layout setting by the setLayoutSetting API.
  • Switch to PaginatedPreview to view the report.
const spread = new GC.Spread.Sheets.Workbook('ss', { sheetCount: 1 });
spread.options.scrollByPixel = true;
spread.options.scrollbarMaxAlign = true;
const records = [
    ['East', 'John', 'Banana', 180],
    ['East', 'Mike', 'Banana', 200],
    ['East', 'Emma', 'Banana', 210],
    ['East', 'Sophia', 'Banana', 316],
    ['East', 'Jennifer', 'Banana', 130],
    ['North', 'Kristen', 'Banana', 410.0],
    ['North', 'Mia', 'Banana', 290.0],
    ['North', 'Bella', 'Banana', 342.0],
    ['North', 'Eva', 'Banana', 214.0],
    ['East', 'John', 'Strawberry', 230.0],
    ['East', 'Mike', 'Strawberry', 641.0],
    ['East', 'Emma', 'Strawberry', 234.0],
    ['East', 'Sophia', 'Strawberry', 625.0],
    ['East', 'Jennifer', 'Strawberry', 241.0],
    ['North', 'Kristen', 'Strawberry', 195.0],
    ['North', 'Mia', 'Strawberry', 569.0],
    ['North', 'Bella', 'Strawberry', 698.0],
    ['North', 'Eva', 'Strawberry', 214.0],
    ['East', 'John', 'Watermelon', 147.0],
    ['East', 'Mike', 'Watermelon', 489.0],
    ['East', 'Emma', 'Watermelon', 347.0],
    ['East', 'Sophia', 'Watermelon', 652.0],
    ['East', 'Jennifer', 'Watermelon', 471.0],
    ['North', 'Kristen', 'Watermelon', 287.0],
    ['North', 'Mia', 'Watermelon', 349.0],
    ['North', 'Bella', 'Watermelon', 163.0],
    ['North', 'Eva', 'Watermelon', 841.0],
    ['East', 'John', 'Chips', 292.0],
    ['East', 'Mike', 'Chips', 514.0],
    ['East', 'Emma', 'Chips', 256.0],
    ['East', 'Sophia', 'Chips', 148.0],
    ['East', 'Jennifer', 'Chips', 486.0],
    ['North', 'Kristen', 'Chips', 285.0],
    ['North', 'Mia', 'Chips', 741.0],
    ['North', 'Bella', 'Chips', 249.0],
    ['North', 'Eva', 'Chips', 105.0],
    ['East', 'John', 'Cookie', 554.0],
    ['East', 'Mike', 'Cookie', 311.0],
    ['East', 'Emma', 'Cookie', 186.0],
    ['East', 'Sophia', 'Cookie', 654.0],
    ['East', 'Jennifer', 'Cookie', 247.0],
    ['North', 'Kristen', 'Cookie', 143.0],
    ['North', 'Mia', 'Cookie', 617.0],
    ['North', 'Bella', 'Cookie', 214.0],
    ['North', 'Eva', 'Cookie', 324.0],
];
const columns = ['Region', 'Salesman', 'Product', 'Sales'];
const salesTable = spread.dataManager().addTable('Sales', {
    data: records.map((x) => {
        const record = {};
        columns.forEach((c, i) => record[c] = x[i]);
        return record;
    })
});

salesTable.fetch().then(() => {
    const reportSheet = spread.addSheetTab(0, 'Row Layout Sales Report', GC.Spread.Sheets.SheetType.reportSheet);
    const templateSheet = reportSheet.getTemplate();

    templateSheet.defaults.colWidth = 100;
    templateSheet.defaults.rowHeight = 30;
    const headerStyle = new GC.Spread.Sheets.Style();
    headerStyle.backColor = '#80CBC4';
    headerStyle.hAlign = GC.Spread.Sheets.HorizontalAlign.center;
    headerStyle.vAlign = GC.Spread.Sheets.VerticalAlign.center;
    headerStyle.foreColor = '#424242';
    headerStyle.font = '12px "Open Sans"';
    const dataStyle = new GC.Spread.Sheets.Style();
    dataStyle.hAlign = GC.Spread.Sheets.HorizontalAlign.center;
    dataStyle.vAlign = GC.Spread.Sheets.VerticalAlign.center;
    dataStyle.foreColor = '#424242';
    dataStyle.font = '12px "Open Sans"';
    const border = new GC.Spread.Sheets.LineBorder('#e0e0e0', 1);
    dataStyle.borderBottom = border;
    dataStyle.borderTop = border;
    dataStyle.borderLeft = border;
    dataStyle.borderRight = border;
    templateSheet.setValue(0, 0, 'Row Layout Sales Report');
    templateSheet.addSpan(0, 0, 1, 4);
    const headerStyle1 = headerStyle.clone();
    headerStyle1.font = '16px "Open Sans"';
    templateSheet.setStyle(0, 0, headerStyle1);
    templateSheet.setRowHeight(0, 50);

    columns.forEach((columnName, i) => {
        templateSheet.setValue(1, i, columnName);
        templateSheet.setStyle(1, i, headerStyle);
        templateSheet.setStyle(2, i, dataStyle);
        templateSheet.setTemplateCell(2, i, {
            type: 'Group',
            binding: `Sales[${columnName}]`,
        });
    });
    templateSheet.setTemplateCell(0, 0, {
        type: 'Static',
        canBreakWhenPaging: false,
    });

    templateSheet.setLayoutSetting({
        type: 'RowLayout',
        dataRange: 'A3:D3',
        rowCount: 25,
        repeatRows: {
            start: 1,
            end: 1,
        }
    });

    reportSheet.renderMode('PaginatedPreview');
});
Open the demo in new window can open the designer You can create a row-layout sales report in the following steps. Define the sales table in the DataManager. Set the style for the template. Bind the data column to the template and use the ‘Group' cell type. Set the row layout setting by the setLayoutSetting API. Switch to PaginatedPreview to view the report.
window.onload = async () => { const loadingTip = addLoadingTip(); const { spread, designer } = createSpreadAndDesigner(); const res = await fetch('$DEMOROOT$/en/sample/features/report-sheet/showcase/layout-report/row-layout-sales-report/spread.json'); await spread.fromJSON(await res.json()); loadingTip.remove(); if (designer) { designer.refresh(); } } 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(), } } } 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; }
<!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"> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/en/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$/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-print/dist/gc.spread.sheets.print.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-shapes/dist/gc.spread.sheets.shapes.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-charts/dist/gc.spread.sheets.charts.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-reportsheet-addon/dist/gc.spread.report.reportsheet.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script> <script> const designerDependencyScripts = [ '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-barcode/dist/gc.spread.sheets.barcode.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-pdf/dist/gc.spread.sheets.pdf.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-pivot-addon/dist/gc.spread.pivot.pivottables.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-slicers/dist/gc.spread.sheets.slicers.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-tablesheet/dist/gc.spread.sheets.tablesheet.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-ganttsheet/dist/gc.spread.sheets.ganttsheet.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-formula-panel/dist/gc.spread.sheets.formulapanel.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-io/dist/gc.spread.sheets.io.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-designer-resources-en/dist/gc.spread.sheets.designer.resource.en.min.js', '$DEMOROOT$/en/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="demo-host"></div> </div> </body> </html>
body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } .sample-tutorial { position: relative; height: 100%; overflow: hidden; } #demo-host { width: 100%; height: 100%; overflow: hidden; float: left; }