皆もすなるQiitaといふものを、儂もしてみむとてするなり。
と言う訳で、こん**は!はなっち!です。
【初めに】
前回、DataTableの列の並びの変更方法についてを投稿したのですが、色々と調べていて、もっと楽ちんな方法があったので、これをまとめてみようと思います。
[DataColumn]の[SetOrdinal]メソッドを使用する。
[DataColumn]の[SetOrdinal]メソッドは、DataColumn の序数または位置を、指定された序数または位置に変更するものです(※表現を変えました)。
例えば、
DataTable.Columns(0).SetOrdinal(3)
とすると、最左端の列(0番目)を、変更した結果、最左端の列を0番目として数えた3番目の列に据えることを指します(構文はイメージ)。
この起点となる列番号と、行先の列番号をしっかりコントロールすれば、列の並びをうまく変更できることになります。
前提として、列レイアウトの情報は、変数としてString型配列で定義しています。
入力のDataTableは、EXCELから読み込んだものとします。レイアウトは、以下の図とします。
その1)入力DataTableから、不要な列を削除する。
入力のDataTableから、列レイアウトの情報に無い列は、「データ列の削除」アクティビティを使用して、削除します。
ここでのポイントは、「繰り返し(コレクションの各要素)」アクティビティの「次のコレクション内の各要素」の指定です。
本来なら、対象とするテーブルに属する列のコレクションを指定するのですが、「データ列の削除」が実行されると対象とするテーブルの列のコレクションが変化し、「繰り返し(コレクションの各要素)」アクティビティに悪影響を与えます。ですので、〔対象とするテーブル〕ではなく、DataTable.Clone メソッドを使って、〔対象とするテーブルの.Cloneされたテーブル〕を指定しています。
その2)入力DataTableへ、必要な列を追加する。
列レイアウトの情報が、入力のDataTableに無い列は、「データ列の追加」アクティビティを使用して、列を追加します。列の型はObjectでいいですね。
その3)入力DataTableの列を、列の情報に合わせて列の並びを変更する。
「メソッドを呼び出し」アクティビティを使用して、DataColumn.SetOrdinal(Int32) メソッドを呼び出します。
「メソッドを呼び出し」アクティビティでは、ターゲットオブジェクトは、移動する前の列情報(序数)、コレクションとして、移動先の序数を指定します。
ターゲットオブジェクト:
DT.Columns(DT.Columns(C).Ordinal)
⇒DT.Columns(DT.Columns(列レイアウトの1つ).序数)
コレクション:
DT.Columns.Count - 1
⇒DTの列数 - 1 ... これで最終列の後ろに移動できる。
処理結果
入力DataTable
列レイアウトの情報
↓
処理結果
はい!完璧ですね!
【まとめ】
・不要な列は早めに削除してしまいましょう!
・後の処理で手間が掛からないよう、足りない列は事前に用意しておきましょう!
・SetOrdinalで、サクッと列位置を変更してしまいましょう!
おわりに
いかがでした?
この方法を使うと、変更後の列レイアウトを持った受け側のDataTableの領域を保有する事がなく、メモリの節約になるのではないか?と思うのです。しかも、実際に高速で処理できているのではないか?とも思うわけです。
とはいえ、開発者の好き好き、維持メンテする人の技量に合わせて、その方法は選択してくださいね。
今回も読んでいただきありがとうございました!
是非UiPathでのロボ開発の一助になればと思っています。
ありがとうございました!