Laden...

Excel Spalten in meherer ComboBoxen einlesen?

Erstellt von nicknet vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.921 Views
N
nicknet Themenstarter:in
9 Beiträge seit 2010
vor 12 Jahren
Excel Spalten in meherer ComboBoxen einlesen?

Hallo @ll,

mit nachfolgendem Code lese ich die Spalte einer Exceldatei aus und lasse die Einträge in eine Combobox eintragen.

Soweit so gut, es funktioniert aber nur mit einer Spalte der Befehl für die Spalte C wird nicht ausgeführt.
Meiner Vermutung nach ligt es an der Mehrfachverwendung des Objektes
System.Object[,] A;
bzw.
System.Object[,] C;

wie kann ich nach Ablauf der ersten Prozedur,
System.Object[,] A;
das Neue Object
System.Object[,] C;
setzen???
Möchte fünf Spalten einlesen und in unterschiedliche ComboBoxen eintragen


            //Daten Spalte A
            Excel.Range rangeA;
            rangeA = worksheet.get_Range("A1", "A100");

            //Abrufen der Daten aus Spalte A
            System.Object[,] A;

            A = rangeA.get_Value(Missing.Value);

            //verkleinere array auf Inhalt.
            long iRowsA;
            long iColsA;
            iRowsA = A.GetUpperBound(0);
            iColsA = A.GetUpperBound(1);

            //Array in einem String zusammenfassen
            String valueStringA;

            for (long rowCounter = 1; rowCounter <= iRowsA; rowCounter++)
            {
                for (long colCounter = 1; colCounter <= iColsA; colCounter++)
                {
                    valueStringA = String.Join("\n", A[rowCounter, colCounter].ToString());
                    string[] installsA = new string[] { valueStringA };

                    comboBoxlm1.Items.AddRange(installsA);
                    comboBoxhd1.Items.AddRange(installsA);
                }
            }



            //Daten Spalte C
            Excel.Range rangeC;
            rangeC = worksheet.get_Range("C1", "C100");

            //Abrufen der Daten aus Spalte C
            System.Object[,] C;

            C = rangeC.get_Value(Missing.Value);

            //verkleinere array auf Inhalt.
            long iRowsC;
            long iColsC;
            iRowsC = C.GetUpperBound(0);
            iColsC = C.GetUpperBound(1);

            //Array in einem String zusammenfassen
            String valueStringC;

            for (long rowCounter = 1; rowCounter <= iRowsC; rowCounter++)
            {
                for (long colCounter = 1; colCounter <= iColsC; colCounter++)
                {
                    valueStringC = String.Join("\n", C[rowCounter, colCounter].ToString());
                    string[] installsC = new string[] { valueStringC };

                    comboBoxlm1.Items.AddRange(installsC);
                    comboBoxhd1.Items.AddRange(installsC);
                }
            }

Hoffe das es verständlich ausgedrückt ist 😃
kann jemand helfen?

Hinweis "... jedes einzeln angesprochen tut was es tuen soll, nur zusammen tun`s net..." 😦

Gelöschter Account
vor 12 Jahren

der Befehl für die Spalte C wird nicht ausgeführt

Kannst du den Teil genauer ausführen? Was passiert? Eine Exception? Keine Daten?

N
nicknet Themenstarter:in
9 Beiträge seit 2010
vor 12 Jahren

Hi Sebastian

Fehlermeldung:

Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt,

wie gesagt jeder Block für sich allein funzt,
ergo A ist commentiert //
funktioniert C
A ist nicht commentiert funktioniert A allein.

erster Gedanke war A nach Abschluss zu Nullen

A = null;

und C als neues Objekt zu referenzieren

System.Object[,] C = new Object[,] {};
C = rangeC.get_Value(Missing.Value);

funktioniert so aber nicht,
Und ich möchte nicht für jede dieser 5 Comboboxen,
die datei öffnen und wieder schließen.

thx

Gelöschter Account
vor 12 Jahren

In welcher Zeile tritt die Exception denn auf?

