エクセルのシート一覧取得するコマンド作ってみた (Go言語)

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はやっぱり書いていて楽しいですね。

コメントを残す