GoでExcelを作成する

## はじめに
アドベントカレンダーの2日目を担当する[HITOTSU株式会社](https://hitotsu.co.jp/)の河村康治です！！！

今回はGoでExcelを生成できるExcelizeの話をしたいと思います。

業務でも利用したのでその紹介から入りたいと思います。

![スクリーンショット 2023-12-01 21.29.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/2f5b79bc-b9dc-52df-fd84-b42584aef5c5.png)


## 作成機能
HITOTSUは病院向けに医療機器管理システムを提供しております。
機器情報や点検情報がExcel出力できれば、監査対応に対応できて便利だよねという声から開発が始まりました。実際に作成した機能は下記イメージです。

## 実際の機能
　1. フロントからリクエスト情報を確定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/e8451f79-d7f6-4219-2cb3-fcd32e3fea61.png)

:::note info
開始年/開始月のデータをAPI側に送信
:::


　2. API側のデータからExcelを出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/805e6a80-32a0-4557-c354-ec5c0abb2dc7.png)

:::note info
リクエスト情報の開始年/開始月を元にデータを収集。
収集データからExcelファイルを作成
:::

詳しい内容は下記Noteをご覧ください😊

https://note.com/hitotsu_life/n/naf8953740a72

## Excelizeとは
Excel出力には、Excelizeを利用しました。

Go言語を使用してExcelファイルの作成、読み込み、更新、削除などの操作を簡単に行うことができます。

簡単にいくつか使い方を記載していこうと思います。

### 基礎編：Excelの新規作成

![スクリーンショット 2023-12-01 22.11.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/881506f7-b054-5bf3-78b1-31774909cec3.png)

```go:main.go
package main

import (
	"github.com/xuri/excelize/v2"
)

func main() {
    file := excelize.NewFile()
    sheetName := "Sheet1"

    // シートにデータを書き込む
    file.SetCellValue(sheetName, "A1", "Hello")
    file.SetCellValue(sheetName, "B1", "World")

    // Excelファイルを保存
    err := file.SaveAs("example.xlsx")
    if err != nil {
        panic(err.Error())
    }
}
```

:::note info
A1セルにHello、B1セルにWorldを書き込み。
:::

### 応用編:TBLと3Dグラフを作成
![スクリーンショット 2023-12-01 22.12.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/c4d732f8-bbc0-c5ec-84ca-a1b22b7d24cb.png)

```go:main.go

package main

import (
	"fmt"

	"github.com/xuri/excelize/v2"
)

func main() {
    f := excelize.NewFile()
    defer func() {
        if err := f.Close(); err != nil {
            fmt.Println(err)
        }
    }()
    for idx, row := range [][]interface{}{
        {nil, "Apple", "Orange", "Pear"},
        {"Small", 2, 3, 3},
        {"Normal", 5, 2, 4},
        {"Large", 6, 7, 8},
    } {
        cell, err := excelize.CoordinatesToCellName(1, idx+1)
        if err != nil {
            fmt.Println(err)
            return
        }
        if err := f.SetSheetRow("Sheet1", cell, &row); err != nil {
            fmt.Println(err)
            return
        }
    }
    if err := f.AddChart("Sheet1", "E1", &excelize.Chart{
        Type: excelize.Bar3DCylinderClustered,
        Series: []excelize.ChartSeries{
            {
                Name:       "Sheet1!$A$2",
                Categories: "Sheet1!$B$1:$D$1",
                Values:     "Sheet1!$B$2:$D$2",
            },
            {
                Name:       "Sheet1!$A$3",
                Categories: "Sheet1!$B$1:$D$1",
                Values:     "Sheet1!$B$3:$D$3",
            },
            {
                Name:       "Sheet1!$A$4",
                Categories: "Sheet1!$B$1:$D$1",
                Values:     "Sheet1!$B$4:$D$4",
            },
        },
        Format: excelize.GraphicOptions{
            OffsetX: 15,
            OffsetY: 10,
        },
        Legend: excelize.ChartLegend{
            Position: "left",
        },
        Title: []excelize.RichTextRun{
            {
                Text: "3D 円柱クラスタ化棒グラフ",
            },
        },
        PlotArea: excelize.ChartPlotArea{
            ShowCatName:     false,
            ShowLeaderLines: false,
            ShowPercent:     true,
            ShowSerName:     true,
            ShowVal:         true,
        },
        ShowBlanksAs: "zero",
    }); err != nil {
        fmt.Println(err)
        return
    }
    // ブックを保存する
    if err := f.SaveAs("Book1.xlsx"); err != nil {
        fmt.Println(err)
    }
}
```

## 感想
Excelizeを使ってみた感想は便利。直感的に実装できる上にドキュメントが丁寧。Go書いている人でExcel出力、読み込みをやりたい方がいればぜひ使ってみてください！！