SpreadJS は、フィールド値によるグループ化に加えて、条件ルールまたは数式の計算結果によってデータをグループ化する高度なグループ化もサポートしています。
デザイナでリボンメニューの「プレビューを閉じる」をクリックすると、テンプレートシートの設定を確認することができます。
「パネル」をクリックすると、テンプレートセルの設定を確認できます。
このサンプルでは、A4セルの高度なグループ化の条件(Bins)や、B4、C4セルの並べ替え条件の設定が確認できます。
高度なグループ化のインターフェイスは次の通りです。
type GroupCell = DataCellBase & {
type: 'Group';
bins?: IGroupBin[];
formula?: string;
};
interface IGroupBin {
caption: string;
groupBy: string; // 条件を指定する数式の文字列
stopIfTrue?: boolean; // 1つのレコードがこのルールに一致する場合、他のルールとの一致はチェックしない。デフォルトは true です。
alwaysVisible?: boolean; // このルールに一致するレコードがない場合にこのルールを表示するかどうか。デフォルトは false です。
}
高度なグループ化の使用例を以下に示します。
ルールによるグループ化
さまざまなレコードに一致する複数の高度なルールを追加できます。
const spread = new GC.Spread.Sheets.Workbook('ss', { sheetCount: 1 });
const salesTable = spread.dataManager().addTable('Sales', {
remote: {
read: {
url: 'https://developer.mescius.com/spreadjs/demos/server/api/Sales'
}
}
});
salesTable.fetch().then(() => {
const reportSheet = spread.addSheetTab(0, 'report1', GC.Spread.Sheets.SheetType.reportSheet);
const templateSheet = reportSheet.getTemplate();
// データを取得してレポートを作成します
templateSheet.setTemplateCell(1, 0, {
type: 'Group',
binding: "Sales[Sales]",
bins: [ // 売上金額によってグループ化します
{caption: "Sales <= 200", groupBy: "=([@Sales] <= 200)"},
{caption: "Sales > 200 && Sales <= 500", groupBy: "=AND([@Sales] > 200, [@Sales] <= 500)"},
{caption: "Sales > 500", groupBy: "=([@Sales] > 500)"},
]
});
templateSheet.setTemplateCell(1, 1, {
type: 'Group',
binding: `Sales[Salesman]`,
});
templateSheet.setTemplateCell(1, 2, {
type: 'Group',
binding: `Sales[Sales]`,
});
templateSheet.setTemplateCell(1, 3, {
type: 'Group',
binding: `Sales[Product]`,
});
reportSheet.refresh();
});
数式によるグループ化
数式を使用してすべてのレコードを計算し、数式の計算結果でグループ化することもできます。
const spread = new GC.Spread.Sheets.Workbook('ss', { sheetCount: 1 });
const salesTable = spread.dataManager().addTable('Orders', {
remote: {
read: {
url: 'https://demodata.mescius.io/northwind/api/v1/orders'
}
}
});
salesTable.fetch().then(() => {
const reportSheet = spread.addSheetTab(0, 'report1', GC.Spread.Sheets.SheetType.reportSheet);
const templateSheet = reportSheet.getTemplate();
// データをテンプレートセルに連結します
templateSheet.setTemplateCell(1, 0, {
type: 'Group',
binding: "Orders[OrderDate]",
formula: '=YEAR([@OrderDate])&"/"&MONTH([@OrderDate])' // 年と月でグループ化します
});
templateSheet.setTemplateCell(1, 1, {
type: 'Group',
binding: `Orders[ShipName]`,
});
templateSheet.setTemplateCell(1, 2, {
type: 'Summary',
aggregate: "Sum",
binding: `Orders[Freight]`,
});
reportSheet.refresh();
});