Excelは詰めて書きましょうというお話~dimensionタグとRead Rangeアクティビティ~

やわらかな春風を頬に感じ、心華やぐ頃になりました。寒い日があったり皆様の体調が心配です。

さて、今日もExcelのお話。

OfficeファイルはZIPファイルという事実

Excelファイルを含むOfficeファイルって実はZIPファイルということご存知でしたか。
Excelファイルを右クリックして「名前の変更」を選択し、拡張子を.xlsxから.zipに変更します。


このファイルを解凍すると、以下のファイルが出てきます。

sample
│  [Content_Types].xml
│
├─docProps
│      app.xml
│      core.xml
│
├─xl
│  │  sharedStrings.xml
│  │  styles.xml
│  │  workbook.xml
│  │
│  ├─printerSettings
│  │      printerSettings1.bin
│  │
│  ├─theme
│  │      theme1.xml
│  │
│  ├─worksheets
│  │  │  sheet1.xml
│  │  │
│  │  └─_rels
│  │          sheet1.xml.rels
│  │
│  └─_rels
│          workbook.xml.rels
│
└─_rels
        .rels

これはExcelを含むOfficeファイルが「Office Open XML」というフォーマットで策定されているためです。
リンク先にもありますが、OpenXML を標準フォーマットとして採用することで

  • Microsoft Office をインストールされていない環境でもファイルの読み書きが可能
  • zip圧縮されることでファイルサイズが小さくなる

といったメリットがあり、特にzip圧縮済みなので、メールでファイル送る時などに気を使ってZIP圧縮する必要がないのもいいですね。
社用スマフォでメール見るお客さんも多くなり、ZIPファイル化してしまうと、すぐに見れないので、そのままOfficeファイルを送ったほうがありがたられます。(ZIPパスワードを付ける必要が無い場合に限る)

UiPathのRead Rangeアクティビティ

UiPathのRead RangeアクティビティにRangeプロパティがデフォルトでは””(空)になっており、特に設定する必要がなく、Excelファイルから値の読み出しをしています。


UiPathエンジニアの皆さん、Rangeプロパティが空の時、UiPathはエクセルのどこを読み出すのだろうかと不思議に思ったことはありませんか?

以下のようなExcelファイル(個人的に好きなミュージシャン)を準備して、UiPathのRead Rangeアクティビティで読んで、Write CSVアクティビティで出力してみます。

No,名前
1,浅倉大介
2,小室哲哉
3,光田康典
4,澤野弘之
5,梶浦由記

綺麗に読み出せていますね。1行目とかA列とか自動的にスキップしてますね。
たしかに値が入っていないのでスキップしてもよさそうに思えますね。(この部分があとからハマる箇所になります)

実はUiPathがスキップさせたのではなく、Excelファイルの内部構造の中にどこにデータがあるのか定義している箇所があり、その定義された範囲をUiPathが読んでいるだけです。
では、先ほどのZIP展開したファイルの「sheet1.xml」を見てみましょう。


ここの
<dimension ref=”B2:C7″/>
というところがデータ範囲を定義しています。
なので、Read RangeアクティビティはRangeプロパティが指定されていなかった場合は自動的にdimensionタグで指定された範囲を読み込んできます。

ハマり箇所

先ほどdimensionタグは「データ範囲」と書きましたが、正しくは「書式設定を含めたすべてのデータ範囲」なのです。ためしに先ほどのExcelファイルで分かりやすくA2セルに色付けをしてみました。

これを再度拡張子をzipに変更して、解凍し、「sheet1.xml」を見てみると、


<dimension ref=”A2:C7″/>
に変更されていることが分かります。この状態のExcelファイルを再度UiPathのRead Rangeアクティビティで読んで、Write CSVアクティビティで出力してみます。

Column1,No,名前
,1,浅倉大介
,2,小室哲哉
,3,光田康典
,4,澤野弘之
,5,梶浦由記

最初のCSVと比べると、列が変わってしまいました!
Read Rangeアクティビティで読み込んだDataTableをその後、column(0)などのインデックス番号で利用している場合、列がずれてしまうと、間違った値を選んでしまうことになり不具合の元となります。

対応方法とまとめ

対応方法としては以下のとおり(できれば両方)

  • Excelのレイアウト変更が可能な場合、空行・空列を作らないようにする。(お客様でよく見た目上の問題で、空列を作ったりされますが、できたら詰めさせてもらいましょう)
  • dimensionタグが使われないように、Rangeプロパティに適切な値を入れる。

今回は分かりやすく「色付け」をしましたが、たとえば「太字(Bold)」を指定して実際の値が空の場合などは見た目上一緒なので気づきづらいです。
こういうテクニックやはまり点を意識してRPAを作っていくことは結構経験や知識が要るので、初心者の方々は上級者にどんどん聞いてレビューをしてもらうことが大切ですね。

参考URL)
https://www.maruoka-digital.jp/blogcontent/3106142055/

もっと知りたい方はこちら

ページトップ