USER MANUALS

Excel ソース

Excel データソースは、Apache POI ライブラリ (Apache POI API - the Java API for Microsoft Documents) を使用して、Excel ファイルからデータを抽出します。

新しい Excel データソースを作成するには、[File] > [New] > [Data source] メニューで [Excel] をクリックします。データソースを作成するダイアログが表示されます。

Creating an Excel data source

Excel データソースの作成

このダイアログでは、以下のデータを指定する必要があります。

  • Name: データソースの名前。

  • Type of file: ファイルのバージョンに応じて、[Stream tuples] オプションが有効または無効になります (下記参照)。

  • File location: Excel ファイルへのパス。このパスは、補間変数を使用することで、作成したクエリに応じてパラメータ化できます (「 補間変数によるパスなどの値 」を参照)。使用可能なパスの形式と、そこでパラメータを使用する方法については、「 Virtual DataPort でのパスの種類 」を参照してください。

  • Worksheet (オプション): データの抽出元とするワークシートの名前。

    空のままにすると、ファイルの 1 番目のシートから基本ビューにデータが取得されます。

    「Sheet1, Sheet2」のように、複数のシートをカンマ区切りで指定することもできます。

    Excel ファイルのワークシート 1 つのみではなく、すべてのワークシートからデータを抽出する場合は、[Extract data from all sheets] をチェックします。この場合、基本ビューの各フィールドは、ファイルの 1 番目のワークシートの列によって決まります。したがって、以下の点を考慮する必要があります。

    • 2 番目以降のシートに、1 番目のシートにない列があると、その列は無視されます。

      1 番目のワークシートの列の一部が存在しないワークシートからデータを取得した行では、それらの列の値は NULL になります。

      たとえば、Excel ファイルに 2 つのワークシートがあり、1 番目のシート (Sheet1) に A 列、B 列、および C 列が存在し、2 番目のシート (Sheet2) に A 列、C 列、および D 列が存在するとします。

      基本ビューには、ファイルの 1 番目のシートにある A、B、および C の各列に対応するフィールドが存在します。このビューにクエリを実行して、ファイルの 2 番目のシートからデータを抽出すると、Virtual DataPort によって以下の処理が実行されます。

      • 2 番目のシートには B 列が存在しないので、B フィールドの値として NULL が返されます。

      • D 列の値は無視されます。

    • これらのルールは、[Worksheets] ボックスに複数のワークシートを入力した場合にも適用されます。この場合、基本ビューのフィールドは、このリストの最初のワークシートの列によって決まります。

  • 各行のデータの取得元であるワークシートの名前を格納するフィールドを基本ビューに追加するには、[Extract sheet name as a new column] をチェックします。このフィールドは、デフォルトで「sheet_name」という名前で追加されます。

    [Extract data from all sheets] オプションをチェックした場合に、行のデータをどのワークシートから取得したかがわかると便利です。

  • StartCellEndCell (オプション): 処理するセル範囲の最初のセルと最後のセル。

    [StartCell] が B2 、[EndCell] が Z99 の場合、範囲 B2:Z99 にあるデータが返されます。

    [StartCell] が B2 、[EndCell] が空の場合、B2 からファイル末尾までのすべてのデータが取得されます。

    [StartCell] が空、[EndCell] が Z99 の場合、範囲 A1:Z99 にあるすべてのデータが取得されます。

    両方のパラメータが空の場合、シートにあるすべてのデータが取得されます。

    [Extract data from all sheets] オプションをチェックしている場合、このデータソースから作成した基本ビューからは、ファイルの各ワークシートにあるこのセル範囲のデータが返されます。

  • Has headers: 取得するデータの最初の行に、データではなく列名が格納されている場合は、このチェックボックスをチェックします。

  • Stream tuples: チェックすると、ファイルは SAX パーサー (Excel 2007 ファイル (*.xslx) でのみ使用可能) を使用して読み取られます。チェックしていない場合、ファイルは DOM パーサーを使用して読み取られます。

    DOM パーサーと比較した SAX パーサーの利点は、メモリの使用量がきわめて少ないことです。サイズが大きい Excel ファイルを扱う場合に重要な利点となります。

    [Stream tuples] をチェックするかどうかによって、このデータソースから作成する基本ビューのデータ型が影響を受けます。

    • [Stream tuples] をチェックしていない場合、Virtual DataPort サーバーでは、ファイルのメタデータから各フィールドの型が取得されます。

    • [Stream tuples] をチェックしている場合、Virtual DataPort サーバーでは、ファイルの最初の数行から各列の型が推測されます。

      この型の推測に使用する行数は、 com.denodo.vdb.contrib.wrapper.xls.event.content.introspection.maxrows プロパティで制御します。

      この値を変更するには、以下のコマンドを実行します。

