GO言語でExcelを読み書きする

なぜgolang(GO言語)かというと「pythonは遅く(速く実行させる方法もあります)golangは速い」

そして「コンパイル型の言語であり、生成されたネイティブコードはそれを実行する為に何らかの実行環境を用意する必要がない」

さらに「クロスコンパイル言語であり、MacOSでWindowsやLinuxの実行ファイルを生成できる。またその逆も可能である」

ということが魅力だからです。
場面によっては、Pythonではなくgolangで作る必要があるかと思います。

golangの環境構築は様々なサイトに情報があります。
また、Excelを読み書きする為のパッケージはxuriさん公開されています。

読み込むExcel
VisualStudioCodeでgolang

ということで、CSVファイルを読み込んで既存のExcelファイルに放り込む簡単なプログラムを作成してみました。

package main

import (
	"fmt"
	"encoding/csv"
	"os"
	"log"
	"io"
	"strconv"

	"github.com/360EntSecGroup-Skylar/excelize"
	"gopkg.in/alecthomas/kingpin.v2"
)

var (
	csvfile   = kingpin.Arg("csvfile", "CSV File Name").Required().String()
	excelfile = kingpin.Arg("excelfile", "Excel File Name").Required().String()
	sheetname = kingpin.Arg("sheet", "Excel Sheet Name").Required().String()
	address = kingpin.Arg("address", "Address ex) A1").Default("A1").String()
)

func main() {

	// コマンドラインパラメータを受け取る
	kingpin.Parse()
	fmt.Println("CSV File Name    :", *csvfile)
	fmt.Println("Excel File Name  :", *excelfile)
	fmt.Println("Excel Sheet Name :", *sheetname)
	fmt.Println("Address          :", *address)

	// CSVファイルオープン
	fcsv, err := os.Open(*csvfile)
	if err != nil {
		log.Fatal(err)
	}
	// 貼り付ける先頭アドレスの数値を取得
	col, row, err := excelize.CellNameToCoordinates(*address)

	//Excelファイルオープン
	//エラーの場合は新規作成(ここは要注意)
	//他のプロセスがファイルにアクセスしていてもエラーになる?
	fexcel, err := excelize.OpenFile(*excelfile)
	if err != nil {
		fexcel = excelize.NewFile()
		fmt.Println(err)
		fmt.Println("Created a new book  :", *excelfile)
	}

	// Sheetがなければ作成する
	index := fexcel.GetSheetIndex(*sheetname)
	if index == -1 {
		m := fexcel.NewSheet(*sheetname)
		if m < 0 {
			fmt.Println("sheet create err :", *sheetname)
		}
		fmt.Println("Created a new sheet :", *sheetname)
	}

	// CSVの読み込み
	r := csv.NewReader(fcsv)
	rowcount := 0
	for {
		record, err := r.Read()
		if err == io.EOF {
			break
		}
		if err != nil {
			log.Fatal(err)
		}
		// CSVの各行毎にExcelのSheetに出力
		for i, v := range record {
			cellName, err := excelize.CoordinatesToCellName(col + i, row + rowcount)
			if err != nil {
				log.Fatal(err)
			}
			val, err := strconv.ParseFloat(v, 64)
			if err != nil {
				fexcel.SetCellValue(*sheetname, cellName, v)
			} else {
				fexcel.SetCellValue(*sheetname, cellName, val)
			}
		}
		rowcount += 1
	}
	err = fexcel.SaveAs(*excelfile)
	if err != nil {
		log.Fatal(err)
	}
}
Book.xlsx

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA