【Angular】【ExcelJS】ライブラリを使用してExcelファイルを出力するよ

# AangularでExcelJSを使う

データベースのデータをテキストボックスに入力した値でWHEREして取得し、ExcelJSを使用してExcelファイルに出力…

というような内容を行ったので、備忘録として。
(AngularでExcelJS使ってる日本語記事が少なかったので…)

<details>
<summary>筆者について</summary>
Angular歴は2カ月

学生時代にHTML,css,JavaScriptについては勉強
TypeScriptではReactの業務経験は有
</details>


## 準備

Angular プロジェクトにexceljs ライブラリをインストール

`npm install exceljs --save`

コンポーネントを作成

`ng g c exceljs`

コンポーネントでexceljsをimport

```exceljs.component.ts
import * as ExcelJS from 'exceljs';
```

## 実装

templateにボタンを設置

```exceljs.component.html
<div class="row" style="width: 100%;">
    <ng-container>
        <div>
            <button  style="width: 130px; margin-bottom: 80px;" (click)="exportExcel()">
                    Excel出力ボタン
            </button>
        </div>
    </ng-container>
</div>

```

```exceljs.component.ts
import * as ExcelJS from 'exceljs';

@Component({
  selector: 'exceljs',
  templateUrl: './exceljs.component.html',
  styleUrls: ['./exceljs.component.css']
})
export class ArrangeListExportComponent implements OnInit,OnDestroy{
    constructor(){}

    async exportExcel(){

        // 新しいワークブックを作成
        const workbook = new ExcelJS.Workbook();
        const worksheet = workbook.addWorksheet('シート名');
        
        // スタイル定義
        const style = {
	      font: {
	        name: 'MS Pゴシック',
	        size: 9,
	        bold: false,
	      },
	      alignment: {
	        vertical: 'middle',
	      } as Alignment,
	    } as Style;

        // AからZの列の1000行目までにスタイル設定
	    for (let i = 65; i <= 90; i++) {
		    const character = String.fromCharCode(i);
		    for (let j = 1; j <= 1000; j++) {
		        const cellAddress = `${character}${j}`;
		        const cell = worksheet.getCell(cellAddress);
		        cell.style = style;
		    }
		}
		
		// 列ごとに幅を指定できる
		 worksheet.getColumn('A').width = 4.00;
		
		// 結合したいセルの始点と終点を指定
		const mergeCellRanges = [
		    { start: 'A1', end: 'M1' },
		    { start: 'A2', end: 'B2' },
		]
		for (const { start, end } of mergeCellRanges) {
		    this.mergeCells(worksheet, start, end);
		}
		
		// セルに出力する値をセット
		this.writeToCell(worksheet, 'A1', "セルに値をセット");
		
		// Excelファイルをダウンロード
    	this.downloadFile(buffer, 'ファイル名.xlsx');

}

	private downloadFile(data: ArrayBuffer, filename: string) {
	    const blob = new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
	    const url = window.URL.createObjectURL(blob);

	    const a = document.createElement('a');
	    a.href = url;
	    a.download = filename;
	    a.click();

	    window.URL.revokeObjectURL(url);
	}

	// セル結合を行うメソッド
	mergeCells(worksheet, startCell, endCell) {
		worksheet.mergeCells(startCell, endCell);
	}
	
	// Excelファイルに書き込む値とセルを指定するメソッド
  	writeToCell(worksheet, cellAddress, value) {
    	worksheet.getCell(cellAddress).value = value;
  	}

```

## 出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728856/27a6c69e-fc5b-4c57-1d70-9cf1a2b5428a.png)

A1～M1　A2とB2　が結合されており、
フォントがMS Pゴシック、サイズが9 
シート名が「シート名」となっており、ファイル名が「ファイル名.xlsx」
であることを確認

:::note info
Excel出力処理について
記事が長くなってしまうのでcomponentファイルに記述しましたが、実装する際はServiceファイルを作成してそちらに定義した方が良いと思われます。
:::

## あとがき

Angularはいいぞ


# andmore...

他にもこんな記事書いてます。

https://qiita.com/SZR/items/837574ffe887a7556fa6

https://qiita.com/SZR/items/a000cbaa583dcd2a344b

https://qiita.com/SZR/items/1d8edaf95fa2f5bbe821