エクセル シート 名 取得。 ワークシート名をセルに表示−CELL・FIND・LEN・RIGHT関数:Excel(エクセル)の関数・数式の使い方/文字列

Excel2010

エクセル シート 名 取得

はじめに Excel ファイルをプログラムで扱うとき、シートの内容を解析する前段階としてシート名の一覧を取得したいケースがしばしばあります。 で紹介したExcelファイル比較ツール「方眼Diff」を作成する際にもそのような場面に遭遇しました。 本稿では、Excel ブックに含まれるシート名の一覧を Java で取得するための方法として、次の3つを紹介します。 Apache POI の usermodel API を利用する方法(. xlsm)• Apache POI の eventmodel API を利用する方法(. xls)• SAX(Simple API for XML)を利用する方法(. xlsm) Apache POI の usermodel API を使う方法 Apache POI とは Apache POI は Microsoft Office 形式のファイルを読み書きできる Java ライブラリ(およびそのプロジェクト)で、Apache Software Foundation により Apache License 2. 0 に基づいて公開されています。 当該ライブラリをビルドパスに追加することにより利用することができます。 (本稿末尾でその方法を紹介しています。 ) POI には usermodel API と後で紹介する eventmodel API が用意されています。 usermodel API は Java で Excel を扱う際の第一選択肢となるでしょう。 実装例 package mypackage ; import java. File ; import java. IOException ; import java. util. List ; import java. util. stream. Collectors ; import java. util. stream. IntStream ; import org. apache. poi. EncryptedDocumentException ; import org. apache. poi. openxml4j. exceptions. InvalidFormatException ; import org. apache. poi. usermodel. Sheet ; import org. apache. poi. usermodel. Workbook ; import org. apache. poi. usermodel. range 0 , book. getNumberOfSheets. mapToObj book: : getSheetAt. map Sheet: : getSheetName. collect Collectors. xls" ; sheetNames. forEach System. create file の部分がそれにあたります。 その後、 Workbook getNumberOfSheets , Workbook getSheetAt int , Sheet getSheetName などを利用してシート名の一覧を取得しています。 上記のコード例では. xls 形式のファイルを処理していますが、. xlsm 形式のファイルも処理することができます。 長所 透過的な処理が可能である ファイル形式(. xls形式 or. xlsm形式)を意識することなく透過的に処理を行うための各種 API が用意されています。 オブジェクト指向による理解しやすいモデル化 ブック - シート - 行 - セルなどが Java プログラマの慣れ親しんだオブジェクト指向でモデル化されており、直観的に理解して扱うことができます。 短所 多量のメモリと処理時間を必要とする usermodel API では初めに Excel ブック全体をロードして解析する必要があるため、単にシート名を取得したいだけの場合も、Excel ファイル全体の内容に応じたメモリ量と処理時間を必要とします。 これが実用上のネックになる場合があります。 痒いところに手が届かない 現在の usermodel API は、機能が充実しているとは言い難いです。 例えば上記のコード例ではワークシートに加えてグラフシートの名前も出力されています。 ワークシートの名前だけに絞りたい場合、これが難しいのです。 Sheet isChartSheet というような API があっても良さそうなものですが、ないのです。 Excel シートを扱うためのインタフェース/クラスは次のような階層構造になっています。 ( 前略 ) return IntStream. range 0 , book. getNumberOfSheets. mapToObj book: : getSheetAt. map Sheet: : getSheetName. collect Collectors. toList ; ( 後略 ) しかし、. xls 形式のグラフシートを除外する方法はありません。 POI で少し凝ったことをしようとすると、次から次へとこのような問題に遭遇してハマることとなるのです。 これらの短所が問題にならない場合は POI usermodel API が第一選択肢となるでしょう。 その他の場合は、ほかの方法に頼ることとなります。 Apache POI の eventmodel API を使う方法 POI の eventmodel API とは eventmodel API は Excel ファイルを高速かつ少量のメモリで読み取るために提供されている機能であり、ファイルへの書き込みはサポートされていません。 eventmodel API は Excel ファイルを先頭から末尾まで一方向に読み進め、ファイルの内容をイベントという形でアプリケーションに通知します。 アプリケーションはイベント内容に応じて独自の処理を行います。 「」では、. xls 形式の Excel ブックからシート名一覧を読み取る際にこの方法を採用しています。 ここでは. xls 形式の Excel ブックを扱う場合の実装例を紹介します。 実装例 ワークシート名およびグラフシート名を取得する場合 package mypackage ; import java. File ; import java. FileInputStream ; import java. util. ArrayList ; import java. util. List ; import org. apache. poi. hssf. eventusermodel. HSSFEventFactory ; import org. apache. poi. hssf. eventusermodel. HSSFListener ; import org. apache. poi. hssf. eventusermodel. HSSFRequest ; import org. apache. poi. hssf. record. BoundSheetRecord ; import org. apache. poi. hssf. record. Record ; import org. apache. poi. poifs. filesystem. add bSheetRecord. abortableProcessWorkbookEvents req , poifs ; return listener. xls" ; sheetNames. forEach System. File ; import java. FileInputStream ; import java. util. ArrayDeque ; import java. util. ArrayList ; import java. util. List ; import java. util. Queue ; import org. apache. poi. hssf. eventusermodel. HSSFEventFactory ; import org. apache. poi. hssf. eventusermodel. HSSFListener ; import org. apache. poi. hssf. eventusermodel. HSSFRequest ; import org. apache. poi. hssf. record. BOFRecord ; import org. apache. poi. hssf. record. BoundSheetRecord ; import org. apache. poi. hssf. record. Record ; import org. apache. poi. poifs. filesystem. add bSheetRecord. getSheetname ; break ; case BOFRecord. add queue. remove ; break ; case BOFRecord. abortableProcessWorkbookEvents req , poifs ; return listener. xls" ; sheetNames. forEach System. イベントを受け取るためには HSSFListener インタフェースを実装し、 processRecord Record メソッドをオーバーライドする必要があります。 ファイルを読み進めるごとに processRecord Record メソッドが呼び出されるので、アプリケーションではイベントの内容(具体的には引数として渡される Record オブジェクトの内容)に応じて処理を行います。 実装例2-aでは record. sid であるイベントを、実装例2-bでは record. sid または record. sid であるイベントを処理しています。 どのようなイベントがどのような順番で発生するのかを理解するのはなかなか困難な作業です。 私は とそのサブインタフェース・サブクラスの API ドキュメントや、次のコードで確認できる実際のイベント内容を見比べながら徐々に理解を深めていきました。 out. xls 形式の Excel ブックだけです。. xlsm 形式の Excel ブックを処理することはできません。 長所 少量のメモリで高速に動作する eventmodel API はファイルの先頭から末尾までをストリームで読み取る方式であることから、ファイル内容全体を解析してメモリ上に保持する方式である usermodel API と比較して、少量のメモリで高速に動作します。 きめ細かな処理が可能である ファイル内容をほぼ直に読み取ることができることから、usermodel API では実現できない処理も実現することができます。 短所 ファイルの内部構造に関する理解が必要となる eventmodel API で処理を行うためには、どのようなイベントがどのような順番で発生するのかという、Excel ファイルの内部構造に対する理解が欠かせません。 リファレンスブックがあるにはあります。 『Microsoft Excel 97 Developers Kit』。 洋書、絶版。 本稿執筆時点で Amazon に。 Record 実装クラスの API ドキュメントには、この本の参照箇所が記載されています。 例えば には、「REFERENCE: PG 291 Microsoft Excel 97 Developer's Kit ISBN: 1-57231-498-2 」というように記載されています。 本格的なアプリケーションを作成する際には、リファレンスブック片手に取り組む必要があるでしょう。 私は API ドキュメントと実際のレコード内容を確認しながら実装を進めました。 いずれにせよ、トライアンドエラー的な実装を強いられることになるでしょう。 ファイル内容に対するランダムアクセスができない eventmodel API ではファイルを先頭から末尾に一直線に読み取るだけであることから、ファイル後方の内容に応じてファイル前方の内容を評価する必要があるような場合には、自身でファイル内容を管理・記録する必要があります。 SAXを使う方法 SAXとは SAX は Simple API for XML の略で、Java8 においては org. xml. sax パッケージで標準 API として提供されています。 POI の eventmodel API と似たように、XML ファイルを先頭から末尾まで一方向に読み進め、XML ファイルの内容がイベントとしてアプリケーションに通知されます。 よく知られているように、. xlsm 形式の Excel ファイルの実体はいくつかの XML ファイルなどから成る ZIP ファイルですので、SAX を利用して Excel ブックの内容を読み取ることができます。 「」では、. xlsm 形式の Excel ブックからシート名一覧を読み取る際にこの方法を採用しています。 実装例 ワークシート名およびグラフシート名を取得する場合 package mypackage ; import java. File ; import java. InputStream ; import java. nio. file. FileSystem ; import java. nio. file. FileSystems ; import java. nio. file. Files ; import java. util. ArrayList ; import java. util. List ; import org. xml. sax. Attributes ; import org. xml. sax. InputSource ; import org. xml. sax. XMLReader ; import org. xml. sax. helpers. DefaultHandler ; import org. xml. sax. helpers. add attributes. newFileSystem file. newInputStream fs. createXMLReader ; parser. setContentHandler handler1 ; parser. xlsx" ; sheetNames. forEach System. File ; import java. InputStream ; import java. nio. file. FileSystem ; import java. nio. file. FileSystems ; import java. nio. file. Files ; import java. util. ArrayList ; import java. util. HashMap ; import java. util. List ; import java. util. Map ; import java. util. stream. Collectors ; import org. xml. sax. Attributes ; import org. xml. sax. InputSource ; import org. xml. sax. XMLReader ; import org. xml. sax. helpers. DefaultHandler ; import org. xml. sax. helpers. add attributes. getValue "name" ; nameToId. put attributes. getValue "name" , attributes. xml. put attributes. getValue "Id" , attributes. newFileSystem file. newInputStream fs. createXMLReader ; parser. setContentHandler handler1 ; parser. newInputStream fs. xml. createXMLReader ; parser. setContentHandler handler2 ; parser. names. stream. nameToId. idToSource. get id ; return source. collect Collectors. xlsx" ; sheetNames. forEach System. xml. sax. helpers. DefaultHandler を継承するのが便利です。 DefaultHandler クラスが用意する様々なコールバックメソッドのうち、アプリケーションで必要とするイベントに対応するコールバックメソッドをオーバーライドして利用します。 上記のコード例では XML ファイルの開始タグが現れるたびに呼び出される startElement String, String, String, Attributes メソッドを利用しています。 xml. rels というエントリを読み取っています。 それらをどのように解析しているかの解説は、長くなるので省きます。. xlsm 形式の Excel ファイルを ZIP 解凍ツールで展開することで、Excel ファイルを構成する XML ファイルの内容を容易に確認することができます。 お手持ちの Excel ファイルで確認しながら、上記のコード例を読んでみてください。 長所 少量のメモリで高速に動作する POI の eventmodel API と同様に、高速かつ省メモリで動作します。 加えて、Excel ファイルを構成する複数の XML ファイルのうち必要なものだけを読み取ることができるため、より一層高速に動作させることが可能です。 きめ細かな処理が可能である ファイル内容を直に読み取ることができることから、POI の usermodel API では実現できない処理も実現することができます。 外部ライブラリを必要としない org. xml. sax およびそのサブパッケージは、Java8 において標準 API として提供されています。 外部ライブラリへの依存が必要ありません。 短所 ファイルの内部構造に関する理解が必要となる POI の eventmodel API と同様に、Excel ファイルの内部構造に対する理解が不可欠となります。 ただし、. 従って、仕様情報を入手するのが比較的容易です。 また、ZIP 解凍ツールで容易に内容を確認することができることから、. xls 形式の Excel ブックを POI の eventmodel API で扱うよりは取っ付き易い面があると言えます。 ファイル内容に対するランダムアクセスができない POI の eventmodel API と同様に、SAX も XML ファイルを先頭から末尾に一直線に読み取るだけであることから、ファイル後方の内容に応じてファイル前方の内容を評価する必要があるような場合には、自身でファイル内容を管理・記録する必要があります。 おわりに 本稿では、Excel ファイルに含まれるシート名の一覧を Java で取得する方法として、次の3点を紹介しました。 Apache POI の usermodel API を利用する方法(. xlsm)• Apache POI の eventmodel API を利用する方法(. xls)• SAX(Simple API for XML)を利用する方法(. xlsm) どの方法も一長一短があり、私たちプログラマが目的に応じて正しく使い分ける必要があります。 私自身は、上記3つの方法ともに、「」を作成する際の必要性に迫られて初めてチャレンジしたものでした。 特に eventmodel API や SAX を使う方法にはハードルの高さを感じましたが、意外や意外、始めてしまえばあまり難しくなく、慣れてしまえば便利に感じるものです。 皆さんも初めの抵抗を乗り越えてチャレンジしてみると、実装力の幅が広がるかもしれません。 「方眼Diff」では Excel ファイルの更新にも複数の方法を駆使しています。 これについては稿を改めて紹介したいと思います。 APPENDIX Apache POI のライブラリをビルドパスに加えて利用する方法 Apache POI の提供するいくつかの jar ファイルをビルドパスに追加することで、その機能を利用できるようになります。 ここでは手動でダウンロードした jar ファイルを Eclipse でビルドパスに追加する方法を紹介します。 (Maven などを利用する方法は他を当たってください。 ) 1. ライブラリ(zip ファイル)をダウンロードする のから zip ファイル(本稿執筆時点では poi-bin-3. 17-20170915. zip)をダウンロードすることができます。 zip ファイルを解凍する ローカルPCの任意の場所で zip ファイルを解凍します。 次のように解凍されると思います。 poi-3. jar 3. ] を選択します。 B お好きな名前、たとえば「poi-3. 17」とでも入力してOKを押下します。 C 作成されたユーザーライブラリを選択したうえで、[外部 JAR の追加... ] を押下します。 D 上記2. の解凍物に含まれる jar ファイルを指定します。 lib フォルダや ooxml-lib フォルダに含まれるものも指定します。 中には Excel だけでなく Word や PowerPoint などを操作するための jar ファイルやサンプルファイルなども含まれており、Excel ファイルを操作するだけならそれらの jar ファイルは不要なのですが、ま、全部入れちゃえば良いんじゃないでしょうか。 E [適用して閉じる] を押下します。 ] を選択します。 B ライブラリー・タイプとして [ユーザー・ライブラリー] を選択し、その対象として先ほど作成したユーザーライブラリを指定します。 以上で完了です。

