- Contents -
excel-sheetsコマンド
Go言語で何か作りたかったので、
カレントディレクトリにある、 xlsxファイルのシート一覧を取得するスクリプトを作りました。
https://gitlab.com/tyabuta/go-excel-sheets
インストール
go get -v gitlab.com/tyabuta/go-excel-sheets/cmd/...
usage
NAME:
excel-sheets - list of excel sheets.
USAGE:
excel-sheets [options] <Dir>
VERSION:
0.1.0
AUTHOR:
tyabuta <gmforip@gmail.com>
OPTIONS:
--delim value, -d value Use delim as the field delimiter character instead of the tab character. (default: "\t")
--fullname, -F Show full pathname.
--cache, -c Cached list of files.
--cached-file value, -f value Cached filename. (default: ".excel-sheets.cache")
--help, -h show help
--version, -v print the version
使いどころ
ゲーム会社では、エクセルファイルでゲーム設定などのマスタ管理をしていたりするので、
そういうシート一覧があれば何かと利用出来る事があるかと思います。
エクセルファイルとは (XLSX)
エクセルファイルの扱いに関しては、
当初、github.com/loadoff/excl を使っていたんですが、
シート名の一覧だけを取得したいのに対して、エクセルファイル全てを読み込んでしまうので、
必要最低限になるように部分的に参考にさせて頂きました。
20MBくらいのエクセルファイルが、
1000ファイルくらいあっても、0.2秒くらいでシート一覧が取得できているので充分じゃないでしょうか。
$ time excel-sheets . > output.txt git:master*
0.23 real 0.18 user 0.06 sys
xlsx ファイルの構造
xlsxファイルは zipファイルになっていて、
解凍すると、こんなディレクトリ構造になっている。
拡張子をzipに変えると、ふつうに解凍できます。
Zip解凍後のディレクトリツリー
$ tree .
.
├── [Content_Types].xml
├── _rels
├── docProps
│ ├── app.xml
│ └── core.xml
└── xl
├── _rels
│ └── workbook.xml.rels
├── printerSettings
│ ├── printerSettings1.bin
│ ├── printerSettings2.bin
│ ├── printerSettings3.bin
│ ├── printerSettings4.bin
│ ├── printerSettings5.bin
│ └── printerSettings6.bin
├── sharedStrings.xml
├── styles.xml
├── theme
│ └── theme1.xml
├── workbook.xml
└── worksheets
├── _rels
│ ├── sheet10.xml.rels
│ ├── sheet2.xml.rels
│ ├── sheet3.xml.rels
│ ├── sheet4.xml.rels
│ ├── sheet8.xml.rels
│ └── sheet9.xml.rels
├── sheet1.xml
├── sheet10.xml
├── sheet11.xml
├── sheet12.xml
├── sheet13.xml
├── sheet14.xml
├── sheet15.xml
├── sheet2.xml
├── sheet3.xml
├── sheet4.xml
├── sheet5.xml
├── sheet6.xml
├── sheet7.xml
├── sheet8.xml
└── sheet9.xml
workbook.xml
worksheetsディレクトリには、実際のシート名では収められていないので、
シート名の情報は、xl/workbook.xml というファイルから読み込む必要がある。
このファイルだけメモリ上に展開して、
encoding/xml を使ってシート名だけを取り出しています。
workbook.xmlの内容
<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
<fileVersion appName="xl" lastEdited="4" lowestEdited="4" rupBuild="4507"/>
<workbookPr filterPrivacy="1" defaultThemeVersion="124226"/>
<bookViews>
<workbookView xWindow="0" yWindow="30" windowWidth="19200" windowHeight="12090" firstSheet="2" activeTab="14"/>
</bookViews>
<sheets>
<sheet name="Sheet4 (2)" sheetId="6" r:id="rId1"/>
<sheet name="Sheet1" sheetId="1" r:id="rId2"/>
<sheet name="Sheet2" sheetId="2" r:id="rId3"/>
<sheet name="Sheet3" sheetId="3" r:id="rId4"/>
<sheet name="Sheet4" sheetId="4" r:id="rId5"/>
<sheet name="Sheet5" sheetId="5" r:id="rId6"/>
<sheet name="Sheet4 (3)" sheetId="7" r:id="rId7"/>
<sheet name="Sheet1 (2)" sheetId="8" r:id="rId8"/>
<sheet name="Sheet2 (2)" sheetId="9" r:id="rId9"/>
<sheet name="Sheet3 (2)" sheetId="10" r:id="rId10"/>
<sheet name="Sheet4 (4)" sheetId="11" r:id="rId11"/>
<sheet name="Sheet5 (2)" sheetId="12" r:id="rId12"/>
<sheet name="Sheet6" sheetId="13" r:id="rId13"/>
<sheet name="Sheet7" sheetId="14" r:id="rId14"/>
<sheet name="Sheet8" sheetId="15" r:id="rId15"/>
</sheets>
<calcPr calcId="125725"/>
</workbook>
参考URL
下記のURLを参考にさせてもらいました。
OpenXml の取り扱い
Go言語でExcel操作ライブラリを書いてみた
https://qiita.com/tebakane/items/2f2ed2558357c274c478
Zipの解凍方法
Go言語でzipファイル解凍
https://qiita.com/hnaohiro/items/e6fd3154bd277bc6302e
おしまい
Goはやっぱり書いていて楽しいですね。