Angular JavaScript

【Angular】Mat-Tableでヘッダーが複数行になるテーブルを作ってみる

この記事は約9分で読めます。

 

前回の記事でAngular-materialによるmat-tableの作り方については解説しましたが、実際の業務ではヘッダーが複数行あったり、編集ボタンでテーブルの中身が書き替えられるみたいな機能の実装を求められることもあり、あれだけだとなかなか厳しいものがあります。

 

というわけで今回はmat-tableでテーブルのヘッダーが複数行になるものが含まれる↓のようなパターンのテーブルの作り方について解説していきたいと思います。

 

 

 

 

 

mat-tableで複数行のヘッダーを持つテーブルを作成する

 

mat-tableモジュールとangularマテリアルについてはインストール&定義済みという前提で話を進めます。

 

 

# コンポーネントを作成する
$ ng generate component multi-table-sample

 

 

<app.routing.module.ts>

import { NgModule } from "@angular/core";
import { Routes, RouterModule } from "@angular/router";
~~~~
import { NgtableSampleComponent } from "./ngtable-sample/ngtable-sample.component"; //これを追加!


const routes: Routes = [
  ~~~~
  { path: "multi-mattable-sample", component:MultiTableSampleComponent} //これを追加!
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule],
})
export class AppRoutingModule {}

 

 

 

<multi-table-sample.component.css>

table {
  width: 80%
}

td.mat-cell,
td.mat-footer-cell,
th.mat-header-cell {
  padding: 0;
  border-bottom-width: 1px;
  border-bottom-style: solid;
  border-right-width: 1px;
  border-right-style: solid;
  border-right-color: rgba(0, 0, 0, .12);
}

th.mat-header-cell {
  text-align: left;
  background-color: green;
  color: white;
}

 

 

<multi-table-sample.component.html>

<table mat-table [dataSource]="dataSource" class="mat-elevation-z8">

<ng-container matColumnDef="no">
    <th mat-header-cell *matHeaderCellDef style='display:none;'> No. </th>
    <td mat-cell *matCellDef="let element"> {{element.no}} </td>
  </ng-container>

<ng-container matColumnDef="no_header">
<th mat-header-cell *matHeaderCellDef [attr.rowspan]="2"> No. </th>
</ng-container>

<ng-container matColumnDef="weight">
    <th mat-header-cell *matHeaderCellDef> 体重 </th>
    <td mat-cell *matCellDef="let element"> {{element.weight}} </td>
  </ng-container>

<ng-container matColumnDef="weightRate">
    <th mat-header-cell *matHeaderCellDef> 体脂肪率 </th>
    <td mat-cell *matCellDef="let element"> {{element.weightRate}} </td>
  </ng-container>

<ng-container matColumnDef="remarks">
    <th mat-header-cell *matHeaderCellDef style='display:none;'> その他 </th>
    <td mat-cell *matCellDef="let element"> {{element.remarks}} </td>
  </ng-container>

<ng-container matColumnDef="remarks_header">
<th mat-header-cell *matHeaderCellDef [attr.rowspan]="2"> その他 </th>
</ng-container>

<ng-container matColumnDef="status">
<th mat-header-cell *matHeaderCellDef [attr.colspan]="2"> 状態 </th>
</ng-container>

<tr mat-header-row *matHeaderRowDef="['no_header', 'status', 'remarks_header']"></tr><tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
  <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>

 

 

<multi-table-sample.component.ts>

import { Component, OnInit } from "@angular/core";

export interface PeriodicElement {
  no: number;
  weight: number;
  weightRate: number;
  remarks: string;
}

@Component({
  selector: "app-multi-table-sample",
  templateUrl: "./multi-table-sample.component.html",
  styleUrls: ["./multi-table-sample.component.css"],
})
export class MultiTableSampleComponent implements OnInit {
  ELEMENT_DATA: PeriodicElement[] = [
    { no: 1001, weight: 65.5, weightRate: 19.5, remarks: "運動不足" },
    { no: 1002, weight: 66, weightRate: 18.1, remarks: "飲みすぎ" },
    { no: 1003, weight: 65.7, weightRate: 19.1, remarks: "" },
    { no: 1004, weight: 65.8, weightRate: 19.3, remarks: "" },
    { no: 1005, weight: 65.3, weightRate: 20.1, remarks: "" },
  ];

  constructor() {}

  ngOnInit() {}

  displayedColumns: string[] = ["no", "weight", "weightRate", "remarks"];
  dataSource = this.ELEMENT_DATA;
}

 

 

http://localhost:4200/multi-mattable-sampleにアクセスすると以下のような画面になります。

 

 

 

【Github】https://github.com/beginerSE/Angular-Demo/tree/master/angular-sample/src/app/multi-table-sample

 

 

 

 

 

 

 

参照:https://stackblitz.com/edit/angular-material-table-multiple-header-rows?file=app%2Ftable-basic-example.html

 

参照:https://stackoverflow.com/questions/53857049/angular-material-table-rowspan-columns-based-on-datasource-object-array-property

 

参照:https://stackoverflow.com/questions/55701270/how-colspan-and-row-span-added-to-material-table-header-angular-7

 

 

 


プログラミング・スクレイピングツール作成の相談を受け付けています!

クラウドワークス・ココナラ・MENTAなどでPython・SQL・GASなどのプログラミングに関する相談やツール作成などを承っております!

過去の案件事例:

  • Twitter・インスタグラムの自動化ツール作成
  • ウェブサイトのスクレイピングサポート
  • ダッシュボード・サイト作成
  • データエンジニア転職相談

これまでの案件例を見る

キャリア相談もお気軽に!文系学部卒からエンジニア・データサイエンティストへの転職経験をもとに、未経験者がどう進むべきかのアドバイスを提供します。


スポンサーリンク
/* プログラミング速報関連記事一覧表示 */
ミナピピンの研究室

コメント

  1. […] 関連記事:【Angular】mat-tableでヘッダーが複数行になるテーブルを作ってみる […]

タイトルとURLをコピーしました