1.はじめに
最近、ExcelizeというGoライブラリに気づきました。多くのExcel操作を提供し、MicrosoftのVBAに似ています。私はそれに興味がありますが、オンラインでの調査中に、それについて話している人はほとんどいませんでした。ExcelizeはGithub(2020年4月)ですでに5.9kの星を獲得しており、頻繁に更新されています。学ぶのに非常に有望なライブラリであると信じる理由があります。
データラングリング用に設計されていませんが、純粋なGoであり、VBAを置き換えるための良い出発点です。この記事では、通常の毎日のワークフローで優れていることを示します。データを読み取り、いくつかの変更を行い、データを要約します(ピボットテーブル)。
2.インストール
excelize Githubのページ(ここを開く )では、goのコマンド「go get github.com/360EntSecGroup-Skylar/excelize」を使用すると非常に簡単です。
ただし、コマンドが機能しない「理由」がある場合は、次のように手動でexcelizeをインストールできます。
- excelizeのクローンまたはダウンロード。
- 「golang.org \ x \ net」と「golang.org \ x \ text」を複製またはダウンロードしてください。これらは、Excelの依存関係ライブラリです。
3.データを読み取る
xlsxファイルに焦点を当てます。現時点では、Excelにはcsvファイルを読み取る機能がありません。Goではcsvファイルの読み取りはそれほど難しくないため、これはデザイナーの目的かもしれません。その上、少なくとも状況では、csvファイルをxlsxファイルに手動で変更できます。
例として、以下のようにstocks.xlsxファイルを使用します。
メインパッケージ インポート( "FMT" "" github.com/360EntSecGroup-Skylar/excelize ) {main()のFUNC ERR、ファイルを:= excelize.OpenFile( "stocks.xlsx") !ERRなら=ゼロ{ パニック(ERR) } //セルを 行ごとにデータセルを出力、err:= file.GetRows( "stocks") if err!= nil { panic(err) } for _、row:= range rows { for _、colCell:= range row { fmt .Print(colCell、 "\ t") } fmt.Println() } }
コンソールでは、次のような出力を確認できますが、今のところ十分です。
3.いくつかの変更を行います
これらの会社を分類する列をデータに追加したいと思います。たとえば、AAPLとMSFTをターゲット、CSCOをターゲット外とラベル付けしたいとします。
Pythonパンダでは、データをフィルタリングしてラベルを付けるのと同じくらい簡単です。
さて、エクセルイズで何ができるでしょうか?
ExcelizeにはAutoFilter()と呼ばれる関数があります。VBAのオートフィルター機能にちなんで名付けられたと思います。
メインパッケージ のインポート( "github.com/360EntSecGroup-Skylar/excelize" ) 、 メインFUNC(){ = excelize.OpenFile( "stocks.xlsx"):ファイル、ERRを !ERR = nilの{場合 パニック(ERR) } //オートフィルタ機能しない err = file.AutoFilter( "stocks"、 "A1"、 "F11"、 `{" column ":" D "、" expression ":" Symbol == AAPL or Symbol == MSFT "}`) errの場合!= nil { panic(err) } file.SaveAs( "stocks_filter.xlsx") }
この関数の良い部分は、正確な範囲のデータを必要としないことです。この例では、データ範囲は「A1:D10」ですが、「A1:F11」を使用すると問題なく動作します。
ただし、この関数は実際にデータを必要に応じてフィルタリングするようには見えません。Excelizeのドキュメントでは、次のように記述されています。
/ *フィルター条件を指定するだけでは不十分です。フィルター条件に一致しない行も非表示にする必要があります。行はSetRowVisible()メソッドを使用して非表示になります。* /
しかし、通常はどの行を非表示にする必要があるかわかりません。そのため、この機能はどういうわけか私には奇妙です。
また、このオートフィルター機能には、VBAのオートフィルターと同様に、フィルター条件が2つしかないという悪い点があります。また、Excelizeには、3つ以上の条件をフィルタリングするVBAのAdvancedFilter関数がありません。
いくつかのforループを使用して、フィルターの目的を達成できます。多分それは低レベルのハードコードですが、今のところ実際には問題なく動作します。
メインパッケージ インポート( "のStrConv" "" github.com/360EntSecGroup-Skylar/excelize ) {main()のFUNC ERR、ファイルを:= excelize.OpenFile( "stocks.xlsx") !ERRなら=ゼロ{ パニック(ERR) } file.SetSheetRow( "stocks"、 "E1"、&[] string {"Cat"}) 行、err:= file.GetRows( "stocks") if err!= nil { panic(err) } for i:= 0; i <len(rows); i ++ { for j:= 0; j <len(rows [i]); j ++ { if rows [i] [j] == "AAPL" || rows [i] [j] == "MSFT" { file.SetCellValue( "stocks"、 "E" + strconv.Itoa(i + 1)、 "Target" file.SetCellValue( "stocks"、 "E" + strconv.Itoa(i + 1)、 "Untarget") } } file.SaveAs( "stocks_filter2.xlsx") }
4.データの要約(ピボットテーブル)
AddPivotTable関数では、DataRangeは正確な範囲である必要がありますが、PivotTableRangeはカジュアルでも1つのセルより大きくすることができます。
メインパッケージ のインポート( "github.com/360EntSecGroup-Skylar/excelize" ) 主FUNC(){ = excelize.OpenFile( "stocks.xlsx")ファイル、ERRを !ERR =ゼロ{場合 パニック(ERR) } ファイルERR = .AddPivotTable(&excelize.PivotTableOption { DataRange: "stocks!$ A1:$ D10"、 PivotTableRange: "stocks!$ G1:G2"、 Rows:[] excelize.PivotTableField {{Data: "Symbol"}、{Data: "日付 "}}、 データ:[] excelize.PivotTableField {{Data:" Close "、小計:" Average "}、 }}) if err!= nil { panic(err) } file.SaveAs(" stocks_pivot.xlsx " ) }
Summay
ExcelizeとVBAを比較すると、実際にはそれほど公平ではありません。VBAはMicrosoftによって30年近く開発されてきましたが、このオープンライブラリは何とか新しいものです。
この記事の簡単なテストのために、それはいくつかの弱点を明らかにします。たとえば、オートフィルター機能はVBAほど悪いわけではありません。
かなり言えば、excelizeの準備はできていませんが、近い将来、その価値が証明されるでしょう。あなたがそれに興味があるなら、githubのページは貢献のために開いていると言います。
詳細については、ドキュメント(こちら)およびgithub(こちら)を参照してください。