简介:
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型数据。
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