いろいろ備忘録日記

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

Goメモ-468 (docファイルをdocxファイルに変換する)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。

実務で過去のプロジェクトのドキュメントとかを見つけると拡張子が doc となっているものも沢山あります。

数が少なければ手動で docx に変換すれば良いのですが、10個を超えてくると人間がやる作業では無くなりますね。

変換するプログラムなんて、vbaでもpythonでも何でも良いのですが、ついでなのでGoでやってみました。

てことで、Goで変換するプログラムをちょっと書いたので、メモ代わりにここに置いておきます。

サンプル

package main

import (
    "flag"
    "log"
    "os"
    "path/filepath"
    "strings"

    "github.com/devlights/gord"
    "github.com/devlights/gord/constants"
)

type (
    Args struct {
        dir        string
        rmOriginal bool
    }
)

var (
    args Args
)

func init() {
    flag.StringVar(&args.dir, "dir", ".", "directory")
    flag.BoolVar(&args.rmOriginal, "rm", false, "remove original file")
}

func main() {
    log.SetFlags(0)
    flag.Parse()

    if args.dir == "" {
        args.dir = "."
    }

    if err := run(); err != nil {
        log.Fatal(err)
    }
}

func run() error {
    quit, _ := gord.InitGord()
    defer quit()

    word, wordRelease, _ := gord.NewGord()
    defer wordRelease()

    _ = word.Silent(false)

    docs, err := word.Documents()
    if err != nil {
        return err
    }

    err = filepath.WalkDir(args.dir, func(path string, info os.DirEntry, err error) error {
        if err != nil {
            return err
        }

        if info.IsDir() {
            return nil
        }

        if !strings.HasSuffix(info.Name(), ".doc") {
            return nil
        }

        if err := toDocx(docs, path); err != nil {
            return err
        }

        if args.rmOriginal {
            return os.Remove(path)
        }

        return nil
    })

    return err
}

func toDocx(docs *gord.Documents, p string) error {
    doc, docRelease, err := docs.Open(abs(p))
    if err != nil {
        return err
    }
    defer docRelease()

    err = doc.SaveAsWithFileFormat(abs(strings.ReplaceAll(p, "doc", "docx")), constants.WdSaveFormatDocumentDefault)
    if err != nil {
        return err
    }

    return nil
}

func abs(p string) string {
    v, _ := filepath.Abs(p)
    return v
}

以下のようにして利用します。

$ go build -o doc2docx.exe .
$ ./doc2docx.exe -rm -dir /path/to/documents

指定したディレクトリ配下の doc ファイルを docx ファイルに変換します。

参考情報

GitHub - devlights/gord: Gord is a library to operate MS Word using go-ole library.

Goのおすすめ書籍


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

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