いろいろ備忘録日記

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

Goメモ-47 (Excelの特定シートのフッターの値を調整)

概要

以前にPython絡みの記事で

devlights.hatenablog.com

というのをアップしたことがあって、それと同じことをGoでもやってみたいと思ってちょっと作ってみました。

Pythonの方がやっぱり楽にかけるのですが、Goで作ったらネイティブなバイナリが作れるので配布とかが楽です。

(Pythonでもpyinstallerとか使えば出来るんですけどね)

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

github.com

go-ole、めっちゃ便利ですが、comオブジェクトの開放とかが少しだけめんどくさいので、私の場合は自前でラッパーライブラリ作って使わせてもらっています。

GitHub - devlights/goxcel: goxcel is a library to operate Excel made in Golang.

サンプル

package main

import (
    "flag"
    "fmt"
    "github.com/devlights/goxcel"
    "log"
    "os"
    "path/filepath"
    "strings"
)

var (
    targetDirectory string
    sheetPattern    string
    footer          string
)

func main() {
    flag.StringVar(&targetDirectory, "d", "", "対象ディレクトリ (必須)")
    flag.StringVar(&sheetPattern, "p", "", "シート名の条件、指定しない場合は全シートが対象")
    flag.StringVar(&footer, "f", "&P", "フッターに設定する値")
    flag.Parse()

    if targetDirectory == "" {
        flag.Usage()
        os.Exit(2)
    }

    err := filepath.Walk(targetDirectory, walkFiles)
    if err != nil {
        log.Fatal(err)
    }

    os.Exit(0)
}

func walkFiles(path string, info os.FileInfo, err error) error {
    if err != nil {
        return err
    }

    if info.IsDir() {
        return nil
    }

    absPath, err := filepath.Abs(path)
    if err != nil {
        return err
    }

    g, r, err := goxcel.NewGoxcel()
    if err != nil {
        return err
    }

    defer r()

    _ = g.SetDisplayAlerts(false)
    _ = g.SetVisible(true)

    wbs, err := g.Workbooks()
    if err != nil {
        return err
    }

    wb, err := wbs.Open(absPath)
    if err != nil {
        return err
    }

    defer func() {
        _ = wb.SetSaved(true)
        _ = wb.Close()
    }()

    wss, err := wb.WorkSheets()
    if err != nil {
        return err
    }

    errorWs, err := wss.Walk(walkSheets)
    if err != nil {
        errSheetName := ""
        if errorWs != nil {
            errSheetName, _ = errorWs.Name()
        }

        err = fmt.Errorf("%w at sheet[%s]", err, errSheetName)
        return err
    }

    err = wb.Save()
    if err != nil {
        return err
    }

    return nil
}

func walkSheets(ws *goxcel.Worksheet) error {
    err := ws.Activate()
    if err != nil {
        return err
    }

    if sheetPattern != "" {
        name, _ := ws.Name()
        if !strings.Contains(name, sheetPattern) {
            return nil
        }
    }

    ps, err := ws.PageSetup()
    if err != nil {
        return err
    }

    err = ps.SetCenterFooter(footer)
    if err != nil {
        return err
    }

    return nil
}

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

実行するとExcelが起動してシートをバシバシ操作していってくれます。


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

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

devlights.github.io

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

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

github.com

github.com

github.com