簡介:
Excel是一種廣泛應用的表格處理軟件。本單元中,將介紹專門針對於Excel和DataTable型數據的活動以及與Excel交互的兩種不同方式等。
學習大綱:
- 如何用Read Range活動從Excel文件中讀取信息
- 如何操作DataTable
- 如何篩選表格數據
- 如何使用Append Range活動
1. 概念
1) Excel相關的活動:在App Integration - Excel分類下。

2) DataTable相關的活動:在Programming - DataTable分類下。

3) Excel Workbook (工作簿) vs. Data Table
Workbook就是Excel文件,它可以包含各種類型的數據、工作表、也可以應用各種格式、布局、合並單元格等等。
Data Table是最簡單的表格數據,只包括行、列,也可以有標題行。

2. 實例1
目標:打開一個Excel文件並顯示它的內容,最后將它存到一個新的Excel文件中。
數據:

方法:
1) 首先,讀取數據。添加一個Excel Application Scope活動。
在處理Excel文件時,添加的第一個活動總是Excel Application Scope活動。它是一個容器,其他與這個Excel文件相關的活動包括讀取、寫入等,都放在容器里運行。

2) 點擊瀏覽按鈕
並選取Excel文件。瀏覽窗口默認打開Project所在的文件夾。如果文件就在Project所在的文件夾下,部分路徑會省略。比如"xls\science.xlsx"表示Project所在文件夾下(已省略)的xls文件夾里的science.xlsx文件。
注意:Workbook Path參數也可以用變量代替來達到動態化。
3) 設置Visible參數。此處取消選擇Visible參數。
Visible參數如果選中,表示使用Microsoft Excel應用程序來讀取文件;如果未選中,則操作會在內部進行。

區別:
使用Excel程序:必須安裝Excel軟件;可在同一個文件上運行多個進程;變化實時可見。比較適合調試程序和檢測程序進度。
直接訪問:不需要安裝Excel軟件;一個文件只允許一個進程使用;只能用於xlsx格式的文件;進程在后台運行。
4) 在Excel Application Scope容器里,添加一個Read Range活動。
Read Range活動可以讀取Excel文件的一部分內容並把它存儲到一個Data Table里。

在Output里創建一個DataTable型變量DT1。在Input里,Range參數默認是空的,表示讀取整個工作表的數據,可以為它設置具體的范圍比如"A2:C3"。這里使用空值即可。

5) 接下來,顯示這個Data Table。添加一個Output Data Table活動。
雖然活動名為Output,但它不會把結果顯示在Output面板上。該活動是將DataTable型數據轉換成字符串型數據,以便於顯示它。
在Input里填上DT1,在Output里創建一個新的String型變量strDT。

6) 添加一個Message Box活動,並在Input里填入strDT,來顯示Data Table。
7) 最后,把數據保存到一個新的Excel文件里。因為是新文件,要添加一個新的Excel Application Scope容器。
指定數據寫入的Excel文件所在的路徑。如果路徑下沒有該文件,則將創建它。
8) 添加一個Write Range活動。
在Write Range活動的Input里填上需要寫入的DataTable型變量。StartingCell參數表示寫入數據的起始單元格。如果指定的單元格區域已經存在數據,Write Range會把舊的數據覆蓋掉。
AddHeaders參數:
在Read Range活動中,AddHeaders參數表示是否把第一行作為標題行;在Write Range活動里則表示,是否在寫入數據時添加標題行。

3. Excel和Data Table的其他常用活動
1) Append Range活動
和Write Range活動同樣是寫入數據,Append Range活動在工作表現有的數據之后寫入數據,不會覆蓋已有數據。

2) Build Data Table活動
該活動可以創建一個DataTable型數據。
- 單擊DataTable...按鈕以打開創建窗口。

- 默認生成一行兩列的Data Table。點擊x號可以刪除行列,點擊+號可以添加新列。

- 添加新列時會彈出New Column窗口。

- 最后將創建的DataTable保存到Output變量里。

3) Sort Data Table活動
Input填入要排序的DataTable型數據;Output用來輸出排序后的結果;Sorting Column指定要排序的列,它有三個參數,可任選一個來指定列。
- Column參數:指定實際的Column對象。
- Index參數:指定列號。注意,DataTable數據都是從0開始索引的 (0-indexed),即第一列的列號是0。
- Name參數:指定列標題。

4) Read Cell活動 / Write Cell活動

5) Select Range活動:選中單元格或單元格區域。
6) LookUp Range活動:在工作表里查找某個特定值。
4. 實例2
數據:大約有300條數據。

目標1:
篩選並顯示年齡小於30且薪水大於$100,000的記錄。
方法1:
1) 添加一個Excel Application Scope容器,在里面添加一個Read Range活動來讀取數據,將數據存儲到變量DT1中。
2) 在Excel Application Scope容器外添加一個Filter Table活動篩選數據。

Filter Rows Tab:
- Input DataTable:數據源。
- Output DataTable:篩選結果。可以和Input DataTable使用同一個變量。
- Keep Rows/Romove Rows:保留/刪除符合條件的行。
- Column:列標題,必須是String型。
- Operation:大於、小於等條件。
- Value:支持多種類型的數據,可以不是String型。
:刪除/添加新的條件。
:設置多條件篩選的邏輯:And或Or。單擊And即可切換成Or。

