作成背景
Goの勉強としてテキストファイルからExcelファイルを作成し、そのデータを元にグラフを描画してみようと思ったので、記録のため、今回の記事を書きました。
準備
テスト用テキストファイル
test.txt
商品名 値段(円)
プロテイン 3000
また、GoでExcelファイルを扱うために以下のライブラリを使用しました。今回、Go Modulesを利用したので、
go get github.com/xuri/excelize/v2
※詳しくはこちら
実装
main.go
package main
import (
"bufio"
"fmt"
"log"
"os"
"strconv"
"strings"
"github.com/xuri/excelize/v2"
)
func main() {
// 読み込むテキストファイルと書き出すExcelファイルの名前を決める
var import_file, out_file string
fmt.Scanf("%s %s", &import_file, &out_file)
log.Printf("File Name: %s", import_file)
file, err := os.Open(import_file)
if err != nil {
log.Fatal(err)
}
defer file.Close()
// 打ち込んだExcelファイルが存在しなければ新しく作成
var ef *excelize.File
if _, err := os.Stat(out_file); err != nil {
ef = excelize.NewFile()
defer func() {
if err := ef.Close(); err != nil {
log.Println(err)
}
}()
} else {
ef, _ = excelize.OpenFile("./" + out_file)
}
// テキストファイルを一行ごと読み込む
var txtSlice []string
scanner := bufio.NewScanner(file)
rowNum := 2
for scanner.Scan() {
// 空白ごとに区切り、セルに一つずつ入れる
txtSlice = strings.Split(scanner.Text(), " ")
for i, v := range txtSlice {
//シートに記述
if i == 0 {
ef.SetCellValue("Sheet1", "A"+strconv.Itoa(rowNum), v)
} else if i == 1 {
ef.SetCellValue("Sheet1", "B"+strconv.Itoa(rowNum), v)
}
}
if ef.SaveAs(out_file); err != nil {
log.Fatal(err)
}
rowNum++
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}
実装の手順としては以下のようになっています。
- 読み込むテキストファイル名と作成するExcelファイル名を入力
- テキストファイルのデータを一行ごと読み込み、さらに空白で区切ってスライスに代入。
- スライスの中身を一つずつセルに挿入する
あとがき
今回は2列のみのデータを用いたので力技で作成しましたが、数が多かったりデータの数がわからない場合に対応できないため、今後改善する必要があります。
何か良い案があれば是非教えていただきたいです。