【问题标题】:How to use .Find() method with like expression using c#如何使用 .Find() 方法与使用 c# 的类似表达式
【发布时间】:2018-02-21 08:59:53
【问题描述】:

在 excel 文件范围内查找带有类似表达式的字符串

例子

文件excel如下所示:

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

现在我要做的是在TB_Search_Text.Text中输入这个字符串B VALUE2 C VALUE2来搜索它

更新

这里有更多关于这个案例的解释

第二个字符串值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);

【问题讨论】:

    标签: c# excel .net-3.5


    【解决方案1】:

    如果您正在寻找 3 个选项中的任何一个 - 连接或单个值,您可以简单地尝试以下方法:

    • 从工作簿中读取两个值并将它们写入 C# 中的列表。 (在下面的代码中,我对它们进行了硬编码)
    • 然后在列表中循环,直到找不到任何内容或列表为空。这是循环的条件:

    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;
        }
    }
    

    一般来说,如果你想模仿 SQL 中的 Like,那么 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

    【讨论】:

    • 它不会帮助我的朋友,因为第二个字符串值C VALUE2 可能存在或不存在,如果我发现B VALUE2 C VALUE2 更难 B VALUE2 OR C VALUE2 所有这些先前的字符串情况都将被视为匹配.. 如果我连接两个字符串,它将忽略最后两个匹配
    • @sam - 我明白你的意思。现在看起来好多了。 :)
    • 你对我的朋友xlXlLookAt.xlPartLike 来自SQL 但在同一列中但如果值来自两个或更多列将失败......我真正想要的是像 string concatenated = string.Concat(oWB.Range["B2"].Value2, " ", oWB.Range["C2"].Value2) 在值之间使用 or 选项
    • 我尝试了List&lt;string&gt; 的建议,但直到现在我遇到了一些错误并且事情变得复杂,因为这种方法获取数据并不那么简单
    • 顺便说一句,当我使用string.Concat 时,该字符串无法与xlXlLookAt.xlPart 一起使用,当字符串B VALUE2C VALUE2 等于sam dev 时,它也会失败示例,它不会找到@ 987654343@ 因为它将连接字符串并在一列而不是多列中查找它我认为应该有办法连接来自 excel 表的同一列
    【解决方案2】:

    你能不能在上面的程序中,把Range中最后一个单元格信息改成下面提到的那个试试。

    Application.get_Range("A1", "D2");

    您可能还想查看给定 How to: Programmatically Search for Text in Worksheet Ranges 的示例

    【讨论】:

    • 我实际上检查了您在此处发布之前建议的示例......并且Application.get_Range它与'oXL'相同我已经声明它......更新后包含声明Microsoft.Office.Interop.Excel.Application oXL = new Microsoft.Office.Interop.Excel.Application();跨度>
    猜你喜欢
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多