まえがき
の続きです。。。ご覧なっていない場合は先に上を御覧くださいませー。
概要
仕事上、大抵の人はWindowsで作業してて、大抵の人はExcelで資料とかいっぱい作ったりしてますよね。。。
で、最終段階になって、「このExcelファイルたちの各シートが複数ページになってて、印刷するとどのページか分からなくなるんだよねー。ページ区切り毎にタイトルっぽいの入れてほしいなー。あ、でもヘッダとかにされると、いちいちヘッダを表示しないといけないから面倒なのでやめてね☆☆」とかよくあったりしますよね。。。(実体験
10シートくらいなら手でやってもいいんですが、数百シートとなってると、、、、人間がやる作業じゃなくなります。。。(実体験
てことで、こんな作業はプログラムにやってもらいましょう。
Pythonの方は、win32comライブラリを使っているので、Goの方はgo-oleという素晴らしいライブラリ使わせてもらっています。
go-ole、めっちゃ便利ですが、comオブジェクトの開放とかが少しだけ面倒なので、私の場合は自前でラッパーライブラリ作って使わせてもらっています。
GitHub - devlights/goxcel: Goxcel is a library to operate Excel using go-ole library.
普段はPythonでちゃちゃって作ってしまって、後からGoの勉強を兼ねて作っているんですが
今回はいきなりGoで書いてしまったので、Python版がありません。
サンプル
package main import ( "flag" "fmt" "github.com/devlights/goxcel" "log" "os" ) func init() { log.SetFlags(log.Flags() &^ log.LstdFlags) } func main() { os.Exit(run()) } func run() int { var ( targetFilePath string ) flag.StringVar(&targetFilePath, "f", "", "対象Excelファイルの絶対パス (必須)") flag.Parse() if targetFilePath == "" { flag.Usage() return 1 } if _, err := os.Stat(targetFilePath); err != nil { log.Println(err) return 2 } g, r, _ := goxcel.NewGoxcel() defer r() wbs, _ := g.Workbooks() wb, wbr, err := wbs.Open(targetFilePath) if err != nil { log.Println(err) return 3 } defer wbr() wss, _ := wb.WorkSheets() _, err = wss.Walk(func(ws *goxcel.Worksheet, index int) error { hpbs, _ := ws.HPageBreaks() _, err = hpbs.Walk(func(hpb *goxcel.HPageBreak, index int) error { location, err := hpb.Location() if err != nil { return err } value := fmt.Sprintf("Page.%d", index+1) err = location.SetValue(value) if err != nil { return err } return nil }) if err != nil { return err } return nil }) if err != nil { log.Println(err) return 4 } _ = wb.Save() return 0 }
goxcel/pagebreaks.go at master · devlights/goxcel · GitHub
実行するとExcelが起動してシートのページ区切り毎にPage.XXって入れていってくれます。
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場