Output Columns Tab:
- Keep Columns/Remove Columns:保留/刪除篩選條件的所在列,此例中為Age和Pay列。
3) 添加一個Output Data Table活動和Message Box活動來顯示篩選結果。
目標2:
使用已有的數據創建一個新的DataTable,包括姓名、年齡和收入三列。
方法2:
1) 添加一個Excel Application Scope容器,在里面添加一個Read Range活動,選上Add Headers參數,將數據存儲到變量DT1中。
2) 在容器里添加一個Build Data Table活動,添加Name、Age和Income三列,並存儲到變量newDT中。
3) 在容器外添加一個For Each Row活動,在In里設置在哪個Data Table中循環。
- For Each Row活動是Data Table專用的,它可以遍歷Data Table里的每一行。For Each活動比較通用。

4) 在For Each Row活動的Body中添加三個Get Row Item活動,它可以輸出當前行里某個特定單元格的值。
- ColumnIndex:填索引號,從0開始。
- ColumnName:填列標題,前提是選中Add Headers參數。
- Row:填row即可。
*ColumnIndex和ColumnName選擇后者可以更好的適應添加/刪除列的情況。


5) 在最后一個Get Row Item活動之后添加一個Add Data Row活動。
- Array Row:要添加的信息,以數組的形式出現。此例中填入{name, age, income}。
- DataTable:要添加行的DataTable。此例中為newDT。

6) 在For Each活動的下面添加一個Excel Application Scope容器。在其中添加一個Write Range活動寫入數據。
5. 練習1
數據:

要求:通過三種不同的方式得到A列和B列單元格的和,並寫入C列。
- 方法1:Excel保持打開的狀態並實時寫入數據,你可以看見每一行的變化。
- 方法2:Excel處於關閉的狀態,將每一個列的值存儲到Datatable中,最后把得到的結果一次性寫到Excel里。
- 方法3:使用Excel公式計算。
方法1:
- 添加一個Excel Application Scope活動。填入數據所在的工作簿的完整路徑,確保Visible參數被選中。
- 在Excel Application Scope容器里添加一個Read Range活動。設置Range參數為空以讀取整個工作表,將讀取的數據存儲到變量inputsTable中。
- 在Read Range活動后添加一個For Each Row活動,設置該活動在inputsTable中循環。
- 在For Each Row容器里添加一個Assign活動。創建一個Int32型變量rowIndex,將inputsTable.Rows.Indexof(row)+1賦值給rowIndex。
- 這樣做使rowIndex的值等於目前正在For Each Row活動中循環的行在Excel中的行號。+1是因為DataTable的行號是從0開始的。
- 在Assign活動后添加兩個Get Row Item活動。
- 第一個Get Row Item活動設置ColumnIndex參數為0 (A列),Row參數為row (臨時循環變量),將讀取的數據存儲到變量valueA中。
- 第二個Get Row Item活動設置ColumnIndex參數為1 (B列),Row參數為row (臨時循環變量),將讀取的數據存儲到變量valueB中
- Below that activity, find and add two Get Row Item activities
- 添加一個Assign活動。創建變量valueC,使它等於valueA+valueB。
- 添加一個Write Value活動。設置Range參數為"C"+rowIndex.ToString,設置Value參數為valueC。


方法2:
(不使用Excel Application Scope活動,自動化在內部完成。)
- 添加一個Read Range活動,設置工作簿的路徑,創建變量 inputsTable。
- 添加一個Add Data Column活動,設置ColumnName參數為C,設置DataTable參數為inputsTable。設置Argument Type為object。

- 添加一個For Each Row活動,並在inputsTable中循環。
- 在For Each Row活動的容器中添加兩個Assign活動。一個把row(0).ToString的值賦給變量valueA;一個把row(1).ToString的值賦給變量valueB。
- row(0).ToString和row(1).ToString把對象轉換為更便利的文本型的數據。
- 再添加一個Assign活動,把Integer.Parse(valueA) + Integer.Parse(valueB)的值賦給row(2)。
- Integer.Parse是一種VB方法,可以把字符串型數據轉換為數字型數據。
- 在For Each Row活動的后面添加一個Write Range活動,設置DataTable參數為inputsTable,設置Starting Cell參數的值為空,並設置一個新的工作簿路徑。
- 如果文件不存在,UiPath會自動創建該文件。

方法3:
(使用Excel公式計算。)
- 添加一個Excel Application Scope活動。設置工作簿的路徑,選中Visbility選項。
- 在Excel Application Scope容器里添加一個Read Range活動,創建DataTable型變量inputsTable。
- 添加一個Assign活動,將 inputsTable.Rows.Count賦值給一個新的變量rowsCount。
- 添加一個Write Value活動,設置寫入的Range為:"C1:C" + rowsCount,設置寫入的值為"=SUM(A1,B1)"。
- Excel會自動將寫入的值按照行號迭代。
*本課使用的新活動、方法、函數等:
- Excel Application Scope
- Read Range
- output data table
- Write Range
- Append Range
- Build Data Table
- Sort Data Table
- Read Cell
- Write Cell
- Select Range
- LookUp Range
- Filter Table
- For Each Row
- Get Row Item
- Add Data Row
- Write Value
- Integer.Parse:VB方法,可以把字符串型數據轉換為數字型數據。
- Rows.Count
