Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#Excel如何在不遍历每一行/记录的情况下查找特定范围_C#_Excel_Excel Interop - Fatal编程技术网

c#Excel如何在不遍历每一行/记录的情况下查找特定范围

c#Excel如何在不遍历每一行/记录的情况下查找特定范围,c#,excel,excel-interop,C#,Excel,Excel Interop,我正在制作一个工具,用于检查现有excel文件(>20k记录)是否在特定列中包含特定字符串。 到目前为止,我已经尝试使用for循环来检查每个单元格,但找到单元格几乎花了2分钟 例如: row name price ------------------------- 7000 AAA 10 7001 AAA 5 7002 AAA 10 7003 AAA 5 7004 AAA 10 7005 AAA 1

我正在制作一个工具,用于检查现有excel文件(>20k记录)是否在特定列中包含特定字符串。 到目前为止,我已经尝试使用for循环来检查每个单元格,但找到单元格几乎花了2分钟

例如:

row     name    price
-------------------------
7000    AAA     10
7001    AAA     5
7002    AAA     10
7003    AAA     5
7004    AAA     10
7005    AAA     10
7006    AAA     10
7007    BBB     5
7008    BBB     5
7009    AAA     10
7010    BBB     5
...
30000   AAA     10
我的伪代码:

 static void Main(string[] args) {
            var xlApp = new Excel.Application();
            var xlWorkbook = xlApp.Workbooks.Open(@"A_PATH");
            Excel._Worksheet xlWorksheet = xlWorkbook.Sheets[1];
            var xlRange = xlWorksheet.UsedRange;

            int lastRow = xlWorksheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell).Row;
            for (int i = 2; i < lastRow; i++) {
                if(xlRange.Cells[i, 1].Value2 != null) {
                    string value = xlRange.Cells[i, 1].Value2.ToString();
                    if(value == "BBB") {
                        Console.WriteLine(((Excel.Range)xlRange.Cells[i, 3]).Value2.ToString());
                    }
                }
            }
            Console.ReadLine();
        }
static void Main(字符串[]args){
var xlApp=new Excel.Application();
var xlWorkbook=xlApp.Workbooks.Open(@“A_路径”);
Excel._工作表xlWorksheet=xlWorkbook.Sheets[1];
var xlRange=xlWorksheet.UsedRange;
int lastRow=xlWorksheet.Cells.SpecialCells(Excel.XlCellType.XlCellType lastcell).Row;
对于(int i=2;i
那么,有没有一种方法可以让“查询”更快,而不是读取每一行? 我知道在SQL中有类似于索引跳过扫描的东西。也许我可以在c#中实现同样的效果。
提前谢谢

我对Excel自动化不是很在行,但是您可以尝试使用内置的Excel筛选功能吗

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Microsoft.Office.Interop.Excel;

    namespace ExcelTest1
    {
        class Program
        {
            static void Main(string[] args)
            {
                var excel = new Microsoft.Office.Interop.Excel.Application();
                excel.Visible = true;
                var book = excel.Workbooks.Open(@"D:\test.xlsx");
                var sheet = book.Sheets[1];
                var range = sheet.UsedRange;

                //Filter the sheet itself.                
                range.AutoFilter(Field: 2, Criteria1: "BBB");
                //and get only visible cells after the filter.
                var result = range.SpecialCells(XlCellType.xlCellTypeVisible, Type.Missing);
                Console.WriteLine(result.Rows.Count);
                foreach (Range row in result.Rows)
                {
                    Console.WriteLine(row.Cells[1,3].Value2());
                }
                book.Close(SaveChanges:false);
                excel.Quit();
                Console.ReadLine();
            }
        }
    }

在一个普通的系统上,这在不到一秒钟的时间内找到了“BBB”,它是30000行测试数据中的最后一行。

也许首先对字符串进行排序,然后进行二进制搜索可以提供更好的结果。我知道它提供了更好的结果,但我不知道您是否能够更改行的位置。如果这对您来说不是问题,请尝试对行进行排序并进行二进制搜索。您是否尝试过使用?我不太知道二进制搜索是什么,我很快用谷歌搜索了它,但如果您有一个预定义的列表,如list(),这是可能的。因此,基本上我必须将forloop中的每个结果都添加到列表中,然后才能进行二进制搜索。“我查对了吗?”安德鲁我查对了,但它真的有用吗?例如:假设“BBB”位于单元格1和最后一个单元格,范围仍然是从开始到整个单元格,不?Edward,不,我不是要将单元格中的所有文本加载到内存列表中,请使用xlRange.Sort(…)方法对excel文档中的单元格进行排序,然后实现基本的二进制搜索算法。此处记录了一个简单的实现:。迭代方法将更容易适应您的情况。是的,这种方法需要在单元格中循环多次进行排序。但是在分类一次之后,你会在很短的时间内找到你想要的。我正在测试这个,正如我们所说的,但是看起来这个方向是正确的,谢谢!如果这最终起作用,那么将其标记为解决方案:)就像一个符咒一样工作,实际上,使用真实数据只需1秒。非常感谢你!太好了,很高兴这有帮助。