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

プログラム全体のソースコードは以下から参照できます。

Tagged:

製品について

Ignite UI for Blazor