c # Excel Wie Sie einen bestimmten Bereich finden, ohne jede Zeile / jeden datasatz durchlaufen zu müssen

Ich mache ein Werkzeug, das überprüft, ob eine vorhandene Excel-file (> 20k datasätze) eine bestimmte characterfolge in einer bestimmten Spalte enthält. Bis jetzt habe ich versucht, mit einer For-loop jede einzelne Zelle zu überprüfen, aber es dauerte fast 2 Minuten, um die Zelle zu finden.

Beispiel:

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 

mein Pseudo-Code:

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

Gibt es eine Möglichkeit, die 'Abfrage' schneller zu machen, anstatt jede Zeile zu lesen? Ich weiß, dass es in SQL etwas wie den Indexsprung-Scan gibt. Vielleicht kann ich dasselbe in c # erreichen. Danke im Voraus!

  • C # - Probleme mit Excel / InteropServices Replace-Methode
  • Unerwartetes Verhalten beim Aktualisieren interner dataverbindungen in Excel
  • Wie erfasse ich die Excel-Arbeitsmappe?
  • Warum ändert Excel meinen datesanzeigewert und wie kann ich dies verhindern?
  • Gerätetest w / Moq von Excel Interop + Type.Missing
  • C # Richtiger path zum Schließen Mehrerer Excel-objecte mit Excel-process zerstört
  • Schließen der Excel-Anwendung mit Excel Interop ohne memoryn der Nachricht
  • Holen Sie sich Letzten nicht leeren Spalten- und Zeilenindex von Excel mit Interop
  • One Solution collect form web for “c # Excel Wie Sie einen bestimmten Bereich finden, ohne jede Zeile / jeden datasatz durchlaufen zu müssen”

    Ich bin nicht besonders gut mit Excel-Automatisierung, aber vielleicht könnten Sie versuchen, die integrierte Excel-Filterfunktion zu verwenden?

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

    Auf einem bescheidenen System fand dieses "BBB", das war die letzte von 30.000 Reihen von Testdaten, in weniger als einer Sekunde.

    Spreadsheet (Microsoft Excel) makes working easy.