Как использовать метод .Find() с похожим выражением с помощью С#

ищет строку в диапазоне файлов excel с похожим выражением

Пример

Файл Excel выглядит следующим образом:

----------------------------------------------------------
 # |     A     |      B      |      C      |      D      |
----------------------------------------------------------
 1 | A VALUE1  |   B VALUE1  |   C VALUE1  |   D VALUE1  |
----------------------------------------------------------
 2 | A VALUE2  |   B VALUE2  |   C VALUE2  |   D VALUE2  |
----------------------------------------------------------

теперь то, что я хочу сделать, это ввести эту строку B VALUE2 C VALUE2 в TB_Search_Text.Text для ее поиска

UPDATE

вот еще несколько объяснений для случая

Значение второй строки C VALUE2 может существовать или нет, что я имею в виду

если я нашел B VALUE2 и C VALUE2 вместе

ИЛИ B VALUE2

ИЛИ C VALUE2

все эти предыдущие строковые случаи будут считаться совпадающими. Я не могу объединить две строки, потому что он будет игнорировать последние два матча

для метода ниже он вернет строку, которая не найдена, так что я должен сделать, чтобы она работала?

    Microsoft.Office.Interop.Excel.Application oXL = new Microsoft.Office.Interop.Excel.Application();
    Microsoft.Office.Interop.Excel.Workbook oWB;
    Microsoft.Office.Interop.Excel.Range currentFind = null;
    Microsoft.Office.Interop.Excel.Range firstFind = null;

    Excel.Range oRng = oXL.get_Range("A1", "XFD1048576");

    currentFind = oRng.Find(TB_Search_Text.Text,
                            missing,
                            Excel.XlFindLookIn.xlValues,
                            Excel.XlLookAt.xlPart,
                            Excel.XlSearchOrder.xlByRows,
                            Excel.XlSearchDirection.xlNext,
                            false,
                            missing,
                            missing);

Ответ 1

Если вы ищете какой-либо из 3-х оппонентов - конкатенированные или одиночные значения, вы можете просто попробовать следующее:

  • Прочитайте два значения из книги и напишите их в список на С#. (в приведенном ниже коде я их закодировал)
  • Затем цикл внутри списка, пока вы не найдете что-то или список пуст. Это условие цикла:

while (currentFind == null & cnt < lookForList.Count)

  • В конце напечатайте строку и столбец, чтобы увидеть, что вы что-то нашли.

using System;
using System.Collections.Generic;
using Excel = Microsoft.Office.Interop.Excel;

class StartUp
{
    static void Main()
    {
        Excel.Application excel = null;
        excel = new Excel.Application();
        excel.Visible = true;        
        string filePath = @"C:\YourOwnPath\TestWB.xlsx";
        Excel.Workbook wkb = null;
        wkb = Open(excel, filePath);

        string part1 = "some value";
        string part2 = "some other value";
        string part12 = string.Concat(part1, part2);
        List<string> lookForList = new List<string> { part1, part2, part12 };
        Excel.Range currentFind = null;
        Excel.Range searchedRange = excel.get_Range("A1", "XFD1048576");
        int cnt = 0;
        while (currentFind == null & cnt < lookForList.Count)
        {
            //make sure to specify all the parameters you need in .Find()
            currentFind = searchedRange.Find(lookForList[cnt]);
            cnt++;
        }
        if (currentFind!=null)
        {
            Console.WriteLine("Found:");
            Console.WriteLine(currentFind.Column);
            Console.WriteLine(currentFind.Row);
        }        
        wkb.Close(true);
        excel.Quit();
    }

    public static Excel.Workbook Open(Excel.Application excelInstance, 
                            string fileName, bool readOnly = false, bool editable = true, 
                            bool updateLinks = true)
    {
        Excel.Workbook book = excelInstance.Workbooks.Open(
            fileName, updateLinks, readOnly,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, editable, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing);
        return book;
    }
}

В общем случае, если вы хотите подражать Like от SQL, тогда xlXlLookAt.xlPart будет делать достаточно. Вам даже не нужно конкатенировать два значения, которые вы ищете.


Если вы хотите найти и то, и другое с некоторым пространством, то объединение их выглядит как хорошая идея:

string concatenated = string.Concat(oWB.Range["B2"].Value2, " ", oWB.Range["C2"].Value2)

или

currentFind = oRng.Find(concatenated,
                                            missing,
                                            Excel.XlFindLookIn.xlValues,
                                            Excel.XlLookAt.xlPart,
                                            Excel.XlSearchOrder.xlByRows,
                                            Excel.XlSearchDirection.xlNext,
                                            false,
                                            missing,
                                            missing);

String Concat MSDN