![[小ネタ]Go言語でExcelファイルをCSVに変換してみた](https://images.ctfassets.net/ct0aopd36mqt/wp-thumbnail-243509342eb7b967e9e235ee0c61af90/ea6b1c68015d9fbd4fa40d2df85865d3/golang-logo_1200x630.png)
[小ネタ]Go言語でExcelファイルをCSVに変換してみた
Go言語でExcelファイルをCSVに変換する、もしくは逆にCSVを読み込んでExcelファイルとして出力する処理を行いたいと考えていると、「Excelize」というライブラリを見つけました。
READMEにExcelファイルの読み書きのサンプルはありますが、実案件ではGo言語の標準パッケージである「encoding/csv」を使用したいということもあり、「encoding/csv」を使ってプログラムを書いてみました。
以下、そのプログラムについて書いていきたいと思います。
実行環境やバージョンについて
記事執筆時の「Excelize」の最新バージョン(2.9.0)で試したところ、Go言語は1.20以上でないと動作しないようです。今回は以下の環境で動作確認をしています。
- Go ・・・1.23.6
- Excelize ・・・ 2.9.0
プログラムについて
まずはExcelファイルを読み込み、CSVに出力するプログラムです。読み込むExcelファイルは以下のようなファイルとなります。
package main
import (
"encoding/csv"
"fmt"
"os"
"github.com/xuri/excelize/v2"
)
func main() {
f, err := excelize.OpenFile("sample.xlsx")
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
rows, err := f.GetRows("Sheet1")
if err != nil {
fmt.Println(err)
return
}
file, err := os.Create("output.csv")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
writer := csv.NewWriter(file)
defer writer.Flush()
for _, row := range rows {
if err := writer.Write(row); err != nil {
fmt.Println(err)
return
}
}
fmt.Println("read excel file, write csv file.")
}
先に書いたようにExcelファイルから読んだ内容を「encoding/csv」を使用して出力しています。ここでは書きませんが、例えばタブ区切りで出力したい場合、「encoding/csv」を使えば区切り文字としてタブを指定するだけで実現できるなどのメリットがあると思います。
こちらを実行すると「output.csv」というCSVファイルにExcelファイルの内容が出力されます。
次にCSVを読み込み、Excelファイルとして出力するプログラムです。上のプログラムで出力した「output.csv」を読み込むようにしています。
package main
import (
"encoding/csv"
"fmt"
"os"
"github.com/xuri/excelize/v2"
)
func main() {
file, err := os.Open("output.csv")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
reader := csv.NewReader(file)
rows, err := reader.ReadAll()
if err != nil {
fmt.Println(err)
return
}
f := excelize.NewFile()
sheetName := "Sheet1"
sheetIndex, err := f.GetSheetIndex(sheetName)
if err != nil {
fmt.Println(err)
return
}
f.SetActiveSheet(sheetIndex)
for rowIndex, row := range rows {
for colIndex, cellValue := range row {
cellName, _ := excelize.CoordinatesToCellName(colIndex+1, rowIndex+1)
f.SetCellValue(sheetName, cellName, cellValue)
}
}
if err := f.SaveAs("output.xlsx"); err != nil {
fmt.Println(err)
return
}
fmt.Println("read output.csv file, write output.xlsx file.")
}
こちらのプログラムではExcelファイルに出力すると同時に、「Sheet1」シートをアクティブなシートとして指定しています。実行すると、最初に読み込んだExcelファイルと同じ内容のファイルが「output.xlsx」として出力されます。
まとめ
このように「Excelize」を使用してExcelファイルをCSVに、逆にCSVをExcelとして出力することができました。今回は「encoding/csv」と組み合わせて使いましたが、他のパッケージと組み合わせると実現できることが広がると思います。
小ネタではありますが、何かの参考になれば幸いです。