SET 'com.denodo.vdb.contrib.wrapper.xls.event.content.introspection.maxrows'
= '<number of rows>';

[Stream tuples] をチェックしている場合、日付値が格納されている列は必ずテキストフィールドと推測されます。日時値 (localdate、timestamp など) を取得するには、以下の 2 つの方法があります。

  1. [Stream tuples] チェックボックスのチェックをはずします。これによって、日付値が格納されている列が基本ビューでは日付型のフィールドと推測されます。この場合、SAX パーサーを使用できなくなるので、パフォーマンスの面で不利になる問題があります。

    大きなサイズの Excel ファイルには使用しないでください。Excel ファイルの行数が数千行以下であることがわかっている場合のみクリアしてください。

  2. この基本ビューから選択ビューを作成し、 TO_LOCALDATETO_TIMETO_TIMESTAMP 、または TO_TIMESTAMPTZ の各関数を使用して、テキストフィールドを日時フィールドに変換します。

[Metadata] タブでは、データソースを保存するフォルダを設定して説明を指定できます。データソースを編集する際、 image1 ボタンをクリックして、その所有者を変更することもできます。

[Save] をクリックするとデータソースが作成されます。次に、[Create base view] をクリックすると、新しい基本ビューに設定されるスキーマが表示されます。[Save] をクリックすると基本ビューが作成されます。

他のデータソースと異なり、1 つの Excel データソースから作成できる基本ビューは 1 つだけです。同じファイルからデータを取得する基本ビューをもう 1 つ作成する必要がある場合は、Excel データソースをもう 1 つ作成します。

管理ツールでは、Excel データソースはデータソースの一種と見なされますが、内部的にはカスタムデータソースです。そのため、以下のように軽微な影響がいくつかあります。

  • Excel データソースを列挙する VQL コマンドは LIST DATASOURCES CUSTOM ですが、これによって、Excel データソースだけでなく、すべてのカスタムデータソースのリストが返されます。

  • Excel データソースをエクスポートする場合 (データソースを右クリックして [Export] を選択)、選択されるソースのタイプは [Custom] です。

Excel ファイル処理時のサイズ制限

メモリの問題を防ぐため、データソースが処理する Excel ワークシートのサイズには制限があります。ファイルではなくワークシートが大きい場合、クエリは以下のエラーが表示されて失敗します。

The file is not accessible or is not an Excel file. Tried to allocate an array of length xx, but the maximum length for this record type is 100,000,000.
If the file is not corrupt or large, please open an issue on bugzilla to request increasing the maximum allowable size for this record type.
As a temporary workaround, consider setting a higher override value with IOUtils.setByteArrayMaxOverride()

Excel ファイルはディスクへの保存時に圧縮されることに注意してください。この制限は、解凍後のワークシートのサイズとほぼ同じです。

制限はデフォルトで 150 MB です。この値を変更するには、以下のコマンドを実行します。

SET 'com.denodo.vdb.contrib.wrapper.xls.event.byteArrayMax' = '<maximum size of sheet in bytes>';

たとえば、制限を 200 MB に増やすには、以下を実行します。

SET 'com.denodo.vdb.contrib.wrapper.xls.event.byteArrayMax' = '209715200';

複数のファイルエントリを持つ Excel ファイルの読み取り

データソースから取得した Excel ワークシートの処理中に次のメッセージが表示されることがあります。

Received exception with message 'The file is not accessible or is not an Excel file. The file appears to be potentially malicious. This file embeds more internal file entries than expected.
This may indicates that the file could pose a security risk.
You can adjust this limit via ZipSecureFile.setMaxFileCount() if you need to work with files which are very large.
Limits: MAX_FILE_COUNT: 1000

