まえがき
の続きです。。。ご覧なっていない場合は先に上を御覧くださいませー。
概要
仕事上、大抵の人は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" "sort" ) 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 { ss, _ := ws.Shapes() shapeCount, _ := ss.Count() shapes := make([]*goxcel.Shape, 0, shapeCount) for i := 1; i <= int(shapeCount); i++ { s, _ := ss.Item(i) shapes = append(shapes, s) } sort.Slice(shapes, func(i, j int) bool { lRange, _ := shapes[i].TopLeftCell() rRange, _ := shapes[j].TopLeftCell() lRow, _ := lRange.Row() rRow, _ := rRange.Row() return lRow < rRow }) for i, s := range shapes { topLeft, _ := s.TopLeftCell() c, _ := topLeft.Column() r, _ := topLeft.Row() col := int(c) row := int(r - 1) if row <= 0 { row = 1 } cell, _ := ws.Cells(row, col) _ = cell.SetValue(fmt.Sprintf("No.%02d", i+1)) } return nil }) if err != nil { log.Println(err) return 4 } _ = wb.Save() return 0 }
goxcel/shapes_numbering.go at master · devlights/goxcel · GitHub
実行するとExcelが起動してシートの画像毎にNo.XXって振っていってくれます。
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場