Laden...

Performant in einer Excel Tabelle suchen

Erstellt von aloneboy vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.851 Views
A
aloneboy Themenstarter:in
27 Beiträge seit 2014
vor 4 Jahren
Performant in einer Excel Tabelle suchen

Hallo zusammen,
komme nicht wirklich weiter möchte gerne in einer Excel Tabelle Werte suchen, doch von den momentanen 11300 Einträgen sind die letzten 300 relevant und das nur von Spalte(G).
Mein Ansatz sieht folgendermaßen aus:


private string inExcelSearch(string searchString)
        {
            string searchStrg = searchString;

            Excel.Application xlApp = new Excel.Application();//create a new Excel application

            Excel.Workbook xlWorkBook = xlApp.Workbooks.Open(@"C:\Users\Olaf\Desktop\WARENAUSGANG.2.xls");//open the workbook

            Excel.Worksheet xlWorkSheet = xlWorkBook.Worksheets["Tabelle1"];//get the worksheet object
            Excel.Range colRange = xlWorkSheet.Range[xlWorkSheet.Cells[7,(xlWorkSheet.UsedRange.Rows.Count-300)],(xlWorkSheet.Cells[7,(xlWorkSheet.UsedRange.Rows.Count)])]; ;//<---- hier liegt mein Problem
          


            Excel.Range resultRange = colRange.Find(

                   What: searchStrg,

                   LookIn: Excel.XlFindLookIn.xlValues,

                   LookAt: Excel.XlLookAt.xlPart,

                   SearchOrder: Excel.XlSearchOrder.xlByRows,

                   SearchDirection: Excel.XlSearchDirection.xlNext

                   );// search searchString in the range, if find result, return a range

            if (resultRange is null)

            {

              MessageBox.Show("Did not found " + searchStrg + " in column A");
                return "false";
            }

            else

            {
               MessageBox.Show("gefunden");
                //then you could handle how to display the row to the label according to resultRange
                return "true";
            }
            xlWorkBook.Close(false, Type.Missing, Type.Missing);
            xlApp.Application.Quit();
        }

bekomme aber den Bereich nicht definiert 😦

mit

   Excel.Range colRange = xlWorkSheet.Columns("G:G");

klappt es schon, doch nur viel zu langsam, deshalb wollte ich es eingrenzen, bekomme es aber nicht hin.

Könnt ihr mir bitte helfen!?

DANKE!!!!

16.806 Beiträge seit 2008
vor 4 Jahren

Mal OpenXML angeschaut, das für solche Zwecke gemacht ist und seit ca. 10 Jahren von Microsoft empfohlen wird? Interop war halt nie ein Performancemeister.
XLS wird zwar nicht direkt unterstützt; kann ja aber problemlos mit Tools, die Microsoft seit 2007 anbietet, in XLSX transformiert werden.

Ansonsten mal NetOffice anschauen, ob das evtl. Deine Anforderung abdeckt?

A
aloneboy Themenstarter:in
27 Beiträge seit 2014
vor 4 Jahren

Hi,

Danke für die Antwort, doch leider kann ich nur diese Excel Tabelle verwenden. Dazu möchte ich den geringsten Weg nutzen und dachte mir es wäre so einer. Bei ca 300 Daten müsste es von der Zeit auch gehen. Zumindest würde ich es gerne ausprobieren wollen.

Danke

16.806 Beiträge seit 2008
vor 4 Jahren

Naja; dann musst mit Pech eben mit der Performance leben, wenn Du nichts verändern willst 😉

L
136 Beiträge seit 2015
vor 4 Jahren

Hallo aloneboy,

Du bist dem Ziel auch nicht so weit entfernt.

  1. Im Excel die Range markieren und speichern (Wie Du es schon richtig machst)
    -> Das geht super schnell, fast das einzige mit Interop 😁
  2. Die Excel-Range in eine z.B. List<string> packen
  3. mit Linq nach den gesuchten Einträgen suchen

Wie Abt schreibt ist OpenXML ist die schönste Lösung aber nicht die einfachste...

Gruss Lhyn

A
aloneboy Themenstarter:in
27 Beiträge seit 2014
vor 4 Jahren

Hi,
das klingt vielversprechend 😃
Da ich mich damit nicht auskenne mit Excel und Interop,
könntest mir ein Beispiel geben, wäre sehr hilfreich!

Danke