N
nicknet Themenstarter:in
9 Beiträge seit 2010
vor 12 Jahren

hi Sebastian, ich bekomme keine Meldung in welcher Zeile das passiert,

kann dir sagen das es in
private void Config()
passiert,

und wenn ich einen Block auskommentiere,
bekomme ich keinen Fehler.
nur wenn ich beide Blöcke stehen lasse.
aber das wird dir auch net sonderlich weiterhelfen,

catch (Exception e)
            {
                String errorMessage;
                errorMessage = "Fehler: ";
                errorMessage = String.Concat(errorMessage, e.Message + "\n");
                errorMessage = String.Concat(errorMessage, e.TargetSite + "\n");
                errorMessage = String.Concat(errorMessage, e.Source + "\n");
                errorMessage = String.Concat(errorMessage, e.HelpLink + "\n");
                errorMessage = String.Concat(errorMessage, e.InnerException + "\n");
                errorMessage = String.Concat(errorMessage, e.StackTrace + "\n");
                errorMessage = String.Concat(errorMessage, e.TargetSite + "\n");
                errorMessage = String.Concat(errorMessage, e.Data + "\n");
                errorMessage = String.Concat(errorMessage, e.GetBaseException() + "\n");
errorMessage = String.Concat( errorMessage, " Line: " );
                System.Windows.MessageBox.Show(errorMessage, "Error");}

irgendwie kann ich nur einen Array einlesen,

Gelöschter Account
vor 12 Jahren

Du kannst im Menu 'Debuggen' den Menüpunkt 'Ausnahmen' auswählen und die Checkbox 'Common Language Runtime Exceptions' aktvieren. Wenn du nun den Debugger laufen lässt (typischerweise F5) wird Visual Studio in der Zeile anhalten in der die Exception auftritt. Dein Code ist nicht eben schön aber einen Grund warum beides im Zusammenspiel nicht funktioniert erkenne ich nicht. Hast du im Code hier im Posting was weg gelassen evtl. Events abboniert?

N
nicknet Themenstarter:in
9 Beiträge seit 2010
vor 12 Jahren

Hallo Sebastian,

Danke für den Tipp
In dieser Zeile bleibt er stehen,

valueStringA = String.Join("\n", A[rowCounter, colCounter].ToString());

Fangen Sie NullReferenceException explizit in einer Try...Catch....Finally-Anweisung ab.
Eine Try…Catch…Finally-Anweisung kann den Code auf bestimmte Ausnahmetypen prüfen, angefangen von sehr spezifischen bis hin zu sehr allgemeinen Ausnahmen.

Habe ich gemacht für jeden einzelnen Block,
mit deiner Einstellung meckert er zwar immer noch, aber siehe da, jetzt macht er das was er soll,

