Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Updaten des Excel Sheet 1 mit Daten aus Excel Sheet 2 [gelöst]
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 2.915
Herkunft: Deutschland

Themenstarter:

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

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von dr4g0n76 am .
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.433

beantworten | zitieren | melden

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).
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 2.915
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 2.915
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dr4g0n76 am .
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 2.915
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers