1. Qiita
  2. 投稿
  3. Go

Go言語でExcel操作ライブラリを書いてみた

  • 28
    いいね
  • 1
    コメント

この記事はGo (その3) Advent Calendar 2016 13日目の記事です。

Go言語でExcel操作ライブラリを書いてみた

excl ライブラリ

なぜそんなもの書いたのか

Go言語にはExcel作成用のライブラリ xlsx がすでに存在します。
xlsxライブラリは強力で、普通に使用する場合このライブラリが一番だと思います。
ただ、xlsxライブラリを調査していると今回作成するものの仕様に耐えられない部分がありました。

xlsxライブラリの利点欠点

xlsxライブラリにできること

・Excelファイルの書き込み・読み込み・新規作成
・セルの書式設定
・Excelファイルを解凍せずに扱える
・OpenXMLの仕様に基づいた開発

xlsxライブラリの問題

・既存のExcelファイルを使用するといろいろなものが消える
 ・チャートが消える
 ・画像が消える
 ・図形が消える
・マクロの存在するファイルの場合はマクロも消える
・メモリ使用量が異常に高くなる
 ・数十メガバイトのデータでも使用メモリがギガを超える

exclライブラリってなに?

既存のExcelファイルにデータを追加することを目的に作成されたライブラリ
可能な限りメモリに持たずにファイルに書き出す

使い方

main.go
import(
  "github.com/loadoff/excl"
)

func main(){
  // Excelファイルを読み込み
  w, _ := excl.Open("path/to/read.xlsx")
  // シートを開く
  s, _ := w.OpenSheet("Sheet1")
  // 一行目を取得
  r := s.GetRow(1)
  // 1列目のセルを取得
  c := r.GetCell(1)
  // セルに10を出力
  c.SetNumber("10")
  // 2列目のセルにABCDEという文字列を出力
  c = r.SetString("ABCDE", 2)
  // シートを閉じる
  s.Close()
  // 保存
  w.Save("path/to/new.xlsx")
)

新規にファイルを作成する場合

w, _ := excl.Create()
s, _ := w.OpenSheet("Sheet1")
s.Close()
w.Save("path/to/new.xlsx")

セルの書式を設定する場合

w, _ := excl.Open("path/to/read.xlsx")
s, _ := w.OpenSheet("Sheet1")
r := s.GetRow(1)
c := r.GetCell(1)
c.SetNumber("10000.00")
// 数値のフォーマットを設定する
c.SetNumFmt("#,##0.0")
// フォントの設定
c.SetFont(excl.Font{Size: 12, Color: "FF00FFFF", Bold: true, Italic: false,Underline: false})
// 背景色の設定
c.SetBackgroundColor("FFFF00FF")
// 罫線の設定
c.SetBorder(excl.Border{
    Left:   &excl.BorderSetting{Style: "thin", Color: "FFFFFF00"},
    Right:  &excl.BorderSetting{Style: "hair"},
    Top:    &excl.BorderSetting{Style: "dashDotDot"},
    Bottom: nil,
})
s.Close()
w.Save("path/to/new.xlsx")

グリッド線の表示・非表示

w, _ := excl.Open("path/to/read.xlsx")
s, _ := w.OpenSheet("Sheet1")
// シートのグリッド線を表示
s.ShowGridlines(true)
// シートのグリッド線を非表示
s.ShowGridlines(false)
s.Close()
w.Save("path/to/new.xlsx")

exclライブラリの特徴

・既存のExcelファイルを使用する
 ・もとの設定は消えないことを前提に開発を行った
・メモリ使用を抑える
・マクロファイルも使用できる

問題点

・新規作成(空のExcelファイルを用意する必要がある)
2017年01月のコミットで作成できるようになりました。
・Excelファイルが展開される

TODO

・セルの書式を自由に設定する
・英語化

結論

新規にExcelファイルを作成し、データ量が多くない場合は xlsx ライブラリを使用するべきですが、テンプレート用のExcelファイルが存在する場合は今回作成したライブラリが有用かと思います。

今更OpenXMLの仕様についてかなり調べましたが、OpenXMLは複雑だがよくできているなと感じました。
また、Go言語のxmlライブラリを使用してxmlns属性が存在するファイルをいじると
予想していない動作をします。
xmlns:_xmlns="xmlns" みたいな形になってしまい、まったく同じファイルを出力しなおすのに手間取りました。
ここらへんで議論されていますが、1.8か1.9で修正予定みたいです。
参考

この投稿は Go (その3) Advent Calendar 201613日目の記事です。
Comments Loading...