Excelファイルに複数のシートが含まれる際に、ロードするシートを特定する方法を紹介します。
首相官邸のページからダウンロードできる日別の実績のExcelファイルに変更がありました。
7月5日までは医療従事者等のシートが1枚含まれていました。
7月6日より、3枚のシートの内の1枚が医療従事者等になっています。
Oracle APEXはExcelのデータを操作するパッケージとして、APEX_DATA_PARSERを提供しています。
このパッケージに含まれるPARSEファンクションによって、ExcelのデータをOracle Databaseの表として扱える形に変換することができます。ファンクションですが、いわゆるパイプライン表関数なので、表(アップデートはできないので、ビューといった方が適切かも)と同様に扱うことができます。
FUNCTION PARSE(
p_content IN BLOB,
p_file_name IN VARCHAR2 DEFAULT NULL,
p_file_type IN T_FILE_TYPE DEFAULT NULL,
p_file_profile IN CLOB DEFAULT NULL,
p_detect_data_types IN VARCHAR2 DEFAULT 'Y',
p_decimal_char IN VARCHAR2 DEFAULT NULL,
p_xlsx_sheet_name IN VARCHAR2 DEFAULT NULL,
p_row_selector IN VARCHAR2 DEFAULT NULL,
p_csv_row_delimiter IN VARCHAR2 DEFAULT LF,
p_csv_col_delimiter IN VARCHAR2 DEFAULT NULL,
p_csv_enclosed IN VARCHAR2 DEFAULT '"',
p_skip_rows IN PLS_INTEGER DEFAULT 0,
p_add_headers_row IN VARCHAR2 DEFAULT 'N',
p_file_charset IN VARCHAR2 DEFAULT 'AL32UTF8',
p_max_rows IN NUMBER DEFAULT NULL,
p_return_rows IN NUMBER DEFAULT NULL,
p_store_profile_to_collection IN VARCHAR2 DEFAULT NULL ) RETURN apex_t_parser_table pipelined;
対象となるExcelファイルにシートが複数含まれている場合は、p_xlsx_sheet_nameに取り込むシート名を指定する必要があります。無指定の場合は、先頭のシートが対象になります。
このシート名ですが、Excelを開いた時に確認できるシート名ではありません。
Excelファイルに含まれるシートの情報を確認するために使用できるファンクションGET_XLSX_WORKSHEETSが、APEX_DATA_PARSERパッケージに含まれています。このファンクションを使用して、表示上のシート名から内部的なシート名を取得します。
こちらの記事にあるように、医療従事者等の接種数が記載されたExcelファイルが表COVID19_IRYO_DATAに保存されていることを前提とします。以下のコードで医療従事者等のシートの内部名が取得できます。
SQLワークショップのSQLコマンドより実行します。
結果はsheet3.xmlとなります。l_sheet_file_nameをAPEX_DATA_PARSERファンクションのp_xlsx_sheet_nameに与えることで、医療従事者等のシートのデータが読み込まれます。
ちなみに、apex_data_parser.get_xlsx_worksheets自体の実行結果は以下のようになります。
以下の結果が表示されます。SHEET_DISPLAY_NAMEがExcelから確認できるシート名、SHEET_FILE_NAMEがAPEX_DATA_PARSER.PARSEファンクションのp_xlsx_sheet_nameに与える値です。
SHEET_SEQUENCE | SHEET_DISPLAY_NAME | SHEET_FILE_NAME | SHEET_PATH |
---|---|---|---|
1 | 総接種回数 | sheet1.xml | worksheets/sheet1.xml |
2 | 一般接種 | sheet2.xml | worksheets/sheet2.xml |
3 | 医療従事者等 | sheet3.xml | worksheets/sheet3.xml |
以上になります。
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完