次の

[Excel] シート名を取得してセルに表示

エクセル シート 名 取得

Excelでデータの集計を行うときに、シート名をセルから参照したい場合もあります。 たとえば、支店ごとに作成した売上を合計する場合です。 東京、千葉、神奈川という支店について1支店1シートで売上を入力しておきます。 1支店1シートで売上を入力 各支店の売上を「売上合計」シートで集計します。 各支店の売上の合計 このとき、「東京支店の売上」は、どのように取得すれば良いでしょうか。 B14」と入力する方法があります。 支店の売上を取得する原始的な方法 ただし、この方法ではA列の支店名(シート名)が変更されたときにB列の式も修正する必要があるので面倒です。 B14」と入力してもうまく参照できません。 その場合、INDIRECT関数が役立ちます。 この関数はセルに入力された文字列を参照に変えてくれる関数です。 セルに入力された内容からシートやセル範囲を参照できるようになります。 B14" 」と入力すれば「A2に入力されたシート名のセルB14」を参照できるようになります。 それにより、東京シートのセルB14に入力された売上を取得することができます。 A列の支店名が変更された場合も、参照するシートを変更するためB列の式を修正する必要はありません。 他のセルも同じように入力(オートフィルでも)すれば、セルに入力された支店名からシート名を参照できます。 セルに入力されたシート名を参照する.

次の

エクセル:シート名を手入力でなく、セル「A1」の文字を出したい。

エクセル シート 名 取得

表題の件、を作成しました。 業務をしていてあると便利だな、と。 MyCommand. Workbooks. Quit 各変数を解放(. ブロックでOut-Nullしているのは実行すると「0 0 0」と表示されるため). Runtime. Interopservices. Runtime. Interopservices.

次の