いろいろ備忘録日記

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

Goメモ-298 (Excelの各シートへのリンクをTOCシートとして追加)

類似記事

概要

小ネタ。

仕事によっては、たまに1ブックに大量のシートがあるシートを扱ったりします。マスタデータをExcelで管理しているようなプロジェクトとか。。

んで、なぜかこのようなブックって、大量にシートがあるのに目次シートみたいなのが無い場合があります。。目次用のシートが無いと目的のシートを探すだけでも一苦労です。

とかいって、手作業で作ると日が暮れます。というか、手でチマチマ作る精神力がありませんw

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

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

サンプル

サンプルとして、先頭にTOC用のシートを挿入して、各シートのハイパーリンクを挿入するようにしています。

package main

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

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

func run() error {
    //
    // Initialize Goxcel
    //
    quit := goxcel.MustInitGoxcel()
    defer quit()

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

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

    //
    // Add 20 worksheet
    //
    const WSCOUNT = 20
    wss := wb.MustWorkSheets()
    wsList := make([]*goxcel.Worksheet, 0, 20)

    for i := 0; i < WSCOUNT; i++ {
        ws, _ := wss.AddLast()
        name, _ := ws.Name()

        cell := ws.MustCells(1, 1)
        cell.MustSetValue(name)

        wsList = append(wsList, ws)
    }

    //
    // Add TOC sheet
    //
    firstSheet, _ := wss.Item(1)
    tocSheet, _ := wss.AddBefore(firstSheet)
    _ = tocSheet.SetName("TOC")

    tocCell := tocSheet.MustCells(1, 1)
    tocCell.MustSetValue("Table Of Contents")

    //
    // Make TOC
    //
    for i, ws := range wsList {
        row := i + 2

        hl, _ := tocSheet.HyperLinks()
        ra, _ := tocSheet.Range(row, 1, row, 1)

        wsName, _ := ws.Name()
        addr := ""
        subAddr := fmt.Sprintf("'%s'!A1", wsName)
        screenTip := ""

        _ = hl.Add(ra, addr, subAddr, screenTip, wsName)
    }

    //
    // Write Workbook
    //
    abs, _ := filepath.Abs(".")
    fpath := filepath.Join(abs, "result.xlsx")

    _ = wb.SaveAs(fpath)

    return nil
}

実行すると、アプリと同じ場所に result.xlsx ってExcelファイルが出力されて以下のようになります。

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

$ cd goxcel

$ cd examples/generate_toc

$ go run main.go

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

参考情報

github.com

Goのおすすめ書籍

Go言語による並行処理

Go言語による並行処理

Amazon


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

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