Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
yumy1945
Contributor III
Contributor III

Qlikviewに取り込んだエクセルファイルのシート名取得について

お世話になります。

Qlikviewでエクセルファイルを取り込み、ファイル名とシート名を項目として取得をしたいです。

ファイル名はFilename()でいけるのですが、シート名の取得方法がわかりません。

ご教授頂ければと思います。

よろしくお願いします。

6 Replies
hka
Employee
Employee

kentaroWakamatsu
Creator II
Creator II

QV内の関数のみで取得する場合は、取り込みタイミング等、限定される状況がありそうですが、以下のような方法をとれば取得可能なケースはあります。

 

//サンプル:::::::::::::::::::::::::::
//テーブル名は記述せずに取得します。これによりQV側が自動的にシート名をテーブル名にします。
NoConcatenate
LOAD 項目A,
項目B
FROM
[サンプルファイル.xlsx]
(ooxml, embedded labels, table is テーブルA);
//NoOfTables関数で取得した取得済みテーブル数を使って、最後に取得したテーブル名を取得します。
LET V_TableName = chr(91)&TableName(NoOfTables()-1)&chr(93);
//変数に入れたテーブル名をJOINします。
Left Join ($(V_TableName))
LOAD '$(V_TableName)' as シート名A
AutoGenerate(1);

 

添付ファイルでは、テーブルA、テーブルB、テーブルC、テーブルDを読み込んで、同一レイアウトのテーブルB、CやResident句で再読込したときにきちんと動作するか確認してみたのですが、本来テーブルDとなるはずのテーブル名が正しく取得できていませんでした。

以上のように、スクリプトの配置箇所によっては問題が発生する可能性があるので、ご注意下さい。

 

 

kentaroWakamatsu
Creator II
Creator II

該当ファイル取り込み前にODBC接続してSQLTABLESステートメントでシート名を取り出しておいて、このシート名を利用してデータを取り込むようにすれば、シート名とひもづける事ができました。

//サンプル  ::::::::::::::::::::::::::::::::::::::::::::::::::

ODBC CONNECT32 TO [Excel Files;DBQ=C:\Users\............\サンプルファイル.xls]; //ファイルのフルパスを入れてください

TEMP:
SQLTABLES;

LET V_Rows = NoOfRows('TEMP');

FOR i = 1 to $(V_Rows)
LET V_SheetName = Peek('TABLE_NAME',$(i)-1,'TEMP');
LET V_TableName = chr(91)&PurgeChar('$(V_SheetName)','$')&chr(93);

$(V_TableName):
LOAD *,
TextBetween('$(V_TableName)',chr(91),chr(93)) as シート名
FROM
[C:\Users\...............\サンプルファイル.xls] //ファイルのフルパスを入れてください
(biff, embedded labels, table is '$(V_SheetName)');
NEXT

DROP Fields DATA_SOURCE, REMARKS, TABLE_CAT, TABLE_NAME, TABLE_SCHEM, TABLE_TYPE;

 

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

'TEMP:' と 'SQLTABLES;' の記述行にエラーのラインが表示されますが、これは気にしなくても大丈夫です。

yumy1945
Contributor III
Contributor III
Author

情報ありがとうございました。
やはりODBC接続する手法しかないようですね。
yumy1945
Contributor III
Contributor III
Author

ありがとうございました。
シートが大量にあるため、頂いた手法では取得したい状況とは異なる結果が出てしまいました。
ただ今後も使えそうな構文のため参考にさせて頂きます。
yumy1945
Contributor III
Contributor III
Author

ありがとうございました。
エクセルをODBC接続で全シートをループさせてシート名を取得するという方法をとっていたのですが、若干時間が掛かるためなんとか関数のみでできないかと考えておりました。
やはりODBC接続する手法しかないようですね。