用uipath软件对数据表匹配操作问题

用uipath对两个表数据操作,
数据表a备注包含数据表b单号后四位且数据表a的金额等于数据表b的金额,就在数据表a类别更新为到付,数据表b付款渠道更新为收款码,日期为数据表a的日期。如何实现

img

可以借鉴下

Exactly - 用于选择要查找的确切的连续出现次数。例如,如果要搜索的文本是“lorem”且“量词”设为“精确次数”2,则向导会在“测试文本”框中找到任何出现“loremlorem”的结果。
Any (0 or more) - 用于高亮显示连续找到的任意数量的匹配项,次数从 0 开始。
At least one (1 or more) - 用于高亮显示连续找到的任意数量的匹配项,次数从 1 开始。
Zero or one - 仅高亮显示连续出现一次的搜索词。
Between X and Y times - 用于高亮显示所选择的连续出现次数。例如,若搜索“ipsum”并选择“23 次之间”,则系统仅会高亮显示


https://blog.csdn.net/baidu_33146219/article/details/126107700

可以使用 UiPath 的数据表操作和条件判断来实现这个需求,具体步骤如下:

使用 Excel 应用程序作为数据源,使用“读取范围”活动读取数据表 A 和数据表 B 中的数据。

使用“循环行”活动循环遍历数据表 A 的每一行数据。

在循环中,使用“筛选数据表”活动筛选数据表 B 中备注包含当前数据表 A 行单号后四位的数据行。

再使用“筛选数据表”活动筛选数据表 B 中金额等于当前数据表 A 行金额的数据行。

如果筛选结果不为空,则说明找到了匹配的数据行,使用“更新数据行”活动更新数据表 A 中当前行的类别为到付,数据表 B 中筛选结果的付款渠道为收款码,日期为数据表 A 中的日期。

如果筛选结果为空,则说明没有找到匹配的数据行,跳过当前数据表 A 行的处理。

循环结束后,使用“写入范围”活动将更新后的数据表 A 和数据表 B 写回到 Excel 中保存。

下面是具体的实现步骤:

使用“读取范围”活动读取数据表 A 和数据表 B 中的数据,分别存储到两个 DataTable 变量 dtA 和 dtB 中。

使用“循环行”活动遍历 dtA 中的每一行数据,对于每一行数据,执行以下操作:

从当前行中获取单号后四位作为关键字,使用“筛选数据表”活动筛选在 dtB 中备注包含该关键字的数据行,将结果存储到 DataTable 变量 dtBFiltered1 中。

再使用“筛选数据表”活动筛选在 dtBFiltered1 中金额等于当前行金额的数据行,将结果存储到 DataTable 变量 dtBFiltered2 中。

如果 dtBFiltered2 的行数大于 0,则说明找到了匹配的数据行,使用“更新数据行”活动更新 dtA 中当前行的类别为“到付”,dtBFiltered2 中的付款渠道为“收款码”,日期为 dtA 中的日期。

如果 dtBFiltered2 的行数等于 0,则说明没有找到匹配的数据行,跳过当前行的处理。

循环结束后,使用“写入范围”活动将更新后的 dtA 和 dtB 写回到 Excel 中保存。

下面是具体的实现步骤的代码示例:

' 读取数据表 A 和数据表 B
Dim dtA As DataTable = New DataTable()
Dim dtB As DataTable = New DataTable()
dtA = ExcelReadRange("A1", "D" & LastRowA, "Sheet1", "True")
dtB = ExcelReadRange("A1", "D" & LastRowB, "Sheet2", "True")

' 遍历数据表 A 的每一行数据
For Each rowA As DataRow In dtA.Rows
    ' 获取当前行的单号后四位作为关键字
    Dim key As String = rowA("单号").ToString().Substring(rowA("单号").ToString().Length - 4)

    ' 筛选在数据表 B 中备注包含该关键字的数据行
    Dim dtBFiltered1 As DataTable = dtB.AsEnumerable().Where(Function(r) r.Field(Of String)("备注").Contains(key)).CopyToDataTable()

    ' 筛选在 dtBFiltered1 中金额等于当前行金额的数据行
    Dim dtBFiltered2 As DataTable = dtBFiltered1.AsEnumerable().Where(Function(r) r.Field(Of Double)("金额") = rowA("金额")).CopyToDataTable()

    ' 如果找到了匹配的数据行,则更新数据表 A 和数据表 B
    If dtBFiltered2.Rows.Count > 0 Then
        ' 更新数据表 A 中当前行的类别为“到付”
        rowA("类别") = "到付"

        ' 更新数据表 B 中匹配的数据行的付款渠道为“收款码”,日期为数据表 A 中的日期
        For Each rowB As DataRow In dtBFiltered2.Rows
            rowB("付款渠道") = "收款码"
            rowB("日期") = rowA("日期")
        Next
    End If
Next

将更新后的数据表 A 和数据表 B 写回到 Excel 中保存
ExcelWriteRange(dtA, "A1", "D" & LastRowA, "Sheet1", "True")
ExcelWriteRange(dtB, "A1", "D" & LastRowB, "Sheet2", "True")
需要注意的是,上述代码中的 ExcelReadRange 和 ExcelWriteRange 函数分别用于读取和写入 Excel中的数据,需要使用 UiPath 的 Excel 应用程序作为数据源,并将“启用活动筛选器”参数设置为 True,以支持数据表筛选操作。此外,代码中的 LastRowA 和 LastRowB 分别表示数据表 A 和数据表 B 的最后一行行号,需要根据实际情况进行设置。

