Go言語のExcel(tealeg/xlsx)パッケージはLinuxでも動いた!(但し多少修正要)
以前、Go言語でExcelファイルを扱えるtealeg/xlsxパッケージを紹介しました。このときはもちろんWindows上で動作させたのですが、なんとLinux(lubuntu)上でも使えることが判明しました。
Linux(lubuntu)上で動作確認を行ったのは以下のプログラムです。xmlからパラメータを読み込んで、そのパラメーターで指定したExcelファイルの指定条件にヒットした行を抽出して、別のExcelファイルにアウトプットするというやつです。
詳しくはこちらをご覧ください。
[ad#top-1]
このプログラムをLinux上でgo runしてみました。※ソースは上のリンク先にもありますがこの記事の最後にも掲載します。
その前に初期のファイル構成はこんな感じです。ExcelExtraction.goというのがソースです。conf.xmlが設定ファイルです。
ExcelファイルをLibreOfficeで開くとこんな感じです。全部で12万行以上のデータがあります。ファイルサイズが3.5MBと大きいファイルです。
パラメータ設定するXMLファイルは以下の通り。全国データから府中市を抽出するようになっています。
<?xml version="1.0" encoding="UTF-8"?> <ResultSet> <List> <FileName>/home/ueserver/.../address.xlsx</FileName> <StartRow>2</StartRow> <SheetName>Sheet1</SheetName> <SearchCol>3</SearchCol> <SearchText>府中市</SearchText> <ItemIndex>1</ItemIndex> <OutPut>outFile.xlsx</OutPut> </List> </ResultSet>
各パラメーターの説明はこちらです。
| 項目 | 説明 | 例 |
| FileName | 元ファイルのパス | C:\…\address.xlsx |
| StartRow | データ開始行 | 2 |
| SheetName | 元ファイルのシート名 | Sheet1 |
| SearchCol | 検索対象の列No. | 3 |
| SearchText | 検索文字 | 府中市 |
| ItemIndex | 項目行No. | 1 |
| OutPut | 出力ファイル名 | outFile.xlsx |
で、コンソールを開いて以下のコマンドを打つと
go run ExcelExtraction.go
エラーが発生してしまいました。
# command-line-arguments ./ExcelExtraction.go:74: assignment count mismatch: 2 = 1 ./ExcelExtraction.go:85: assignment count mismatch: 2 = 1
assignmentの数がアンマッチだって跳ねられてしまっているようです。…なぜだ!
問題の箇所は2箇所ありますが、全く同じコードのところでした。
text, _ := cell.String()
返り値として2個分キャッチしているつもりですが、どうも1個だけだと怒られているようです。Windowsだとこれでいいんだけどな…?
なので、ここを引数を1個に修正しました。下図の赤枠のところです。
そして、あらためてgo runしたところ、うまく動いてくれたようです!
outFile.xlsxというファイルが現れました。これが検索でヒットした行のみを抽出したファイルです。
これを開くとちゃんと抽出されていました。ちなみに「府中市」って東京の他に広島にもあります。ちゃんとヒットしてくれました。
ということで、Go言語のExcelを扱うパッケージ(tealeg/xlsx)はLinux上でもちゃんと使えることがわかりました。(ただし、多少修正は必要。)
最後にソースコード全文を掲載しておきます。
package main
import (
"fmt"
"github.com/tealeg/xlsx"
"io/ioutil"
"encoding/xml"
)
type List struct {
FileName string
StartRow int
SheetName string
SearchCol int
SearchText string
ItemIndex int
OutPut string
}
type ResultSet struct {
List []List
}
var conf ResultSet
func getConf(){
data, _ := ioutil.ReadFile("conf.xml")
err := xml.Unmarshal(data, &amp;conf)
if err != nil { panic(err) }
}
func main() {
//パラメーターをxmlファイルから取得する
getConf()
fmt.Println("ファイル読み込み中...")
//Excelファイルを開く
excel, err1 := xlsx.OpenFile(conf.List[0].FileName)
if err1 != nil { fmt.Printf(err1.Error()) }
fmt.Println("指定シート検索中...")
//指定シートを検索して変数sheetへ
var sheet *xlsx.Sheet
for _, s := range excel.Sheets {
if s.Name == conf.List[0].SheetName{
sheet = s
break
}
}
//パラメーター
index := conf.List[0].SearchCol-1
text := conf.List[0].SearchText
itemIndex := conf.List[0].ItemIndex - 1
startRow := conf.List[0].StartRow - 1
//新しいExcelファイルを作成
newfile := xlsx.NewFile()
newsheet, err := newfile.AddSheet("Sheet1")
if err != nil { fmt.Println(err.Error()) }
fmt.Println("検索中...")
//検索
r := 1; cnt := 0
for _, row := range sheet.Rows {
//項目行を最初に追加
if cnt==itemIndex {
c := 0
for _, cell := range row.Cells {
//text, _ := cell.String()
text := cell.String()
newsheet.Cell(0, c).Value = text
c++
}
}
//検索ヒットした行を新ファイルに追加
if cnt>=startRow && row.Cells[index].Value==text {
c := 0
for _, cell := range row.Cells {
//text, _ := cell.String()
text := cell.String()
newsheet.Cell(r, c).Value = text
c++
}
r++
}
cnt++
}
//ファイルに保存(ファイル名はパラメーターから取得)
err = newfile.Save(conf.List[0].OutPut)
if err != nil { fmt.Println(err.Error()) }
fmt.Println("完了!")
}
[ad#ad-1]
スポンサーリンク






