ZOZOテクノロジーズ #5 Advent Calendar 2019の記事です。
昨日は @saitoryuji さんの「新卒エンジニアがチーム開発でGitHubを使うときに気を付けていること(レビュアー編)」でした。
本記事は過去に書いたGo言語でエクセルデータから情報を読み取るの記事を最新の情報に更新したものです。
はじめに
みなさんは普段業務でエクセルは使っていますか?
自分自身業務で触ることはほとんど無くなってきましたが、業界や現場によっては、昔からのやり方が残っていたり、仕事上のPC環境的に使わなければいけなかったりと、いろいろ事情があると思います。
特にアパレル業界では中国とのやり取りもあり、使う機会が多いみたいです。
その為、人の手で行うには億劫なエクセル作業をサラッと自動化できたらと思い本記事を書きました。
VBAで自動化するのも良いですが、外部サービスとの連携や、運用のしやすさからプログラムで自動化するのも良いのではないかなと思います。
ファイルの読み込み
実行ファイルがあるフォルダの直下にdataフォルダを用意し、入力に使用します。
今回はエクセルの拡張子を2種類読み込んでいます。
// ファイルパスを取得
func getPath() []string {
appPath, _ := os.Getwd()
dataPath := filepath.Join(appPath, "data")
path := filepath.Join(dataPath, "*.xlsx")
f, _ := filepath.Glob(path)
files := f
path = filepath.Join(dataPath, "*.xlsm")
f, _ = filepath.Glob(path)
files = append(files, f...)
return files
}
エクセルファイルの読み込み
// エクセル読み込み
excelFile, err := excel.InputFile(file)
// エクセルエラー
if err != nil {
log.Fatal("excel error exit")
return err
}
シートの読み込み
// 全シート分ルートを回す
for _, sheet := range excelFile.Sheet {
// シートが見つからない
if sheet == nil {
log.Fatal("failur open sheet.", RPASheetKey)
return nil
}
// シート名が該当したら(この場合は含まれていたら)
if strings.Contains(sheet.Name, "シート名") {
// 処理をする
}
}
セルの参照
// すべてのセルを左上から順番に参照する場合
// 行ごとに処理
for _, rowValue := range sheet.Rows {
// 列ごとに処理
for _, colVal := range rowValue.Cells {
println(colVal.Value)
}
}
// 列、行番号を指定してセルを参照する場合
// 行ごとに処理
for rowKey, rowValue := range sheet.Rows {
// 参照したいセルがある列
if rowKey == "任意の行番号" {
// 列ごとに処理
for colKey, colVal := range rowValue.Cells {
// 参照したいセルがある行
if colKey == "任意の列番号" {
println(colVal.Value)
}
}
}
}
// セルの値から判断したい場合
// 行ごとに処理
for _, rowValue := range sheet.Rows {
// 列ごとに処理
for _, colVal := range rowValue.Cells {
// 参照したいセルがある行
if colVal.Value == "検索対象のキーワード" {
println(colVal.Value)
}
}
}
}
エクセルファイルの作成、書き込み
// エクセルの作成
excelFile := xlsx.NewFile()
// シートの追加
sheet, err := excelFile.AddSheet("NewSheet")
if err != nil {
fmt.Printf(err.Error())
}
// セルの追加
row = sheet.AddRow()
cell = row.AddCell()
cell.Value = "セルに書き込みたい内容"
// ファイルの保存
err = excelFile.Save("任意のファイル名")
if err != nil {
fmt.Printf(err.Error())
}
さいごに
C#とかでも同じ様なライブラリがありますが、言語的なハードルを感じる方にはGo言語の方が使いやすいかもしれませんね。
ZOZOテクノロジーズ #5 Advent Calendar 2019 明日は @meganekids さんが、涙なしでは見れない記事を書いて下さるようです。めちゃくちゃ楽しみです。