myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Office-Technologien » Performant in einer Excel Tabelle suchen
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Performant in einer Excel Tabelle suchen

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
aloneboy
myCSharp.de-Mitglied

Dabei seit: 12.06.2014
Beiträge: 14


aloneboy ist offline

Performant in einer Excel Tabelle suchen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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!!!!
30.06.2019 20:58 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.559
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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?
30.06.2019 21:07 Beiträge des Benutzers | zu Buddylist hinzufügen
aloneboy
myCSharp.de-Mitglied

Dabei seit: 12.06.2014
Beiträge: 14

Themenstarter Thema begonnen von aloneboy

aloneboy ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
01.07.2019 22:10 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.559
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Naja; dann musst mit Pech eben mit der Performance leben, wenn Du nichts verändern willst ;-)
02.07.2019 10:18 Beiträge des Benutzers | zu Buddylist hinzufügen
lhyn lhyn ist männlich
myCSharp.de-Mitglied

Dabei seit: 20.04.2015
Beiträge: 125


lhyn ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
02.07.2019 10:23 Beiträge des Benutzers | zu Buddylist hinzufügen
aloneboy
myCSharp.de-Mitglied

Dabei seit: 12.06.2014
Beiträge: 14

Themenstarter Thema begonnen von aloneboy

aloneboy ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
03.07.2019 08:47 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 8 Monate.
Der letzte Beitrag ist älter als 8 Monate.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 28.03.2020 13:40