このように表示されるメッセージは、セキュリティの侵害や脆弱性の悪用からの防御を目的としたセキュリティ対策によるものです。デフォルトのセキュリティしきい値を超える複雑なファイルや大きなファイルを扱う場合 (このような処理そのものは問題ありません) に、この機能が特に効果的です。

この制限値を調整することで、このようなファイルへのアクセスとその処理が可能になり、適切に開く処理や読み取る処理を阻害すると考えられる不要な制約がなくなります。この制限値のデフォルト値は 1,000 です。

次のプロパティで、この制限値を変更できます。

SET 'com.denodo.vdb.engine.wrapper.raw.excel.maxFileCount' = '<maximum file entries>';

たとえば、1 つの Excel ファイルごとに 2,000 件のファイルエントリを扱うことができるように、このしきい値を大きくするには以下を実行します。

SET 'com.denodo.vdb.engine.wrapper.raw.excel.maxFileCount' = '2000';

プロパティを削除してデフォルト値にリセットするには、以下の文を実行します。

SET 'com.denodo.vdb.engine.wrapper.raw.excel.maxFileCount' = NULL;

一時ファイルを使用して Excel ファイルを読み込む

指定したシートのサイズに基づいて、どの Excel ドキュメントを処理するかを決めるには、プロパティ com.denodo.vdb.contrib.wrapper.xls.event.byteArrayMax を使用します。

Excel ファイルは Apache POI ライブラリ を使用して読み込まれます。デフォルトでは、Apache POI によって Excel ファイルがメモリに読み込まれますが、そのファイルが大きすぎる場合は Java ヒープ領域エラーがスローされ、処理が停止することがあります。ログファイルに記述されると考えられるエラーを以下に示します。

Unexpected error: Java heap space
java.lang.OutOfMemoryError: Java heap space
com.denodo.vdb.engine.AbstractResultMovement [] - com.denodo.vdb.cache.VDBCacheException: Execution interrupted.
com.denodo.vdb.cache.VDBCacheException: Execution interrupted.

一時ファイルを使用して Excel ファイルを読み込み可能にするには、以下を実行する必要があります。

SET 'com.denodo.vdb.contrib.wrapper.xls.event.thresholdBytesForTempFiles' = '<size to start using temporary files in bytes>';

たとえば、100 MB を超える大きさのシートを保存するには以下を実行します。

SET 'com.denodo.vdb.contrib.wrapper.xls.event.thresholdBytesForTempFiles'='100000000';

この設定を無効にするには、 -1 を使用します。

SET 'com.denodo.vdb.contrib.wrapper.xls.event.thresholdBytesForTempFiles'='-1';

このような一時ファイルのデフォルトのディレクトリは、多くの場合、Linux では /tmp 、Windows では %APPDATA%\Local\Temp ですが、JVM 設定 -Djava.io.tmpdir=<path> を使用して再定義できます。

指定したメモリ制限を超える大きさのワークシートを読み込むと、その内容は前述のディレクトリにある一時ファイルに保存されます。次に例を示します。 %APPDATA%\Local\Temp\poifiles\poi-zip-entry12328023392292087152.tmp

このような一時ファイルは、JVM の終了時に削除されることが指定され、クエリが終了すると明示的に削除されます。したがって、Excel クエリを現在実行していない限り、一時ディレクトリは空です。JVM プロセスを外部から終了した場合にのみ、一時ファイルが適切に削除されないことがあります。作成されるファイルの数やサイズを制限する設定はありません。

イントロスペクション中に別の形式でテキストとして検出されるフィールド

Virtual DataPort では、イントロスペクションでテキストとして検出されるフィールドが日付形式と数値形式のどちらであるかを検出し、検出された形式に基づいてフィールドの値を表示します。

この動作を無効にすることができます。日付の場合は、以下を実行する必要があります。

SET 'com.denodo.vdb.contrib.wrapper.ExcelWrapper.skipEmbeddedFormatForDates'='false';

数値の場合は、以下のコマンドを実行します。

SET 'com.denodo.vdb.contrib.wrapper.ExcelWrapper.skipEmbeddedFormatForNumbers'='false';

上記のいずれかのコマンドが実行された場合、値は無効化された形式のテキストとして表示されます。

Add feedback