いろいろ備忘録日記

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

Goメモ-56 (Excelシートのページ区切りの先頭にメッセージ入れる)

まえがき

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"
)

func init() {
    log.SetFlags(log.Flags() &^ log.LstdFlags)
}

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 {

        hpbs, _ := ws.HPageBreaks()
        _, err = hpbs.Walk(func(hpb *goxcel.HPageBreak, index int) error {
            location, err := hpb.Location()
            if err != nil {
                return err
            }

            value := fmt.Sprintf("Page.%d", index+1)
            err = location.SetValue(value)
            if err != nil {
                return err
            }

            return nil
        })

        if err != nil {
            return err
        }

        return nil
    })

    if err != nil {
        log.Println(err)
        return 4
    }

    _ = wb.Save()

    return 0
}

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

実行するとExcelが起動してシートのページ区切り毎にPage.XXって入れていってくれます。


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

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

devlights.github.io

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

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

github.com

github.com

github.com