Laden...

Updaten des Excel Sheet 1 mit Daten aus Excel Sheet 2 [gelöst]

Erstellt von dr4g0n76 vor einem Jahr Letzter Beitrag vor einem Jahr 797 Views
dr4g0n76 Themenstarter:in
2.921 Beiträge seit 2005
vor einem Jahr
Updaten des Excel Sheet 1 mit Daten aus Excel Sheet 2 [gelöst]

Hallo zusammen.

Weiss jemand von euch zufällig, wie man 2 Excel Tabellen, wie unten beschrieben mergen kann?
Auf jeden Fall, diese Art, wie ich sie brauche habe ich bisher nicht sinnvoll in Google finden können.

Grund:

Wir haben hier verschiedene Sprachen mit Items in Excel Tabellen.

Es wurde aber eine falsche Excel-Datei (ältere Version) übergeben, bei der die Spalten nicht mehr übereinstimmen.

Es gilt also folgendes zum vorherigen Stand (Stand 1):

Token Name Deutsch Englisch Spanisch
T.Change Ändern Change
T.Help Hilfe Help
T.New Neu New

Und in einem weiteren Stand (Stand 2), Z.b. das:

Token Name Deutsch Englisch Spanisch
T.Change Ändern Change Cambiar
T.Help Hilfe Help Ayuday
T.Rot Rot Red Rojo

Ich muss also folgendes erreichen, dass Stand 1 und 2 so gemergt werden, dass ALLE tokens von vorhin enthalten sind am Ende:
Und dabei ist also die Token Name Spalte die wichtige. D.h. wenn ein neues Token gefunden wird in Stand 2, wird es in Stand 1 hinzugefügt.
Doppelte Tokens sollten nicht vorkommen, den Fall brauchen wir nicht berüchsichtigen.

Es reicht also z.B. wenn die Spalten auch so generiert werden würden, dass ich sie per Paste einfügen kann.
Anders ausgedrückt: Am Ende soll Stand 1 alle Tokens zusätzlich enthalten, die fehlen, aber in Stand 2 schon enthalten sind.

Weiss jemand, wie ich das erreiche? Mir ist es egal, ob ich dafür ein kleines Programm schreiben muss,
idealerweise in diesem Fall ohne Programmierung. Vielleicht geht das ja mit Excel ganz einfach?

Das wäre dann jedenfalls das gewünschte Ergebnis in Stand 1:

Token Name Deutsch Englisch Spanisch

T.Change ändern Change Cambiar
T.Help Hilfe Help Ayuda
T.New Neu New Nuevo
T.Rot Rot Red Rojo

P.S.: In der Vorschau im Editmodus wird die Formatierung bei mir richtig angezeigt der Tabellen.
Leider ist die Formatierung nicht richtig, wenn man sie im fertigen Beitrag anschaut, bisher weiss ich nicht, wie sich das ändern liesse, ohne einen Screenshot zu erstellen.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

4.931 Beiträge seit 2008
vor einem Jahr

Hallo,

sind es denn ältere Excel-Dateien (.xls) oder das neuere Format (.xlsx)? Bei letzterem sollte es mit OpenXML (oder ClosedXML) per C# recht einfach gehen.
Direkt in Excel müßtest du wohl VBA oder Javascript benutzen, aber ob das einfacher (und schneller erstellt) ist?

PS: Du weißt sicherlich, daß HTML keine Tabs zur Formatierung kennt (sondern in Leerzeichen umwandelt - und wie alle Leerzeichen, diese bis auf eins ignoriert)?!
Packe die Tabelle in Code-Tags oder "vorformatierter Text", aber mit Leerzeichen (dazu am besten in Notepad o.ä. mit einen Fixed-Size-Font erstellen und dann kopieren).

dr4g0n76 Themenstarter:in
2.921 Beiträge seit 2005
vor einem Jahr

Hallo Th69.

Es ist das neue Format, also: .xlsx.
Ok, dann werde ich das iterativ bzw. mit einem kleinen Programm machen.
Danke für Deine Hinweise.

Zum P.S.:

Ja, das ist mir natürlich auch bekannt.
Hab auch das Problem gefunden. Im Texteditor war eingestellt: Leerzeichen in Tabs konvertieren.
LOL. Da kann ich natürlich lange suchen.

Denn genau Deinen Ansatz hatte ich ebenfalls verwendet.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

dr4g0n76 Themenstarter:in
2.921 Beiträge seit 2005
vor einem Jahr

Also:

Ich habe eine Lösung gefunden:

Mit ClosedXML geht das ganze sehr einfach.

