UiPathでExcelを操作する(基本編)

#UiPathでExcelを自由に操作する(基本編)

## 概要
この記事では、UiPathからExcelをAPI経由で操作可能にするCurrentWorkbookの取得方法を説明しています。
CurrentWorkbookは、ExcelApplicationScopeの出力項目のWorkbookApplicationのクラスオブジェクトに含まれており、Microsoft.Office.Interop.ExcelのクラスのWorkbook型のプロパティです。
Microsoft.Office.Interop.Excelは以下のAPIドキュメントの通り、Excelに対して様々な操作が利用可能です。

https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.office.interop.excel.workbookclass?view=excel-pia

## お約束事項（免責事項）
- この記事は2020年6月時点の情報を基に作成しております。
- 記事の内容は私個人の見解であり、所属する組織の公式見解ではありません。

## スキル
この記事には、C#によるカスタムアクティビティの開発が含まれます。
カスタムアクティビティの開発方法は、UiPath公式のドキュメントを参照ください。
（本記事では最低限のみ記載します。）
https://docs.uipath.com/activities/lang-ja/docs/creating-a-custom-activity

## 必要なソフトウェア
- Visual Studio
- Nuget または Nuget Package Explorer
- Microsoft Office

## 手順
### 1.プロジェクトの作成
Visual Studioでクラスプロジェクトを作成します。

### 2.参照の追加
1. UiPath公式のガイド通り、「System.Activities」と「System.ComponentModel.Composition」を追加します。
2. 次に参照の追加で「COM」を選択し、「Microsoft.Excel XX Object Library」を選択します。  
※Officeがインストールされてない場合、表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/cd705298-db93-ee22-6c18-e6d2dc8bd89f.png)

### 3.実装
コードは下記のとおりです。
ビルドの仕方、Nuget Packageの作り方は割愛します。（笑）

```C#
using Microsoft.Office.Interop.Excel;
using System;
using System.Activities;
using System.ComponentModel;

namespace UiPathCustomLibrary
{
    public class GetWorkbook : CodeActivity
    {
        [Category("Input")]
        [RequiredArgument]
        public InArgument<Object> WorkbookApplication { get; set; }
        [Category("Output")]
        public OutArgument<Object> Workbook { get; set; }

        protected override void Execute(CodeActivityContext context)
        {
            object workbookapp = WorkbookApplication.Get(context);
            Workbook workbook =  workbookapp.GetType().GetProperty("CurrentWorkbook").GetValue(workbookapp) as Workbook;
            Workbook.Set(context, workbook);
        }
    }
}
```
### 4.実行確認
Nuget Package Explorerで作成したライブラリをUiPath Studioでインストールした後、早速使ってみます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/931471de-1513-6948-c5d7-513b72e0eeea.png)

現時点(2020年6月時点)では、UiPath StudioがComオブジェクトに対応してないため、Ouputパネルでは「__ComObject」と表示されていますがいたって正常です。

取得したオブジェクトの使い方は別の投稿の活用編にてご説明します。

## おまけ
### （調査方法）UiPath Studioでプロパティの情報を取得する
今回、ご紹介したCurrentWorkbookのプロパティについて調査した方法について紹介します。
まず、Excel Application Scopeのアクティビティで出力項目のWorkbookApplicationを取得します。
ここでは、変数名を「w」で定義しております。

次に、WorkbookApplicatio型に含まれるプロパティの一覧をコンソールてみます
ForEach アクティビティでitemを「p」に変更し、型をObjectからPropertyInfo型に変更します。
inの右側の項目は下図の通り、「w.GetType().GetProeprties()」を設定し、クラスオブジェクトが保持するプロパティの一覧を1件ずつ取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/e5389db2-3094-b0fd-1a47-d0133d791420.png)

実行した結果は下図のとおりです。
「CurrentWorkbook」が「Microsoft.Office.Interop.Excel.Workbook」であることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/f627ef75-0e18-77cc-f539-433404ffa1be.png)

### (失敗談) UiPathStudioでは取得できない
CurrentWorkbookからWorkbookのインスタンスをキャストして実行すると下図のとおり実行時にエラーが発生します。
これ以上先には進めません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/4a3dd382-5d83-7b1f-a0d2-66928efff07d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/4b233d5b-bc04-8fdf-8139-8da55e37ab81.png)