いろいろ備忘録日記

主に .NET とか Go とか Python絡みのメモを公開しています。

Goメモ-57 (Excelシートの画像の上にNo.XXってナンバリングしていく)

まえがき

devlights.hatenablog.com

devlights.hatenablog.com

devlights.hatenablog.com

devlights.hatenablog.com

devlights.hatenablog.com

の続きです。。。ご覧なっていない場合は先に上を御覧くださいませー。

概要

仕事上、大抵の人はWindowsで作業してて、大抵の人はExcelで資料とかいっぱい作ったりしてますよね。。。

で、最終段階になって、「このExcelファイルたちの各シートに画像が何枚も貼ってあるんだけど、印刷してみたらどれが何番目の画像なのか分からなくなるんだよねー。上から順に連番とか振ってほしいなー。よろ☆☆」とかよくあったりしますよね。。。(実体験

10シートくらいなら手でやってもいいんですが、数百シートとなってると、、、、人間がやる作業じゃなくなります。。。(実体験

てことで、こんな作業はプログラムにやってもらいましょう。

Pythonの方は、win32comライブラリを使っているので、Goの方はgo-oleという素晴らしいライブラリ使わせてもらっています。

github.com

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って振っていってくれます。


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com