Blazor 向け UI コンポーネントライブラリ Ignite UI for Blazor に含まれるグリッドコンポーネント、IgbGrid では、以下のように IgbGridToolbar および IgbGridToolbarExporter をマークアップすることで、
<IgbGrid ...> <IgbGridToolbar> <IgbGridToolbarActions> <IgbGridToolbarExporter /> </IgbGridToolbarActions> </IgbGridToolbar> ...
グリッドの内容を CSV 形式でダウンロード (エクスポート) できる機能と UI を追加することができます (下図)。
しかし既定では、この機能を利用してダウンロードされた CSV ファイル中、日時の列については、以下のように、グリッド上での表示とは異なる書式で記載されてしまいます。
Id,氏名,生年月日 1,Alice,Thu Nov 23 1995 00:00:00 GMT+0900 (日本標準時) 2,Bob,Sun Feb 15 1998 00:00:00 GMT+0900 (日本標準時) 3,Charlie,Tue Jul 04 2000 00:00:00 GMT+0900 (日本標準時) 4,David,Sun Oct 12 2003 00:00:00 GMT+0900 (日本標準時) 5,Eve,Sat Dec 31 2005 00:00:00 GMT+0900 (日本標準時)
CSV にエクスポートされるときの日時列の書式を制御するには、エクスポート時のデータ内容を JavaScript を使って書き換えることができる機能が IgbGrid にはありますので、この機能を応用して任意の記載に制御可能です。具体的には以下のようにします。
まず、以下のような内容の JavaScript ファイルを用意し、例えば “wwwroot/helper.js” といったファイル名で保存しておきます。
// helper.js // igRegisterScript については下記ナレッジベースを参照。 // https://kb.jp.infragistics.com/?p=12487 igRegisterScript("formatDateInRowExporting", () => { // グリッドの行エクスポートイベントを購読するオブジェクトです。 const formatDateCells = { // 1行エクスポートするごとに next メソッドが呼び出されます。 next: (context) => { // 引数から、エクスポートする行データが参照できるので、 const rowData = context.rowData; // このサンプルでは、行データ内の日付型のプロパティをすべて // 巡回し、"yyyy/MM/dd" 形式の文字列に差し替えます。 Object.keys(rowData).forEach(key => { const cellValue = rowData[key]; if (!cellValue instanceof Date) return; rowData[key] = cellValue.toLocaleString("ja-JP", { year:"numeric",month:"2-digit",day:"2-digit"}); }); } }; // グリッドがエクスポート処理を実行するときに呼び出されます return (e) => { // エクスポートするファイルがCSVファイルである場合、 const { options, exporter } = e.detail; const isCSVfile = options.fileName.endsWith(".csv"); if (!isCSVfile) return; // かつ、イベント未購読の場合に、 const observers = exporter.rowExporting.observers; if (observers.find(o=> o === formatDateCells)) return; // エクスポート機能の行エクスポートイベントに、 // 先に定義した購読オブジェクトを追加します。 observers.push(formatDateCells); }; }, true);
上記ファイル内のコメントにあるとおり、この JavaScript プログラムは、グリッドのエクスポート処理実行時のイベントを購読して、日時型のセルの値を “yyyy/MM/dd” 形式の文字列に書き換えてエクスポートする処理を実装し、これを “formatDateInRowExporting” という名前で Ignite UI for Blazor に登録しています。
こうして用意した JavaScript ファイルを、Blazor のフォールバックページ (“wwwroot/index.html” など) で、script 要素で読み込みます。このとき、”_content/IgniteUI.Blazor/app.bundle.js” の script 要素よりあとで参照するようにしてください。
<!-- wwwroot/index.html --> ... <script src="_content/IgniteUI.Blazor/app.bundle.js"></script> <script src="_framework/blazor.webassembly.js"></script> <!-- 👇 用意した .js ファイルを script 要素で読み込み --> <script src="helper.js"></script> </body> </html>
あとは、IgbGrid 側で、上記で実装・登録したスクリプトの名前 (この例では “formatDateInRowExporting”) を “ToolbarExportingScript” パラメーターに指定します。
<IgbGrid ... ToolbarExportingScript="formatDateInRowExporting"> ...
こうすることで、このグリッドからのエクスポート時は、指定された名前のスクリプトがそのエクスポート処理のたびに呼び出され、その指定された名前の JavaScript プログラムがエクスポートされる内容を書き換えながら (つまり、日時型のセルの値を書式化しながら) エクスポートが遂行されます。結果、以下のような CSV ファイルが得られます。
Id,氏名,生年月日 1,Alice,1995/11/23 2,Bob,1998/02/15 3,Charlie,2000/07/04 4,David,2003/10/12 5,Eve,2005/12/31
プログラム全体のソースコードは以下から参照できます。