なぜgolang(GO言語)かというと「pythonは遅く(速く実行させる方法もあります)golangは速い」
そして「コンパイル型の言語であり、生成されたネイティブコードはそれを実行する為に何らかの実行環境を用意する必要がない」
さらに「クロスコンパイル言語であり、MacOSでWindowsやLinuxの実行ファイルを生成できる。またその逆も可能である」
ということが魅力だからです。
場面によっては、Pythonではなくgolangで作る必要があるかと思います。
golangの環境構築は様々なサイトに情報があります。
また、Excelを読み書きする為のパッケージはxuriさんが公開されています。


ということで、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)
}
}