另外,如果数据表 A 和数据表 B 的数据量较大,上述方法可能会比较耗时。可以考虑使用 LINQ 查询或者数据库查询等方法来提高效率。

以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:

  1. 添加必要活动
    需要使用到的活动包括:
  • Read Data Table:读取数据表
  • For Each Row:遍历每一行
  • If:条件判断
  • Assign:赋值
  • Update Cell:更新单元格的值
  • Write Data Table:写入数据表
  1. 读取数据表a和b,存储在aTable和bTable变量中
    使用Read Data Table活动读取数据表a和b,分别存储在aTable和bTable变量中。
  2. 遍历aTable,提取备注中的后四位到note变量
    使用For Each Row遍历aTable的每行,使用Assign活动将当前行备注中的后四位提取出来,存储在note变量中。
  3. 遍历bTable,判断单号是否包含note且金额相等
    在内层For Each Row活动中,使用If活动判断:
  • 当前行的单号是否包含note变量的值
  • aTable当前行的金额是否等于bTable当前行的金额
    如果两个条件都满足,则找到匹配行。
  1. 更新aTable的类别和bTable的付款渠道及日期
    匹配行找到后,使用Update Cell活动更新:
  • aTable当前行的类别为到付
  • bTable当前行的付款渠道为收款码
  • bTable当前行的日期为aTable当前行的日期
  1. 写出更新后的aTable和bTable

最后使用Write Data Table活动将更新后的aTable和bTable数据表写入文件。

这属于一个典型的基于条件匹配的两表更新操作,涉及到数据读取、条件判断、单元格更新以及数据表导出等内容。
UiPath作为一款易用的RPA开发工具,拥有丰富的数据操作活动,可以很好的帮助我们完成这类工作流自动化需求。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先,需要打开数据表a和数据表b,可以使用Excel Application Scope activity,在其中嵌套Read Range activity,来读入两个数据表的数据,每个表格分别存放在一个DataTable变量中。

接下来,需要进行数据匹配操作。可以使用For Each Row activity,先循环数据表a中的每一行(即每个DataRow),再嵌套一个For Each Row activity,在其中循环数据表b的每一行,判断如果数据表a中的备注包含数据表b的单号后四位,且数据表a的金额等于数据表b的金额,则进行更新操作。

更新操作可以使用Assign activity,将数据表a的类别更新为到付,数据表b的付款渠道更新为收款码,日期更新为数据表a的日期。

最后,需要将更新后的数据写回到Excel文件中。同样使用Excel Application Scope activity,在其中嵌套Write Range activity,来将更新后的数据写回到Excel文件中。

以下是参考代码:

//读取数据表a
DataTable dtA = new DataTable();
Excel.Application excelAppA = new Excel.Application();
Excel.Workbook workbookA = excelAppA.Workbooks.Open("数据表a路径");
Excel.Worksheet worksheetA = workbookA.Worksheets[1];
Excel.Range rangeA = worksheetA.UsedRange;
Excel.Range rowA;
for (int i = 2; i <= rangeA.Rows.Count; i++)
{
    rowA = ((Excel.Range)rangeA.Cells[i, 1]);
    DataRow drA = dtA.NewRow();
    drA[0] = rowA.Cells[1, 1].Value2.ToString();
    drA[1] = rowA.Cells[1, 2].Value2.ToString();
    //......读取表格中的其他数据
    dtA.Rows.Add(drA);
}

//读取数据表b
DataTable dtB = new DataTable();
Excel.Application excelAppB = new Excel.Application();
Excel.Workbook workbookB = excelAppB.Workbooks.Open("数据表b路径");
Excel.Worksheet worksheetB = workbookB.Worksheets[1];
Excel.Range rangeB = worksheetB.UsedRange;
Excel.Range rowB;
for (int i = 2; i <= rangeB.Rows.Count; i++)
{
    rowB = ((Excel.Range)rangeB.Cells[i, 1]);
    DataRow drB = dtB.NewRow();
    drB[0] = rowB.Cells[1, 1].Value2.ToString();
    drB[1] = rowB.Cells[1, 2].Value2.ToString();
    //......读取表格中的其他数据
    dtB.Rows.Add(drB);
}

//数据匹配和更新
foreach (DataRow rowA in dtA.Rows)
{
    foreach (DataRow rowB in dtB.Rows)
    {
        if (rowA["备注"].ToString().Contains(rowB["单号"].ToString().Substring(rowB["单号"].ToString().Length - 4)) && rowA["金额"].ToString() == rowB["金额"].ToString())
        {
            rowA["类别"] = "到付";
            rowB["付款渠道"] = "收款码";
            rowB["日期"] = rowA["日期"];
        }
    }
}

//写回到Excel文件中
Excel.Application excelAppWriteBack = new Excel.Application();
Excel.Workbook workbookWriteBack = excelAppWriteBack.Workbooks.Open("数据表a路径");
Excel.Worksheet worksheetWriteBack = workbookWriteBack.Worksheets[1];
Excel.Range rangeWriteBack = worksheetWriteBack.UsedRange;
Excel.Range rowWriteBack;
int rowWriteBackIndex = 2;
foreach (DataRow rowA in dtA.Rows)
{
    rowWriteBack = ((Excel.Range)rangeWriteBack.Cells[rowWriteBackIndex, 1]);
    rowWriteBack.Cells[1, 1].Value2 = rowA[0].ToString();
    rowWriteBack.Cells[1, 2].Value2 = rowA[1].ToString();
    //......写回表格中的其他数据
    rowWriteBackIndex++;
}
workbookWriteBack.Save();
workbookWriteBack.Close();

如果我的回答解决了您的问题,请采纳!