myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Entwicklung (https://www.mycsharp.de/wbb2/board.php?boardid=3)
-- Office-Technologien (https://www.mycsharp.de/wbb2/board.php?boardid=73)
--- Performant in einer Excel Tabelle suchen (https://www.mycsharp.de/wbb2/thread.php?threadid=121994)


Geschrieben von aloneboy am 30.06.2019 um 20:58:
  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:

C#-Code:
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

C#-Code:
   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!!!!


Geschrieben von Abt am 30.06.2019 um 21:07:
 
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?


Geschrieben von aloneboy am 01.07.2019 um 22:10:
 
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


Geschrieben von Abt am 02.07.2019 um 10:18:
 
Naja; dann musst mit Pech eben mit der Performance leben, wenn Du nichts verändern willst ;-)


Geschrieben von lhyn am 02.07.2019 um 10:23:
 
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 großes Grinsen
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


Geschrieben von aloneboy am 03.07.2019 um 08:47:
 
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


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 03.06.2020 11:03