none
Compare 2 Excel Sheets (fast) RRS feed

  • Allgemeine Diskussion

  • Hi I have two ExcelSheets, both have the some columns structure, I mean both have 10 columns with the same name, in the same order

    The first sheet has new Data some columns are new some old ones are modified.  its called neetNewInfo

    theother sheet holds the all collected information.->ALLInfoSheet

    Now I am checking each row from the newInfoSheet and compare it to the rows in the Allinfosheet. If the row exists it checks if the fields of this row has been changed since the last time, if yes it overwrites it

    If the row is new, it just add it at the end.

    The code is working fine, but is very slow for 1000 rows it takes 15 min at least.

    i am using a for ( for() )loop, is there a better way?

    lg

    Mittwoch, 12. Juni 2013 11:18

Alle Antworten

  • Hi,

    da Du in einem deutschsprachigen Forum postest, antworte ich auch hier auf Deutsch.

    Generell würde ich (wie auch in deinem anderen Posting zu Excel) OleDb empfehlen. Damit kannst Du auf die Exceldateien wie auf eine Datenbank zugreifen und mit SQL arbeiten.

    15 Minuten für 1000 Zeilen ist natürlich extrem viel. Selbst mit noch so falschem Code und Debugmodus kann ich mir beim besten Willen nicht vorstellen, dass das dermaßen lange dauern kann. Ohne deinen Code zu kennen, weiß ich das natürlich nicht.

    Um dir helfen zu können, müsstest Du uns aber noch verraten, wie deine Exceldatei aussieht. Poste doch mal bitte die ersten drei, vier Zeilen (ggfs. inkl. Kopfzeile, falls Du sowas hast).

    Dazu bitte noch deinen Code.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 12. Juni 2013 12:13
    Moderator
  • Spalten:

    Entity    Logic     Account   Product   Subtype  Center

    Test1     -           K              S             -              U

    Test1     -           k               L            -               p

    Test1     -            R            L             -                U

    So schaut das Sheet Template und das mit den neuen Werten aus,

    Die Spalten Entity, Account und Center bilden den PK;

    Ich gehe davon aus, dass die Werte im Sheet newValues nur einmal vorhanden sind, somit muss ich nicht jedesmal die neu eingtragenen neu überprüfen. daher wird temprowscount  nur einmal am anfang benutzt, und somit veringert sich die zeit:

    Den counter benutzte ich, da nach einem Update, falls der wert schon vorhanden ist , nicht nochmals vorkommen kann. Somit veringert sich die laufzeit ebenfalls. Habs jetzt gestoppt und brauche für ca 1000 rows 5:20;

    Code:

    int counter = 2;
                int temprowsCount = tempSheet.UsedRange.Rows.Count + 1;
                int fileRowsCount = filesheet.UsedRange.Rows.Count;
                for (int i = 1+1; i <= fileRowsCount; i++)
                {
                    string fileEntity = filesheet.Cells[i, 1].Text;
                    string fileAcc = filesheet.Cells[i, 3].Text;
                    string fileProfitCenter = filesheet.Cells[i, 6].Text;
                    int tester = -1;
                  
                    for (int k = counter; k <= temprowsCount; k++)
                    {
                       
                        string tempEntity = tempSheet.Cells[k, 1].Text;
                        string tempAcc = tempSheet.Cells[k, 3].Text;
                        string tempProfitCenter = tempSheet.Cells[k, 6].Text;
                        if (tempEntity == fileEntity && tempAcc == fileAcc && tempProfitCenter==fileProfitCenter)
                        {
                            excel.UpdateRow(tempSheet, filesheet,i, k);
                            tester = 1;
                            counter++;
                            break; ;
                            
                        }
                     
                    }
                    if (tester==-1)
                    {
                       
                        excel.InsertNewRow(tempSheet, filesheet, i);
                      
                    }
                }

    Colums sind 22;

    Mittwoch, 12. Juni 2013 13:31
  • Mit OLEDB kann ich nichts formatieren oder? weil for dem insert oder update üperprüfe ich die sheet, ob das format passt, die spaltennamen, ob die Tabelle vorhanden ist, etc?

    Oder meinst du zuerst mit interop formatieren und dann mit OLEDB in das andere sheet kopieren?

    Mittwoch, 12. Juni 2013 13:49
  • Hi,

    so ganz generell meine ich: Schmeiß Interop weg und arbeite mit OleDb.

    Was willst Du denn formatieren? Wenn dein Excelsheet nur Daten beinhaltet, brauchst Du keine Formatierung, ...

    Wenn Du prüfen willst, ob das Sheet an sich vorhanden ist und falls ja, ob es die richtige Struktur hat: Das geht auch per OleDb. Zur Not kann man das aber auch so lassen, wie es ist und dann nur die INSERT, UPDATE, ... Statements per OleDb absetzen.

    In deinem Fall wird der Code der inneren Schleife wohl ca. 1 Mio mal durchlaufen. 1000 mal äußere Schleife, dort jeweils 1000 man innere Schleife.

    Ich schau mal, dass ich dir heut Abend ein Beispiel für sowas mache. Es wäre hilfreich, wenn Du eine solche Exceldatei (bzw. zwei: das Original und eine, die genau das gewünschte Ergebnis) zum Download bereitstellen könntest.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 12. Juni 2013 13:58
    Moderator