Go言語のExcelファイル操作ライブラリxlsxを使うと、非常に手軽にExcelファイルを読み書きできます。しかも、Go言語を使えば、単体で動く実行ファイルが手軽に作成できます。配布を念頭においてExcel補助ツールを作るならGo言語がとても便利です。本稿では、Excelファイル読み書きの例として、100人分のビンゴシートを作成してみます。
Go言語で作るとExcelの補助ツールも配布が手軽
Go言語でプログラムを作って便利だと思う点が、作ったプログラムを手軽に配布できる点にあります。実行ファイルを一つ作ったら、それをそのまま配布できます。とにかくファイル一つで済むのが便利です。
事務の人などに、Excelの補助ツールの作成を依頼されたとき、別途何かしらのプログラミング言語やランタイムが必要になると言うと、ちょっと嫌な顔されることがあるかもしれません。そんなとき、実行ファイル一つだと、受け渡しが楽で助かります。
しかも、macOSを使いながらも、Windowsで動く実行ファイルも作成できるのです。とにかくGo言語の良いところは、作ったツールの配布が楽という点です。
ライブラリのインストール
Go言語のExcelファイル読み書きライブラリは、いろいろあります。多機能でいろいろできるのが、『Excelize』というライブラリです。他に『xlsx』と『excl』というライブラリがあり、Excelファイルの読み書き程度ならば問題なくできます。とは言え、シートのコピーなど便利な機能がなく、自分で作らないといけません。
今回は、多機能なExcelizeを使ってプログラムを作ってみます。こちらに日本語マニュアルもあります。
-
Execlizeの日本語マニュアル
まずは、ライブラリをインストールしましょう。コマンドライン(WindowsならPowerShell、macOSならターミナル.app)を起動して、以下のコマンドを実行します。
go get github.com/360EntSecGroup-Skylar/excelize
なお、原稿執筆陣点のバージョンは、v2.3.0でした。go getコマンドを実行するには、Gitのインストールが必要です。Windowsでは、以下のURLからGitをインストールしてください。
Git
[URL] https://gitforwindows.org/
macOSの場合、パッケージ管理ツールのHomebrewを利用してインストールできます。
brew install git
Excelファイルの一番簡単な読み書き
それでは、一番簡単に読み書きをしてみましょう。最初に、シートのC2に「こんにちは」と書き込んでみます。
package main
import "github.com/360EntSecGroup-Skylar/excelize"
func main() {
// 新規ファイルを作成 --- (*1)
f := excelize.NewFile()
// 新規シートを追加 --- (*2)
index := f.NewSheet("Sheet2")
// セルに値をセット --- (*3)
f.SetCellValue("Sheet2", "C2", "こんにちは")
// アクティブシートを変更 --- (*4)
f.SetActiveSheet(index)
// ファイルに保存 --- (*5)
f.SaveAs("hello.xlsx")
}
上記プログラムを「hello_write.go」という名前で保存します。そして、コマンドラインから実行してみましょう。以下のコマンドを実行すると、hello.xlsxというファイルが作成されます。
go run hello_write.go
プログラムを確認してみましょう。(*1)では新規ブックを作成し、シートを作成します。(*2)では新規シートを追加します。そして、(*3)ではSheet2のセルC2に「こんにちは」と値を設定します。(*4)ではアクティブなシートを(*2)で作成した新規シートにSheet2に変更し、(*5)ではファイルに保存します。
そして、以下のプログラムはファイルの読み込み処理を記述したものですが、読み込みの方が簡単です。プログラムを実行すると、先ほど作成した「hello.xlsx」を読み込んで、Sheet2のC2のセルを読み出して表示します。
package main
import "github.com/360EntSecGroup-Skylar/excelize"
func main() {
// ファイルを読み込み
f, _ := excelize.OpenFile("hello.xlsx")
// セルの値を読み出して表示
c, _ := f.GetCellValue("Sheet2", "C2")
println(c)
}
プログラムを実行するには、以下のコマンドを実行します。Sheet2のセルC2の値を読み出して「こんにちは」と表示されます。
go run hello_read.go
ビンゴシートを100枚作成する
次に、100人分のビンゴシートを作成してみます。まず、Excelで以下のようなテンプレートを作成します。
そして、プログラムを実行すると、100回テンプレートを複製して、そこに1から75までのランダムな値を書き込むというものです。
これは、請求書や領収書の自動作成など、テンプレートとして作成したExcelファイルを元にして、新規Excelファイルを作成するという、Excelでよくある処理の典型です。
ここで使うテンプレートとなるExcelファイルを「bingo-template.xlsx」という名前で用意します。こちらのWebサイトからダウンロードできるようにしています。
それでは、ビンゴシートを作成してみましょう。以下のプログラムを「make_bingo.go」という名前で保存します。
package main
import (
"github.com/360EntSecGroup-Skylar/excelize"
"math/rand"
"strconv"
)
func main() {
// ファイルを読み込み --- (*1)
f, _ := excelize.OpenFile("bingo-template.xlsx")
// 100回ビンゴシートを作る --- (*2)
for i := 1; i <= 100; i++ {
sname := "bingo" + strconv.Itoa(i)
index := f.NewSheet(sname)
f.CopySheet(0, index)
makeSheet(f, sname)
}
// テンプレートシートを削除
f.DeleteSheet("template")
// 保存 --- (*3)
f.SaveAs("bingo.xlsx")
}
func makeSheet(f *excelize.File, sname string) {
// 1から75までのスライスを作成
a := []int{}
for i := 1; i <= 75; i++ {
a = append(a, i)
}
// スライスをシャッフル
for i := 74; i >= 0; i-- {
j := rand.Intn(i + 1)
a[i], a[j] = a[j], a[i]
}
// シートに書き込む
for i := 0; i < 25; i++ {
y := i/5 + 2
x := i%5 + 1
cn, _ := excelize.ColumnNumberToName(x)
cn += strconv.Itoa(y)
if cn == "C4" {
continue
}
f.SetCellValue(sname, cn, a[i])
}
}
プログラムを実行してみましょう。プログラムを実行すると、bingo.xlsxというファイルが生成されます。Excelで開いて見ると100枚のビンゴシートが作成されています。
go run make_bingo.go
もし、実行ファイルにコンパイルしたい場合には、以下のコマンドを実行します。
go build make_bingo.go
作成された実行ファイルと「bingo-template.xlsx」を配布すれば、Goをインストールしていない環境でもプログラムを動かすことができます。
まとめ
以上、簡単にGo言語でExcelファイルを読み書きする方法について紹介しました。Excelizeを使うとセルの読み書きだけでなく書式設定したり、シートのコピーや削除など、様々な処理を行うことができます。マニュアルも日本語化されていますし、気軽に使えます。試してみてください。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ、2010年 OSS貢献者章受賞。技術書も多く執筆している。