前提・実現したいこと
Excelの帳票を取り込んでデータテーブルにする、というような処理があります。
- UiPathだと、Activities>Available>App Integration>Excel>Read Range
- Blue Prismだと、MS Excel VBOの、Get Worksheet as Collectionのシリーズ
- Automation Anywhereだと…… すみません、手元に環境がなくて…… Each Row in an Excel datasetとかでしたっけ……
このようなときに、ちゃんとしたテーブルに作ってくれてあれば、普通にデータテーブルに読み込めるんですが
同じ列名を何度も使用している帳票はけっこうあります。
たとえば「商品名」という列名が何度でも出てくるとか……。
そういうのだと、列名をデータテーブルのヘッダにして読み込むことができません。
このようなときに、どういう方法でデータテーブルに取り込めるところまで持っていくのがいわゆるベストプラクティスなのか?
というのをお伺いしたいです。
業務によっては2回目以降に出現した重複列名の列を削除してしまってもいいし(pythonのcolumns.duplicated()でFalseが返った列だけ選択するような)、あるいは2回目以降に出現した列名を「商品名2」「商品名3」と変更して生かしておく場合もあるかと思います。
私が考えた方法
- 1行目をヘッダにせず、データとしてデータテーブルに読み込みます(UiPathだとプロパティの「ヘッダの追加」チェックをOFF。Blue PrismだとMS Excel VBOのGet Worksheet as Collection Offsetを使い、Use Headerをfalseにする)
- どうにかして重複の列名を重複じゃないようにします
- 列名の重複がなくなったところで、1行目をヘッダにします(Blue PrismだとCollection ManipulationのSet Column Names From First Row。UiPathだと、できちゃってるDataTableの1行目をヘッダに変更するってどうやるんでしたっけ)
Blue Prismのほうは、重複列を削除してCollectionにするオブジェクトを書きました
手順1のところでやめちゃって、列名は「Column1」「Column2」…… でいいじゃんという手もありますが
それだと列名がわかりづらく……。
[2019.12.04追記]
LINQでできるらしい、というお話をどこかでちらっと見ました。
UiPathの場合はAssignのアクティビティを使えばいけそうですが、
Blue Prismは、何のステージを使って、どう書いたらいけるのでしょうか?
とりあえずdllにsysytem.linqとSystem.Data.DataSetExtensionsを入れて、名前空間にsystem.linqを入れて
コードステージにLINQを書いてみたのですが、datatable対応してない的なエラーが出てしまいます。
補足情報(FW/ツールのバージョンなど)
私の環境では、UiPathはCEで、Blue Prismは6.3で、Excelは2016で使用しています。
できればコードステージで.NETで……とか、Excel側でマクロ書いて……という方法は極力避けたいです(コードを書いてしまうと、あとのメンテナンスがたいへんになる問題につながるので)。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/20 05:00