Goのexcelizeを使ってエクセル操作を行う方法

プログラミング

Goではエクセルファイルを操作して、データを集計したり、帳票を作ったりすることができます。

これまでエクセルのマクロで行っていたような操作をGoを使って行うことが可能になります。

本記事では、Goのexcelizeを使ったエクセルファイルの操作方法について解説します。

記事内に記載しているプログラムは、go1.15.2を使って動作確認をしています。

Goのエクセル操作

Pythonのエクセル操作として以下の内容について解説します。

  • エクセル操作を行うライブラリ
  • ワークブックの操作
  • ワークシートの操作
  • セルの操作
  • セルのスタイル

エクセル操作を行うライブラリ

Goでエクセル操作の行うためのライブラリはいくつか種類があります。
よく使われる2つを紹介します。

  • 360EntSecGroup-Skylar/excelize
    • 基本的な読み書きはもちろん、書式設定やグラフの作成や図の挿入なども行うことができる高機能なライブラリです。
    • 日本語でドキュメントが提供されています。
  • tealeg/xlsx
    • シンプルな操作で読み書きや書式設定などの操作を行うことができます。
    • 英語ですがチュートリアルが提供されています。

本記事では、excelizeを使ったエクセル操作について解説します。

ワークブックの操作

excelizeを利用するには、まずライブラリを取得する必要があります。
以下のコマンドで取得することが可能です。

go get github.com/360EntSecGroup-Skylar/excelize

インストール出来たら、importします。

import (
"github.com/360EntSecGroup-Skylar/excelize"
)

まずは、ワークブックを作成して、名前を付けて保存します。

file := excelize.NewFile()

err := file.SaveAs("./test_excel1.xlsx")
if err != nil {
    fmt.Println(err)
    return
}

実行すると、test_excel1.xlsx というファイルが実行したディレクトリに作成されます。
すでに同名のファイルが存在する場合は、新規にファイルを作成して上書きを行います。

既存のワークブックを読み込む場合は、以下のように行います。

file, err = excelize.OpenFile("./test_excel1.xlsx")
if err != nil {
    fmt.Println(err)
    return
}

ワークシートの操作

ワークブックを新規に作成すると、自動的に1つのワークシートが作成されます。
ワークシートの操作は以下のように行います。

ワークシート名の一覧を取得する

現在存在するワークシートのインデックスとシート名がマップ形式で取得できます。

worksheets := file.GetSheetMap()
fmt.Println(worksheets) // -> map[1:Sheet1]

シートを追加する

追加するシート名を指定します。戻り値としてインデックスが返ってきます。

index := file.NewSheet("Sheet2")
fmt.Println(file.GetSheetMap()) // -> map[1:Sheet1 2:Sheet2]
fmt.Println(index) // -> 1

ワークシートをコピーする

コピーは、事前にシートを作成して、そのシートに対して既存のシートの内容をコピーするという形になります。
引数にコピー元とコピー先のインデックスを指定します。

file.CopySheet(0, 1)
fmt.Println(file.GetSheetMap())

ワークシートを削除する

削除は、シート名を指定して行います。

file.DeleteSheet("Sheet2")
fmt.Println(file.GetSheetMap()) // -> map[1:Sheet1]

セルの操作

セルへの書き込み

セルへの書き込みは、シート名、対象セルの位置、書き込むデータを指定して行います。

file.SetCellValue("Sheet1", "A1", "A1データ")

セルの読み込み

セルの読み込みは、シート名と対象セルの位置を指定して行います。

value, err := file.GetCellValue("Sheet1", "A1")
fmt.Println(value) // -> A1データ

セルの位置に関する変換

上述の通り、セルの位置を指定するには、列の英字と行の数値を結合した文字列を指定する必要があります。
プログラムの中で、ループなどにより処理する場合は、英字ではやりづらいので、英字と数字を変換する便利機能が用意されています。

CoordinatesToCellNameは、列と行を別々の数値で指定すると、該当する位置を返してくれます。
(1, 1)を指定するとA1となります。

