いろいろ備忘録日記

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

Goメモ-113 (tealeg/xlsx にて1セルに複数行テキストを設定した場合のメモ)

概要

たまに使った時に忘れているので、ここにメモメモ。

個人的に、Excel処理する場合は tealeg/xlsx を使わせてもらっています。使いやすいので重宝しています。

github.com

んで、1つのセルの中に複数行のテキストを設定した場合、そのままだと出力後のExcelファイルを見ると一行で表示された状態になります。

こんな感じですね。

f:id:gsf_zero1:20201026180242p:plain

このセルをダブルクリックするか、F2とかで編集状態にしてエンター押下すると

f:id:gsf_zero1:20201026180349p:plain

ってなるんですが、最初から後者の状態で出ていてほしいですよね。。。

これは、セルの設定で「折り返して全体を表示する」がONになっていないからです。

なので、コード内で該当のセルオプションをONにしてやればオッケイ。

折返し設定は style.Alighment.WrapText というフィールドになっています。これを true にすればオッケイ。

サンプル

package main

import (
    "log"
    "os"
    "strings"
    "time"

    "github.com/tealeg/xlsx/v3"
)

var (
    appLog *log.Logger
    errLog *log.Logger
)

func init() {
    appLog = log.New(os.Stdout, "", 0)
    errLog = log.New(os.Stderr, "", 0)
}

func main() {
    defer func() func() {
        appLog.Println("[START]")
        start := time.Now()
        return func() {
            appLog.Printf("[DONE ] out.xlsx (%v)", time.Since(start))
        }
    }()()

    // REF: https://github.com/tealeg/xlsx/blob/master/tutorial/tutorial.adoc
    excel := xlsx.NewFile()

    sheet, err := excel.AddSheet("test1")
    if err != nil {
        errLog.Fatal(err)
    }

    withoutWrapText(sheet)
    withWrapText(sheet)

    err = excel.Save("out.xlsx")
    if err != nil {
        errLog.Fatal(err)
    }
}

// withoutWrapText -- WrapText 無し の場合
func withoutWrapText(sheet *xlsx.Sheet) {
    s := strings.Join([]string{"one", "two", "three", "four", "five"}, "\n")
    sheet.AddRow().AddCell().SetString(s)

    appLog.Printf("[WrapText無し]\n%s", s)
}

// withWrapText -- WrapText 有り の場合
func withWrapText(sheet *xlsx.Sheet) {
    s := strings.Join([]string{"one", "two", "three", "four", "five"}, "\n")

    row := sheet.AddRow()
    cell := row.AddCell()
    cell.SetString(s)

    style := cell.GetStyle()
    style.Alignment.WrapText = true
    style.Font.Name = "MS Gothic"
    style.Font.Size = 10.0

    appLog.Printf("[WrapText有り]\n%s", s)
}

実行してみる

出力されたExcelを開くと、以下のようになります。

$ go run main.go
[START]
[WrapText無し]
one
two
three
four
five
[WrapText有り]
one
two
three
four
five
[DONE ] out.xlsx (15.027ms)

f:id:gsf_zero1:20201026180822p:plain

最初のセルは、設定をしていないので一行で表示されているようになっています。

次のセルは、セルのスタイルで WrapText を有効にしたので、ちゃんと表示されるようになっています。

参考情報

xlsx/tutorial.adoc at master · tealeg/xlsx · GitHub

おすすめ書籍

自分が読んだGo関連の本で、いい本って感じたものです。

Go言語による並行処理

Go言語による並行処理

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)

  • 作者:松尾 愛賀
  • 発売日: 2016/04/15
  • メディア: 単行本(ソフトカバー)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)


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

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

devlights.github.io

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

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

github.com

github.com

github.com