如何找到一个特定的范围,而不是遍历每一行/记录

本文关键字:遍历 一行 记录 何找 一个 范围 | 更新日期: 2023-09-27 18:09:27

我正在制作一个工具,检查现有的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();
        }

所以有一种方法,我可以使"查询"更快,而不是读取每一行?我知道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",这是30,000行测试数据中的最后一行。