none
Werte aus Excel einlesen RRS feed

  • Frage

  • Hallo, ich würde gerne diverse Zellen aus einem Exceldokument einlesen.

    Leider funktionieren die Beispiele di ich bei google gefunden habe irgendwie nicht :-(

    Die Zelle wird nicht ausgelesen ... nach dem beenden der Form ist ein excelprozess immer noch im Taskmanager geöffnet.

    Hat jemand eine besseren Vorschlag?

    Hier mein Quellcode:

            private void Form1_Load(object sender, EventArgs e)
            {
                string file = "C:\\Testeinträge\\Mappe1.xls";
                Excel._Application xlApp;
                Excel.Workbook xlWorkbook;
                Excel.Worksheet xlWorksheet;
                Excel.Range xlRange;
    
                xlApp = new Excel.Application();
                xlWorkbook = xlApp.Workbooks.Open(file, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
                xlWorksheet = (Excel.Worksheet)xlWorkbook.Worksheets.get_Item(1);
                xlRange = xlWorksheet.UsedRange;
    
                textBox1.Text = (string)(xlRange.Cells[1, 1] as Excel.Range).Value;
                xlWorkbook.Close(true, null, null);
                xlApp.Quit();
            }

    Sonntag, 7. April 2013 09:09

Antworten

  • Hallo Bensen83,

    ich weiß zwar nicht ob du dein Problem schon gelöst hast, aber ich antworte trotzdem mal.

    Ich hab mit vor einiger Zeit mal eine kleine Import-Funktion geschrieben.

    Kopftext:

    using Excel = Microsoft.Office.Interop.Excel;

    Button:

    private void button3_Click(object sender, EventArgs e)
    {
                string Pfad = "";
    
                OpenFileDialog Import = new OpenFileDialog();
                Import.Filter = "Excel-Arbeitsmappe (*.xlsx)|*.xlsx|All files (*.*)|*.*";
    
                if (Import.ShowDialog() == DialogResult.OK) Pfad = Import.FileName;
    
                Import(Pfad);
    }

    Funktion:

    (per Button übergebe ich der Funktion den Pfad zu Datei *.xlsx)

    private void Import(string Pfad) { Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); excel.Visible = false; Excel.Workbook wb = null; string ASP = ""; string bDatum = ""; string Betreuer = ""; string Besucher = ""; string Bewirtung = ""; string Exponate = ""; string GHV = ""; string Inhalt = ""; string Kommentar = ""; string PSA = ""; string Raum = ""; string Technik = ""; string vDatum = ""; string Veranstaltung = ""; string Werbemittel = ""; int Anzahl = 0; int Dauer = 0; int i; wb = excel.Workbooks.Open(Pfad); Excel.Sheets sheets = wb.Worksheets; Excel.Worksheet ws = (Excel.Worksheet)sheets.get_Item("Termine"); try { for (i = 2; i <= excel.get_Range("A" + excel.Rows.Count, "A" + excel.Rows.Count).get_End(Excel.XlDirection.xlUp).Row; i++) { Excel.Range Veranstaltung_e = (Excel.Range)ws.get_Range("A" + i, "A" + i); Excel.Range vDatum_e = (Excel.Range)ws.get_Range("B" + i, "B" + i); Excel.Range bDatum_e = (Excel.Range)ws.get_Range("C" + i, "C" + i); Excel.Range Dauer_e = (Excel.Range)ws.get_Range("D" + i, "D" + i); Excel.Range ASP_e = (Excel.Range)ws.get_Range("E" + i, "E" + i); Excel.Range Betreuer_e = (Excel.Range)ws.get_Range("F" + i, "F" + i); Excel.Range Anzahl_e = (Excel.Range)ws.get_Range("G" + i, "G" + i); Excel.Range Besucher_e = (Excel.Range)ws.get_Range("H" + i, "H" + i); Excel.Range PSA_e = (Excel.Range)ws.get_Range("I" + i, "I" + i); Excel.Range Raum_e = (Excel.Range)ws.get_Range("J" + i, "J" + i); Excel.Range Bewirtung_e = (Excel.Range)ws.get_Range("K" + i, "K" + i); Excel.Range Werbemittel_e = (Excel.Range)ws.get_Range("L" + i, "L" + i); Excel.Range Technik_e = (Excel.Range)ws.get_Range("M" + i, "M" + i); Excel.Range Exponate_e = (Excel.Range)ws.get_Range("N" + i, "N" + i); Excel.Range GHV_e = (Excel.Range)ws.get_Range("O" + i, "O" + i); Excel.Range Inhalt_e = (Excel.Range)ws.get_Range("P" + i, "P" + i); Excel.Range Kommentar_e = (Excel.Range)ws.get_Range("Q" + i, "Q" + i); Veranstaltung = Veranstaltung_e.Value2.ToString(); vDatum = vDatum_e.Value2.ToString(); bDatum = bDatum_e.Value2.ToString(); Dauer = Convert.ToInt32(Dauer_e.Value2.ToString()); ASP = ASP_e.Value2.ToString(); Betreuer = Betreuer_e.Value2.ToString(); Anzahl = Convert.ToInt32(Anzahl_e.Value2.ToString()); Besucher = Besucher_e.Value2.ToString(); PSA = PSA_e.Value2.ToString(); Raum = Raum_e.Value2.ToString(); Bewirtung = Bewirtung_e.Value2.ToString(); Werbemittel = Werbemittel_e.Value2.ToString(); Technik = Technik_e.Value2.ToString(); Exponate = Exponate_e.Value2.ToString(); GHV = GHV_e.Value2.ToString(); Inhalt = Inhalt_e.Value2.ToString(); Kommentar = Kommentar_e.Value2.ToString();

    //dein Code hier } f1.notifyIcon1.BalloonTipText = "Der Import war erfolgreich"; f1.notifyIcon1.ShowBalloonTip(5000); } catch (Exception e) { MessageBox.Show(e.Message); } wb.Close(); }


    VG

    BlackRose2


    Freitag, 10. Mai 2013 12:04
  • Hallo,

    ich habe deinen Code eben mal probiert und er funktionierte bei mir. Ich habe eine Exceldatei mit Office 2013 im xls-Format erstellt und mit der Microsoft Excel 15.0 Object library als Verweis ausgelesen.

    Ein Excel Prozess bleibt auch nur dann zurück, wenn Excel zuvor geöffnet war. Nachdem ich Excel geschlossen habe und den Prozess beendete tauchte kein neuer Excel-Prozess auf.

    Der Code wird also einfach unterbrochen ohne jede Meldung?

    Alternativ kannst du deine Datei vielleicht auch als Datenbank betrachten:
    http://blog.themobilebrand.com/technology/c/reading-an-excel-workbook-using-c-and-oledb/


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Sonntag, 7. April 2013 09:46

Alle Antworten

  • Habe jetzt noch beim debuggen raus gefunden, dass der code bis zur zeile wo in die textbox geschrieben werden soll ausgeführt wird und dann abbricht. warum weis ich auch nicht. Also es gibt keinen Fehler, der code wird nur nicht weiter ausgeführt
    Sonntag, 7. April 2013 09:28
  • Hallo,

    ich habe deinen Code eben mal probiert und er funktionierte bei mir. Ich habe eine Exceldatei mit Office 2013 im xls-Format erstellt und mit der Microsoft Excel 15.0 Object library als Verweis ausgelesen.

    Ein Excel Prozess bleibt auch nur dann zurück, wenn Excel zuvor geöffnet war. Nachdem ich Excel geschlossen habe und den Prozess beendete tauchte kein neuer Excel-Prozess auf.

    Der Code wird also einfach unterbrochen ohne jede Meldung?

    Alternativ kannst du deine Datei vielleicht auch als Datenbank betrachten:
    http://blog.themobilebrand.com/technology/c/reading-an-excel-workbook-using-c-and-oledb/


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Sonntag, 7. April 2013 09:46
  • Kann jetzt bis Dienstag leider nicht mehr an den Rechner, aber ja, es kommt keine Meldung. Ich hatte in Zeile 1 nen Breakpoint gesetzt und mit einzelschritt weiter gedebugt. Das ging gut, bis zur Zeile, wo der zellenwert an die textbox übergeben werden soll, danach der Code wird nicht mehr ausgeführt. Der Programmteilen springt sofort komplett weg.
    Sonntag, 7. April 2013 11:58
  • Also habe es an einem Anderen Rechner probiert. .... da sieht es irgendwie anders aus (vielleicht weil es ein anderes Excel ist?) .... Also an der Stelle, wo die Zelle ausgelesen wird, bekomme ich die exceptoin, dass der double wert nicht in string gewandelt werden kann.

    was kann ich tun? :-)


    Habe es schon hin bekommen... und zwar so:

                if(xlWorkSheet.Cells[numericUpDownZeile.Value, numericUpDownSpalte.Value].Value != null)
                {
                    textBoxAusgabe.Text = xlWorkSheet.Cells[numericUpDownZeile.Value, numericUpDownSpalte.Value].Value.ToString();
                }
                else
                {
                    textBoxAusgabe.Text = "";
                }

    • Bearbeitet Bensen83 Freitag, 19. April 2013 11:56
    Freitag, 19. April 2013 11:21
  • Hi,

    erstell mal bitte ein aufs absolute Minimum reduziertes lauffähiges Beispiel, also bspw. eine vollständige Klasse, die die Verarbeitung durchführt und pack die zusammen mit einem Testaufruf in ein neues Projekt. Das Projekt dann bitte als Download inkl. der betreffenden Exceldatei zur Verfügung stellen.


    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

    Freitag, 19. April 2013 12:03
    Moderator
  • Also ich kann leider nirgends was uploaden, aber hier mal der ganze Quellcode.

    Ps. der Funktioniert nun bei mir auf jedem Rechner. Mitt verschiedenen excel-Versionen.

    using System.Text;
    using System.Windows.Forms;
    using Excel = Microsoft.Office.Interop.Excel;
    namespace ExcelBeispiel
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            string testeintrag;
    
            private void Form1_Load(object sender, EventArgs e)
            {
                string file = "C:\\Testeinträge\\Mappe1.xls";
                Excel._Application xlApp;
                Excel.Workbook xlWorkbook;
                Excel.Worksheet xlWorksheet;
                Excel.Range xlRange;
    
                xlApp = new Excel.Application();
                xlWorkbook = xlApp.Workbooks.Open(file, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
                xlWorksheet = (Excel.Worksheet)xlWorkbook.Worksheets.get_Item(1);
    
                if (xlWorksheet.Cells[1, 1].Value != null)
                {
                    textBox1.Text = xlWorksheet.Cells[1, 1].Value.ToString();
                }
    
                xlWorkbook.Close();
                xlApp.Quit();
    
            }
        }
    }

    Samstag, 20. April 2013 12:50
  • Hallo Bensen83,

    ich weiß zwar nicht ob du dein Problem schon gelöst hast, aber ich antworte trotzdem mal.

    Ich hab mit vor einiger Zeit mal eine kleine Import-Funktion geschrieben.

    Kopftext:

    using Excel = Microsoft.Office.Interop.Excel;

    Button:

    private void button3_Click(object sender, EventArgs e)
    {
                string Pfad = "";
    
                OpenFileDialog Import = new OpenFileDialog();
                Import.Filter = "Excel-Arbeitsmappe (*.xlsx)|*.xlsx|All files (*.*)|*.*";
    
                if (Import.ShowDialog() == DialogResult.OK) Pfad = Import.FileName;
    
                Import(Pfad);
    }

    Funktion:

    (per Button übergebe ich der Funktion den Pfad zu Datei *.xlsx)

    private void Import(string Pfad) { Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); excel.Visible = false; Excel.Workbook wb = null; string ASP = ""; string bDatum = ""; string Betreuer = ""; string Besucher = ""; string Bewirtung = ""; string Exponate = ""; string GHV = ""; string Inhalt = ""; string Kommentar = ""; string PSA = ""; string Raum = ""; string Technik = ""; string vDatum = ""; string Veranstaltung = ""; string Werbemittel = ""; int Anzahl = 0; int Dauer = 0; int i; wb = excel.Workbooks.Open(Pfad); Excel.Sheets sheets = wb.Worksheets; Excel.Worksheet ws = (Excel.Worksheet)sheets.get_Item("Termine"); try { for (i = 2; i <= excel.get_Range("A" + excel.Rows.Count, "A" + excel.Rows.Count).get_End(Excel.XlDirection.xlUp).Row; i++) { Excel.Range Veranstaltung_e = (Excel.Range)ws.get_Range("A" + i, "A" + i); Excel.Range vDatum_e = (Excel.Range)ws.get_Range("B" + i, "B" + i); Excel.Range bDatum_e = (Excel.Range)ws.get_Range("C" + i, "C" + i); Excel.Range Dauer_e = (Excel.Range)ws.get_Range("D" + i, "D" + i); Excel.Range ASP_e = (Excel.Range)ws.get_Range("E" + i, "E" + i); Excel.Range Betreuer_e = (Excel.Range)ws.get_Range("F" + i, "F" + i); Excel.Range Anzahl_e = (Excel.Range)ws.get_Range("G" + i, "G" + i); Excel.Range Besucher_e = (Excel.Range)ws.get_Range("H" + i, "H" + i); Excel.Range PSA_e = (Excel.Range)ws.get_Range("I" + i, "I" + i); Excel.Range Raum_e = (Excel.Range)ws.get_Range("J" + i, "J" + i); Excel.Range Bewirtung_e = (Excel.Range)ws.get_Range("K" + i, "K" + i); Excel.Range Werbemittel_e = (Excel.Range)ws.get_Range("L" + i, "L" + i); Excel.Range Technik_e = (Excel.Range)ws.get_Range("M" + i, "M" + i); Excel.Range Exponate_e = (Excel.Range)ws.get_Range("N" + i, "N" + i); Excel.Range GHV_e = (Excel.Range)ws.get_Range("O" + i, "O" + i); Excel.Range Inhalt_e = (Excel.Range)ws.get_Range("P" + i, "P" + i); Excel.Range Kommentar_e = (Excel.Range)ws.get_Range("Q" + i, "Q" + i); Veranstaltung = Veranstaltung_e.Value2.ToString(); vDatum = vDatum_e.Value2.ToString(); bDatum = bDatum_e.Value2.ToString(); Dauer = Convert.ToInt32(Dauer_e.Value2.ToString()); ASP = ASP_e.Value2.ToString(); Betreuer = Betreuer_e.Value2.ToString(); Anzahl = Convert.ToInt32(Anzahl_e.Value2.ToString()); Besucher = Besucher_e.Value2.ToString(); PSA = PSA_e.Value2.ToString(); Raum = Raum_e.Value2.ToString(); Bewirtung = Bewirtung_e.Value2.ToString(); Werbemittel = Werbemittel_e.Value2.ToString(); Technik = Technik_e.Value2.ToString(); Exponate = Exponate_e.Value2.ToString(); GHV = GHV_e.Value2.ToString(); Inhalt = Inhalt_e.Value2.ToString(); Kommentar = Kommentar_e.Value2.ToString();

    //dein Code hier } f1.notifyIcon1.BalloonTipText = "Der Import war erfolgreich"; f1.notifyIcon1.ShowBalloonTip(5000); } catch (Exception e) { MessageBox.Show(e.Message); } wb.Close(); }


    VG

    BlackRose2


    Freitag, 10. Mai 2013 12:04
  • Hallo Bensen83,

    ich weiß zwar nicht ob du dein Problem schon gelöst hast, aber ich antworte trotzdem mal.

    Ich hab mit vor einiger Zeit mal eine kleine Import-Funktion geschrieben.

    Kopftext:

    using Excel = Microsoft.Office.Interop.Excel;

    Button:

    private void button3_Click(object sender, EventArgs e)
    {
                string Pfad = "";
    
                OpenFileDialog Import = new OpenFileDialog();
                Import.Filter = "Excel-Arbeitsmappe (*.xlsx)|*.xlsx|All files (*.*)|*.*";
    
                if (Import.ShowDialog() == DialogResult.OK) Pfad = Import.FileName;
    
                Import(Pfad);
    }

    Funktion:

    (per Button übergebe ich der Funktion den Pfad zu Datei *.xlsx)

    private void Import(string Pfad) { Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); excel.Visible = false; Excel.Workbook wb = null; string ASP = ""; string bDatum = ""; string Betreuer = ""; string Besucher = ""; string Bewirtung = ""; string Exponate = ""; string GHV = ""; string Inhalt = ""; string Kommentar = ""; string PSA = ""; string Raum = ""; string Technik = ""; string vDatum = ""; string Veranstaltung = ""; string Werbemittel = ""; int Anzahl = 0; int Dauer = 0; int i; wb = excel.Workbooks.Open(Pfad); Excel.Sheets sheets = wb.Worksheets; Excel.Worksheet ws = (Excel.Worksheet)sheets.get_Item("Termine"); try { for (i = 2; i <= excel.get_Range("A" + excel.Rows.Count, "A" + excel.Rows.Count).get_End(Excel.XlDirection.xlUp).Row; i++) { Excel.Range Veranstaltung_e = (Excel.Range)ws.get_Range("A" + i, "A" + i); Excel.Range vDatum_e = (Excel.Range)ws.get_Range("B" + i, "B" + i); Excel.Range bDatum_e = (Excel.Range)ws.get_Range("C" + i, "C" + i); Excel.Range Dauer_e = (Excel.Range)ws.get_Range("D" + i, "D" + i); Excel.Range ASP_e = (Excel.Range)ws.get_Range("E" + i, "E" + i); Excel.Range Betreuer_e = (Excel.Range)ws.get_Range("F" + i, "F" + i); Excel.Range Anzahl_e = (Excel.Range)ws.get_Range("G" + i, "G" + i); Excel.Range Besucher_e = (Excel.Range)ws.get_Range("H" + i, "H" + i); Excel.Range PSA_e = (Excel.Range)ws.get_Range("I" + i, "I" + i); Excel.Range Raum_e = (Excel.Range)ws.get_Range("J" + i, "J" + i); Excel.Range Bewirtung_e = (Excel.Range)ws.get_Range("K" + i, "K" + i); Excel.Range Werbemittel_e = (Excel.Range)ws.get_Range("L" + i, "L" + i); Excel.Range Technik_e = (Excel.Range)ws.get_Range("M" + i, "M" + i); Excel.Range Exponate_e = (Excel.Range)ws.get_Range("N" + i, "N" + i); Excel.Range GHV_e = (Excel.Range)ws.get_Range("O" + i, "O" + i); Excel.Range Inhalt_e = (Excel.Range)ws.get_Range("P" + i, "P" + i); Excel.Range Kommentar_e = (Excel.Range)ws.get_Range("Q" + i, "Q" + i); Veranstaltung = Veranstaltung_e.Value2.ToString(); vDatum = vDatum_e.Value2.ToString(); bDatum = bDatum_e.Value2.ToString(); Dauer = Convert.ToInt32(Dauer_e.Value2.ToString()); ASP = ASP_e.Value2.ToString(); Betreuer = Betreuer_e.Value2.ToString(); Anzahl = Convert.ToInt32(Anzahl_e.Value2.ToString()); Besucher = Besucher_e.Value2.ToString(); PSA = PSA_e.Value2.ToString(); Raum = Raum_e.Value2.ToString(); Bewirtung = Bewirtung_e.Value2.ToString(); Werbemittel = Werbemittel_e.Value2.ToString(); Technik = Technik_e.Value2.ToString(); Exponate = Exponate_e.Value2.ToString(); GHV = GHV_e.Value2.ToString(); Inhalt = Inhalt_e.Value2.ToString(); Kommentar = Kommentar_e.Value2.ToString();

    //dein Code hier } f1.notifyIcon1.BalloonTipText = "Der Import war erfolgreich"; f1.notifyIcon1.ShowBalloonTip(5000); } catch (Exception e) { MessageBox.Show(e.Message); } wb.Close(); }


    VG

    BlackRose2


    Hallo BlackRose2,

    danke für den Code der mir wirklich schon weiter geholfen hat. Mir stellt sich nur die Frage, wie ich die Werte der Spalten in eine Textbox anzeigen lassen kann. Am Besten wäre es wenn man noch das Datum auswählen könnte und nur die Daten anzeigt die zum ausgewählten Datum passen.

    Zum Einlesen dachte ich an eine ProgressBar die den Fortschritt des Einlesens anzeigt.

    Funktioniert das?

    http://www.bilderhoster.net/4ckh4m2v.png.html

    Es geht dabei um geplante Updates mit relevanten Daten die im Textfeld angezeigt werden sollen.

    Später sollen die Daten des gewählten Datums als txt exportiert werden (Noch in Überlegung)


    Mittwoch, 11. Juni 2014 06:43