いろいろ備忘録日記

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

Goメモ-292 (Excelの各シートの内容を画像にして出力)

類似記事

概要

小ネタ。

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

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

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

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

サンプル

サンプルとして、Excelの各シートの内容を画像にして出力しています。

やっていることは、Excelでデータが入っている領域を選択して「図としてコピー」をクリックしたものと同じことですね。

サンプルなので、対象のExcelファイルはソースコード内にハードコートしています。利用される際は適時変更してご利用ください(利用する人はいないと思いますが)

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

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

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

github.com

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

テスト用のExcelファイルには、helloworld1 ってシート名で以下の様にデータを設定しています。

2つ目のシートは、helloworld2 ってシート名で以下の様にデータを設定しています。

package main

import (
    "bufio"
    "fmt"
    "github.com/devlights/goxcel"
    "github.com/devlights/goxcel/constants"
    "os"
    "path/filepath"
)

func main() {
    dir, err := os.Getwd()
    if err != nil {
        panic(err)
    }

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

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

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

    wbs := excel.MustWorkbooks()
    wb, wbRelease := wbs.MustOpen(filepath.Join(curdir, "testdata", "TestData.xlsx"))
    defer wbRelease()

    wss := wb.MustWorkSheets()
    _, err := wss.Walk(func(ws *goxcel.Worksheet, index int) error {
        name, err := ws.Name()
        if err != nil {
            return err
        }

        usedRange, err := ws.UsedRange()
        if err != nil {
            return err
        }

        file, err := os.Create(filepath.Join(curdir, fmt.Sprintf("%s.png", name)))
        if err != nil {
            return err
        }
        defer file.Close()

        bufW := bufio.NewWriter(file)
        err = usedRange.CopyPictureToFile(bufW, constants.XlScreen, constants.XlBitmap)
        if err != nil {
            return err
        }
        defer bufW.Flush()

        return nil
    })

    if err != nil {
        return err
    }

    return nil
}

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

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

helloworld1

helloworld2

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

$ cd goxcel

$ cd examples/range_copy_picture_allsheets

$ go run main.go

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

参考情報

github.com

Goのおすすめ書籍

Go言語による並行処理

Go言語による並行処理

Amazon


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

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