Damit schrumpft das Alles auf etwas in dieser Art:


            XLWorkbook workBookSource = new XLWorkbook(fileNameSource);
            XLWorkbook workBookDest = new XLWorkbook(fileNameDest);

            var worksheetMastertable = workBookSource.Worksheet("Mastertabelle");

           //find spanish column
            foreach(IXLRow row in worksheetMastertable .RowsUsed())
            {
                string rowText = string.Empty;

                string token = "";
                string languageIndex = "es-MX";
                string tokenText = FindTextForToken(languageIndex, token);

                if (TokenExists(worksheetMastertable , token))
                {
                    AddTokenTo(workBookSource, token);
                }

                foreach (IXLCell cell in row.Cells())
                {
                    var value = cell.Value;
                    rowText += value+" | ";
                }
            }
         
        }

Die Methoden oben, die nicht im Code zu sehen sind, sind bisher leere Pseudomethoden,
die Objekte sind aber sehr leicht im Debugger zu brauchen.
Deswegen sollte das keinen Aufwand mehr brauchen.

Auf Wunsch kann ich auch das fertige Ergebnis später - mit den Methoden - hier posten.

P.S.: Zuerst hatte ich das Ganze mit OpenXML von Microsoft versucht. Es funktioniert zwar.
Ist aber ziemlich aufwändig das Ganze damit zu machen.
Auch wenn man Zugriff auf jedes Atom von Excel hat.

Hatte gemerkt, das braucht doch einiges an Aufwand und Lernaufwand.
Auch wenn ich in 2/3 Stunden was ansatzweise brauchbares hatte.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

dr4g0n76 Themenstarter:in
2.921 Beiträge seit 2005
vor einem Jahr

Inzwischen habe ich noch eine weitaus bessere (Roh-)Lösung gefunden:


namespace MergeExcels
{
    public class ClosedXmlExcelMerger
    {
        public void Merge(string fileNameSource, string fileNameDest, string workSheetName = "MasterTabelle", string languageToMergeFrom = "es-MX", bool returnNewMergedFile = true)
        {
            IXLWorkbook workBookSource = new XLWorkbook(fileNameSource);
            IXLWorkbook workBookDest = new XLWorkbook(fileNameDest);

            var worksheetSource = workBookSource.Worksheet(workSheetName);
            var worksheetDest = workBookDest.Worksheet(workSheetName);

            //find spanish column in source and dest
            IXLRow firstUsedRowSource = worksheetSource.FirstRowUsed();
            IXLRow firstUsedRowDest = worksheetDest.FirstRowUsed();

            int languageColumnNumberSource = XLHelper.GetColumnNumberFromAddress(firstUsedRowSource.GetLanguageCell(languageToMergeFrom).Address.ToString()); //subtract 1 to be able to use zero based index
            int languageColumnNumberDest = XLHelper.GetColumnNumberFromAddress(firstUsedRowDest.GetLanguageCell(languageToMergeFrom).Address.ToString());

            //Gets all the tokens from Dest
            IXLCells foundCellsContainingValidTokensInDest = worksheetDest.CellsUsed(x => Regex.Match(x.GetString(), Helpers.Helpers.ValidTokensPattern).Success); //IXLCells foundCellsContainingValue = worksheetSource.CellsUsed(x => x.GetString() == value.ToString());

            int cellProcessedIndex = 0;
            foreach (IXLCell cell in foundCellsContainingValidTokensInDest)
            {
                string tokenToFind = cell.GetString().Trim();
                IXLCells foundCorrespondingValidTokenInSource = worksheetSource.CellsUsed(x => x.GetString() == tokenToFind); //IXLCells foundCellsContainingValue = worksheetSource.CellsUsed(x => x.GetString() == value.ToString());

                IXLCell tokenCellInDest = cell;
                string tokenTextFromDest = tokenCellInDest.CellRight(languageColumnNumberDest - 1).GetString();
                if (tokenCellInDest == null)
                {
                    new Exception("This should not happen!");
                }

                //Get the cell to insert to
                IXLCell cellToInsertValueTo = foundCorrespondingValidTokenInSource.First().CellRight(languageColumnNumberSource - 1);
                cellToInsertValueTo.Value = tokenTextFromDest;

                cellProcessedIndex++;               
            }
        }
    }
}

Das hier reicht aus, um den gefundenen Token String (der sich in Helpers.Helpers.ValidTokensPattern befindet) als key zu benutzen für die Zeile und damit von der einen Datei,
die Texte die in der Language Spalte sind in die andere Datei zu übertragen.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.