いろいろ備忘録日記

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

Goメモ-291 (Excelの特定範囲のRangeを画像にして出力)

類似記事

概要

小ネタ。

仕事によっては、たまにExcelの表を画像にして別の資料に貼り付けたりする場面もあったりしますよね。。。

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

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

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

サンプル

サンプルとして、特定範囲に適当な値をセットした領域を画像にして出力しています。

やっていることは、Excelで「図としてコピー」をクリックしたものと同じことですね。

出力ファイルは、pngファイルとなります。

OLE経由でRange.CopyPictureを呼び出した後に、クリップボード経由で画像を出力しています。

Goでクリップボード操作するライブラリは

github.com

を使いました。とても使いやすいライブラリです。感謝。

package main

import (
    "fmt"
    "github.com/devlights/goxcel"
    "github.com/devlights/goxcel/constants"
    "github.com/skanehira/clipboard-image/v2"
    "io"
    "os"
)

func main() {
    if err := run(); err != nil {
        panic(err)
    }
}

//goland:noinspection GoUnhandledErrorResult
func run() error {
    quit := goxcel.MustInitGoxcel()
    defer quit()

    excel, release := goxcel.MustNewGoxcel()
    defer release()

    wbs := excel.MustWorkbooks()
    wb, wbr := wbs.MustAdd()
    defer wbr()

    ws := wb.MustSheets(1)

    rows := []int{1, 2, 3, 4, 5, 10, 20, 30}
    for _, row := range rows {
        cols := []int{1, 2, 3, 4, 5}
        for _, col := range cols {
            c, _ := ws.Cells(row, col)
            c.MustSetValue(fmt.Sprintf("%v,%v", row, col))
        }
    }

    usedRange, _ := ws.UsedRange()
    _ = usedRange.Select()

    err := usedRange.CopyPicture(constants.XlScreen, constants.XlBitmap)
    if err != nil {
        return err
    }

    // Read image-binary from Clipboard
    // Thanks: https://github.com/skanehira/clipboard-image
    cr, err := clipboard.Read()
    if err != nil {
        return err
    }

    // Write to file
    file, err := os.Create("./image.png")
    if err != nil {
        return err
    }
    defer file.Close()

    if _, err := io.Copy(file, cr); err != nil {
        return err
    }

    return nil
}

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

こんな感じの画像が出力されます。

goxcel-range-copy-picture-01

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

$ cd goxcel

$ cd examples/range_copy_picture

$ go run main.go

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

参考情報

github.com

Goのおすすめ書籍

Go言語による並行処理

Go言語による並行処理

Amazon


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

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