Der gesamtCode bisher

        private void Config()
        {
            try
            {
                CheckExcellProcesses();

                Microsoft.Office.Interop.Excel.Application excel =
                       new Microsoft.Office.Interop.Excel.Application();
                excel.Visible = false;


                // Dateipfad
                string currentDir = Environment.CurrentDirectory;
                Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Open(currentDir + @"\config.dif");

                // Das erste Arbeitsblatt referenzieren 
                Microsoft.Office.Interop.Excel.Worksheet worksheet =
                   (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];


                try
                {
                    //Daten Spalte A
                    Excel.Range rangeA;
                    rangeA = worksheet.get_Range("A1", "A100");
                    //Abrufen der Daten aus Spalte A
                    System.Object[,] A;

                    A = rangeA.get_Value(Missing.Value);
                    //verkleinere array auf Inhalt.
                    long iRowsA;
                    long iColsA;
                    iRowsA = A.GetUpperBound(0);
                    iColsA = A.GetUpperBound(1);
                    //Array in einem String zusammenfassen
                    String valueStringA;
                    for (long rowCounter = 1; rowCounter <= iRowsA; rowCounter++)
                    {
                        for (long colCounter = 1; colCounter <= iColsA; colCounter++)
                        {
                            valueStringA = String.Join("\n", A[rowCounter, colCounter].ToString());
                            string[] installsA = new string[] { valueStringA };

                            comboBoxlm1.Items.AddRange(installsA);
                            comboBoxhd1.Items.AddRange(installsA);
                        }
                    }
                }
                catch (Exception)
                {
                    
                }

                try
                {
                    //Daten Spalte C
                    Excel.Range rangeC;
                    rangeC = worksheet.get_Range("C1", "C100");

                    //Abrufen der Daten aus Spalte C 
                    System.Object[,] C;
                    C = rangeC.get_Value(Missing.Value);

                    //verkleinere array auf Inhalt.
                    long iRowsC;
                    long iColsC;
                    iRowsC = C.GetUpperBound(0);
                    iColsC = C.GetUpperBound(1);

                    //Array in einem String zusammenfassen
                    String valueStringC;

                    for (long rowCounter = 1; rowCounter <= iRowsC; rowCounter++)
                    {
                        for (long colCounter = 1; colCounter <= iColsC; colCounter++)
                        {
                            valueStringC = String.Join("\n", C[rowCounter, colCounter].ToString());
                            string[] installsC = new string[] { valueStringC };

                            comboBoxlm2.Items.AddRange(installsC);
                            comboBoxhd2.Items.AddRange(installsC);
                        }
                    }
                }
                catch (Exception)
                {

                }

                try
                {
                    //Daten Spalte E
                    Excel.Range rangeE;
                    rangeE = worksheet.get_Range("E1", "E100");

                    //Abrufen der Daten aus Spalte F 
                    System.Object[,] E;
                    E = rangeE.get_Value(Missing.Value);

                    //verkleinere array auf Inhalt.
                    long iRowsE;
                    long iColsE;
                    iRowsE = E.GetUpperBound(0);
                    iColsE = E.GetUpperBound(1);

                    //Array in einem String zusammenfassen
                    String valueStringE;

                    for (long rowCounter = 1; rowCounter <= iRowsE; rowCounter++)
                    {
                        for (long colCounter = 1; colCounter <= iColsE; colCounter++)
                        {
                            valueStringE = String.Join("\n", E[rowCounter, colCounter].ToString());
                            string[] installsE = new string[] { valueStringE };

                            comboBoxlm3.Items.AddRange(installsE);
                            comboBoxhd3.Items.AddRange(installsE);
                        }
                    }
                }
                catch (Exception)
                {

                }
                // Speichern damit Datei nicht in Excel hängen bleibt
                string folderName = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName);
                string fileName = Path.Combine(folderName, "config.dif");
               

                if (File.Exists(fileName))
                {

                    File.Delete(fileName);

                        excel.AlertBeforeOverwriting = false;
                        excel.DisplayAlerts = false;
                        workbook.Save();
                        workbook.Close();
                        excel.Quit();

                }
                else
                {
                    workbook.SaveAs(fileName);
                    workbook.Close();
                    // Excel beenden
                    excel.Quit();
                }
                

            }
            catch (Exception e)
            {
                //String errorMessage;
                //errorMessage = "Fehler: ";
                //errorMessage = String.Concat(errorMessage, e.Message + "\n");
                //errorMessage = String.Concat(errorMessage, e.TargetSite + "\n");
                //errorMessage = String.Concat(errorMessage, e.Source + "\n");
                //errorMessage = String.Concat(errorMessage, e.HelpLink + "\n");
                //errorMessage = String.Concat(errorMessage, e.InnerException + "\n");
                //errorMessage = String.Concat(errorMessage, e.StackTrace + "\n");
                //errorMessage = String.Concat(errorMessage, e.TargetSite + "\n");
                //errorMessage = String.Concat(errorMessage, e.Data + "\n");
                //errorMessage = String.Concat(errorMessage, e.GetBaseException() + "\n");
                //System.Windows.MessageBox.Show(errorMessage, "Error");
            }
            finally
            {

                KillExcel();
            }

        }