いろいろ備忘録日記

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

Goメモ-124 (画像ファイルをExcelに挿入する)

概要

小ネタ。

仕事によっては、試験のエビデンスを画像で取得しておいて、それを後からExcelに一個一個貼り付けたりするような場面もあったりしますよね。。。。

対象のファイルが5個とかそれくらいなら、まだ手でやってもいいと思いますが、フォルダの下に数十・・・数百とかファイルがあったら人間がやる作業じゃなくなります。。。。

こういうのはコンピュータさんにしてもらうのが一番です。

てことで、GoでちょこっとExcel操作するプログラム作ったので、ついでにサンプルをメモメモ。

サンプル

CUIで使うコマンドになっていて、実行時にExcelに挿入したいフォルダを指定してもらうようにしています。

手抜きしてて、pngファイル限定です。

package main

import (
    "flag"
    "image"
    _ "image/png"
    "io/ioutil"
    "log"
    "os"
    "path/filepath"
    "strings"

    "github.com/devlights/goxcel"
)

var (
    srcdir  string
    workdir string
    outfile string
    debug   bool
)

var (
    appLog, errLog, dbgLog *log.Logger
)

func init() {
    wd, _ := os.Getwd()
    ab, _ := filepath.Abs(wd)
    workdir = ab

    flag.StringVar(&srcdir, "srcdir", "", "The directory where the image files are located (Required)")
    flag.StringVar(&outfile, "out", filepath.Join(workdir, "result.xlsx"), "output file name")
    flag.BoolVar(&debug, "debug", false, "enable debug mode")
}

func main() {
    flag.Parse()

    appLog, errLog, dbgLog = log.New(os.Stdout, "", 0), log.New(os.Stderr, "", 0), log.New(os.Stdout, "", 0)
    if !debug {
        dbgLog.SetOutput(ioutil.Discard)
    }

    if srcdir == "" {
        errLog.Println("xlsimgpaste.exe -srcdir path-to-img-files-directory")
        flag.PrintDefaults()
        return
    }

    srcdir, _ = filepath.Abs(srcdir)
    outfile, _ = filepath.Abs(outfile)

    os.Exit(run())
}

func run() int {
    dbgLog.Println(workdir)

    f, _ := goxcel.InitGoxcel()
    defer f()

    g, r, _ := goxcel.NewGoxcel()
    defer r()

    _ = g.Silent(false)

    wbs, _ := g.Workbooks()

    wb, wbr, _ := wbs.Add()
    defer wbr()

    ws, _ := wb.Sheets(1)
    shapes, _ := ws.Shapes()

    left, top := 10, 10
    err := filepath.Walk(srcdir, func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }

        if info.IsDir() {
            return nil
        }

        if !strings.HasSuffix(path, "png") {
            return nil
        }

        dbgLog.Println(path)
        width, height, _ := getImgSize(path)

        err = shapes.AddPicture(path, left, top, width, height)
        if err != nil {
            errLog.Println(err)
            return err
        }

        top += height + 10

        return nil
    })

    if err != nil {
        errLog.Println(err)
        return 1
    }

    _ = wb.SaveAs(outfile)

    return 0
}

func getImgSize(filepath string) (width, height int, err error) {
    f, err := os.Open(filepath)
    if err != nil {
        return 0, 0, err
    }

    im, _, err := image.DecodeConfig(f)
    if err != nil {
        return 0, 0, err
    }

    return im.Width, im.Height, nil
}

goxcel/paste_picture.go at master · devlights/goxcel · GitHub

実行すると、デフォルトだとコマンドと同じディレクトリに result.xlsx ってファイルが出来ます。

$ git clone https://github.com/devlights/goxcel.git

$ cd goxcel

$ cd examples/paste_picture

$ go run . -srcdir xxx

go-oleを内部で使っているので windows 限定です。


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

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

devlights.github.io

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

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

github.com

github.com

github.com