cell, _ := excelize.CoordinatesToCellName(1, 1)
value, err = file.GetCellValue("Sheet1", cell)
fmt.Println(value) // -> A1データ

列の英字と数字を変換するには、以下のように行います。

fmt.Println(excelize.ColumnNumberToName(37)) // -> AK
fmt.Println(excelize.ColumnNameToNumber("AK")) // -> 37

列と行を分割したり、結合するには、以下のように行います。

fmt.Println(excelize.SplitCellName("AK74")) // -> AK 74
fmt.Println(excelize.CellNameToCoordinates("AK74")) // -> 37 74
fmt.Println(excelize.JoinCellName("AK", 74)) // -> AK74

セル式の設定

セル式を設定するには、SetCellFormulaで行います。
取得はGetCellFormulaで行います。GetCellValueでは取得できません。(excelizeでは内部的なセル式の計算が出来ないようです)

file.SetCellFormula("Sheet1", "A2", "=1+1")
fmt.Println(file.GetCellFormula("Sheet1", "A2")) // -> =1+1
fmt.Println(file.GetCellValue("Sheet1", "A2")) // ->

行単位、列単位での操作

全列を取得するには、Colsを使います。
さらに、対象列の各行を取得するにはRowsを使います。

file.SetCellValue("Sheet1", "B1", "B1データ")
file.SetCellValue("Sheet1", "B2", "B2データ")
cols, _ := file.Cols("Sheet1")
for cols.Next() {
    col, _ := cols.Rows()
    for _, rowCell := range col {
        fmt.Print(rowCell, "\t")
    }
    fmt.Println()
}

上記のプログラムの結果は以下となります。
列ごとに処理をしていることがわかります。
(数式のセルは値が取得できません)

A1データ
B1データ        B2データ

上記とは逆に、最初に全行を取得するにはRowsを使います。
さらに、対象行の各列を取得するにはColsを使います。

rows, _ := file.Rows("Sheet1")
for rows.Next() {
    row, _ := rows.Columns()
    for _, colCell := range row {
        fmt.Print(colCell, "\t")
    }
    fmt.Println()
}

上記のプログラムの結果は以下となります。
行ごとに処理していることがわかります。

A1データ        B1データ
B2データ

セルのスタイル

セルへのスタイルは、エクセルで設定可能な様々なスタイルを適用できます。
複数のスタイルを設定するには、json形式で一度に指定する必要があります。

例えばセルの枠線、フォント、塗りつぶしを設定するには、以下のように行います。

style, _ := file.NewStyle(`{
    "border" : [
        {
            "type": "left",
            "color": "000000",
            "style": 1
        },
        {
            "type": "top",
            "color": "000000",
            "style": 1
        },
        {
            "type": "bottom",
            "color": "000000",
            "style": 1
        },
        {
            "type": "right",
            "color": "000000",
            "style": 1
        }
    ],
    "font" : {
        "size": 14,
        "color": "#0000FF",
        "family": "メイリオ"
    },
    "fill" : {
        "type" : "pattern",
        "color" : ["#FFFF00"],
        "pattern" : 1
    }
}`)
file.SetCellStyle("Sheet1", "B1", "B2", style)

上記のプログラムでは、3つのスタイルを合わせて作成し、B1からB2のセルの範囲に適用しています。
エクセルを開くと以下のようになります。

まとめ

Goのエクセル操作についてまとめると以下となります。

  • Goでエクセル操作を行うには、ライブラリが必要で、excelizeまたはxlsxがよく使われる。
  • excelizeでは、ブック、シート、セルに対しての様々な操作が出来る。
  • Goでエクセル操作を行うプログラムを作り実行ファイルを作成することで、OSに依存せずに利用することが出来る。

今回は基本操作のみの紹介でしたが、細かい操作が出来ますのでぜひ使ってみてはいかがでしょうか。

 

今回は、Goでエクセル操作を行う方法を解説しました。

以上、参考になれば幸いです。

コメント

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