Katalon Studio でエクセルファイルの読み書き ( 無料プラグイン使用 ) 

## 概要
Katalon Studioではデータ駆動テストの機能が元々備わっており
エクセルファイルを簡単にテストデータとして読み込む仕組みがありますが、
今回はそれと違って
「エクセルファイル内をスクレイピングしたいんだ」
「独自のアウトプットをxlsxで出力したいんだ」
のような時、スムーズに自由に実現できるように無料プラグインでの読み書きを紹介します。

（"エクセルファイルのスクレイピングなんて、別のシステムでやりゃいいだろう" という意見は置いといて、なんか、あるんですよきっと、やりたいことが！）

##プラグインのインストール

KatalonStudioでのプラグインはログインしているアカウントに紐づいており、
アカウントに紐づくプラグインが自動的に入手される仕組みになっていますので
まずはKatalon Storeにログインしましょう。

Katalon Store
https://store.katalon.com/

ログイン後、以下でプラグインをインストールします。

Excel Keywords
https://store.katalon.com/product/34/Excel-Keywords

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699916/5fe521a3-0bb5-ea11-94d4-4d11f1e731f8.png)


これだけではまだ、ローカルで動いているKatalonStudioには何も変化がないので以下でリロードしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699916/50fc0af8-3ec6-9105-3781-c3781536373f.png)

完了すると、このように「Excel Keywords」が追加されていることを確認できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699916/af2d6e29-bc82-a8bc-5073-1205981939cf.png)


## 公式のテストケースサンプル

Excel Keywordsのプラグインページにて、 [サンプル](https://github.com/nhannguyenth/katalon-excel-keyword/tree/master/ExcelPluginSample/ "サンプル") の共有があります。
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699916/cd7d3bc7-d3aa-2b6b-5189-45dff5963c90.png)

細かく見たい方は上記をどうぞ。
私からは以下で簡単な使用例だけ紹介しようと思います。

## 具体的にテストケース内での使用方法
では実際にどう使うかやってみましょう。
テストケースの最初に以下の様にimportを書くことで「ExcelKeywords」クラスが使えるようになります。

```
import com.kms.katalon.keyword.excel.ExcelKeywords as ExcelKeywords
```

「ExcelKeywords.」と入力して「ctrl」+スペースキーを押せば候補が色々あることが見れるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699916/a3375065-be8f-9752-8c00-c64efa362195.png)

###ファイル作成と値の入力

```
import com.kms.katalon.keyword.excel.ExcelKeywords as ExcelKeywords

'ブック名を用意'
String bookname = 'testbook';

'ファイル保存用のパス--階層に必要なフォルダは予め用意'
String file_path = 'my_folder'+ '/'+bookname+'.xlsx'

'シート名を用意'
String sheetname = 'testsheet';

'ファイルを作成する'
ExcelKeywords.createExcelFile(file_path)

'ブックを取得する'
def workbook = ExcelKeywords.getWorkbook(file_path)

'取得したブックにシートを作成（シート名を指定）'
ExcelKeywords.createExcelSheet(workbook, sheetname)

'シートを取得'
def sheet = ExcelKeywords.getExcelSheet(workbook, sheetname)



// セルのインデックス指定で書き込みたいとき--------------------------------------------------
'0行目の0列目であるA1にtestと書き込む'
ExcelKeywords.setValueToCellByIndex(sheet, 0, 0, 'test')

// セルのアドレス指定でまとめて書き込みたいとき------------------------------------------------
'書き込み用の配列を用意'
Map content = new HashMap<String, ArrayList>()
'アドレスと値を追加していく'
content.putAt('A2', 'テストデータ1')
content.putAt('B1', 'テストデータ2')

'用意した配列でシートに書き込む'
ExcelKeywords.setValueToCellByAddresses(sheet, content)


// セルのアドレス指定で書き込みたいとき------------------------------------------------------
'シート、アドレス、文字列 を指定して書き込む'
ExcelKeywords.setValueToCellByAddress(sheet,'C1', 'C1に書き込みたい')





'最後にファイルを保存する'
ExcelKeywords.saveWorkbook(file_path, workbook)
```


上記を実行すると以下のようなデータが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699916/1b3a53e3-84e5-c88a-4374-1b3673996202.png)

### ファイル新規作成ではなく編集がしたい

これは上述のコードとほとんど変わりません。
以下の部分を書かずに

```
'ファイルを作成する'
ExcelKeywords.createExcelFile(file_path)
```

以下で既存のファイルパスを指定するだけです。

```
'ブックを取得する'
def workbook = ExcelKeywords.getWorkbook(file_path)
```

### ファイル作成すると出てくる「sheet0」が邪魔なんだけど。。
シートの作成はExcelKeywordsの処理にありましたが、何故かシートの削除は探せませんでした。
なので私はworkbookを取得後に以下で「0番目のシートを削除」しました

```
workbook.removeSheetAt(0)
```

### 既存のファイルから値を読み取る
値を読み取る場合もセルのアドレスを指定する方法と、
インデックスを指定する方法が用意されています。
ループを回して複数確認する場合はインデックス指定が簡単ですね。


```
import com.kms.katalon.keyword.excel.ExcelKeywords as ExcelKeywords

'ブック名を用意'
String bookname = 'testbook';

'ファイル保存用のパス--階層に必要なフォルダは予め用意'
String file_path = 'my_folder'+ '/'+bookname+'.xlsx'

'シート名を用意'
String sheetname = 'testsheet';


'ブックを取得'
def workbook = ExcelKeywords.getWorkbook(file_path)

'シートを取得'
def sheet = ExcelKeywords.getExcelSheet(workbook, sheetname)

// アドレスを指定してセルの値を確認する場合     ---------------------------------
'値を取得'
String ValueByAddress = ExcelKeywords.getCellValueByAddress(sheet, 'A1')
System.out.println(ValueByAddress) // Consoleへの出力「test」

// 行と列のINDEXを指定してセルの値を確認する場合     ---------------------------
'値を取得'
String ValueByIndex = ExcelKeywords.getCellValueByIndex(sheet, 0, 0)
System.out.println(ValueByAddress) // Consoleへの出力「test」

// A列の値を全て確認する場合     ---------------------------------
'最大行数を確認'
int row_num = sheet.getLastRowNum()
for(int i=0; i<row_num; i++){
	'シート、行番号、列番号を指定して値を取得'
	String value = ExcelKeywords.getCellValueByIndex(sheet, i, 0)
	System.out.println(value)
}

// 1行目（ getRow(0) ）の値を全て確認する場合    --------------------

'最大列数を確認'
int col_num = sheet.getRow(0).getLastCellNum()

for(int i=0; i<col_num; i++){
	'シート、行番号、列番号を指定して値を取得'
	String value = ExcelKeywords.getCellValueByIndex(sheet, 0, i)
	System.out.println(value)
}

```


以上になります。
ありがとうございました。