Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

この記事は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で修正予定みたいです。
参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした