Laden...

Letzte Spalte mit Daten in Exceltabelle ermitteln und in DataGrid ausgeben

Erstellt von bigaanan vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.868 Views
B
bigaanan Themenstarter:in
5 Beiträge seit 2017
vor 7 Jahren
Letzte Spalte mit Daten in Exceltabelle ermitteln und in DataGrid ausgeben

Hallo alle miteinander,

ich benötige Hilfe, bin keine Programmiererin, deswegen seit gnädig mit mir)))

Ich habe eine Exceldatei, welche aus mehreren Tabellen besteht. Da diese Datei ein lebendes Dokument ist, wird es jedes mal um mehreren Spalten erweitert.
Meine Aufgabe ist, in Tabelle 4, die letzte Spalte mit Daten rausfinden und diese mit dazugehörigen Namen, welche sich in Spalte B befinden, in DataGreed ausgeben.
Ich muss auch dazu sagen dass der Datenumfang sehr groß ist geht bis 500 Zeilen und mehr und die letzten Spalten befinden sich mitlerweile in Spalten mit 3 Buchstaben.

Bis jetzt habe ich folgenden Code geschrieben, besser zu sagen im Internet gefunden

  private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.DefaultExt = "*.xls;*.xlsx";
            
            //Filter
            //ofd.Filter = " Excel 2003(*.xls)|*.xls|Excel 2016(*.xlsx)|*.xlsx";
            //ofd.Title = "";

            ExcelObj.Application app = new ExcelObj.Application();
            ExcelObj.Workbook workbook;
            ExcelObj.Worksheet NwSheet;
            ExcelObj.Range ShtRange;
            DataTable dt = new DataTable();

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = ofd.FileName;
            }
            workbook = app.Workbooks.Open(ofd.FileName, Missing.Value,
                Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                Missing.Value);
            NwSheet = (ExcelObj.Worksheet)workbook.Sheets.get_Item(1);
            ShtRange = NwSheet.UsedRange;
            
            for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++)
            {
                dt.Columns.Add(
                    new DataColumn((ShtRange.Cells[1, Cnum] as ExcelObj.Range).Value2.ToString()));
            }
            for (int Rnum = 2; Rnum <= ShtRange.Rows.Count; Rnum++)
            {
                DataRow dr = dt.NewRow();
                for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++)
                {
                    if ((ShtRange.Cells[Rnum, Cnum] as ExcelObj.Range).Value2 != null)
                    {
                        dr[Cnum - 1] = (ShtRange.Cells[Rnum, Cnum] as ExcelObj.Range).Value2.ToString();
                    }
                }
                dt.Rows.Add(dr);
                dt.AcceptChanges();
            }
            dataGridView1.DataSource = dt;
            app.Quit();
        }

aber erstens liest er mir komplett alle Daten aus der Datei aus und 2tens es funktioniert nur mit kleinen Mängen an Daten.

Wäre euch dankbar, wenn ihr mir hilft auf die benötigten Daten zuzugreifen.
Danke schön!

1.696 Beiträge seit 2006
vor 7 Jahren

Hallo,

  1. mit dt.Rows/Cols.Add fügst du Daten in DataTable ein, daher wird die komplette Tabelle auch "eingelesen"
  2. ShtRange.Columns.Count sagt dir schon welche die letzte Spalte mit Daten ist

Im Allgemeinen sollte man schon Code verstehen, die man im Internet findet, bevor man einsetzt. In diesem Fall ist es ja noch harmlos, aber es gibt auch Fälle wo man schlimmes anrichten kann, wenn man einfach Code einbaut, ohne zu wissen was es macht.

Gruß

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

B
bigaanan Themenstarter:in
5 Beiträge seit 2017
vor 7 Jahren

Erstmal vielen Dank!

ich habe den Code jetzt so geändert.


workbook = app.Workbooks.Open(ofd.FileName, Missing.Value,
                Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                Missing.Value);
            NwSheet = (ExcelObj.Worksheet)workbook.Sheets.get_Item(1);
            ShtRange = NwSheet.UsedRange;
            int Cnum;
            Cnum = ShtRange.Columns.Count;

            dt.Columns.Add(new DataColumn((ShtRange.Cells[1, Cnum] as ExcelObj.Range).Value2.ToString()));

            for (int Rnum = 2; Rnum <= ShtRange.Rows.Count; Rnum++)
            {
                DataRow dr = dt.NewRow();
                for (int Cn = 1; Cn <= ShtRange.Columns.Count; Cn++)
                {
                   //hir muss man bestimmt die Zellen befühlen
                }
                dt.Rows.Add(dr);
                dt.AcceptChanges();
            }

Die Spalte wird jetzt rausgegeben, aber lehr...könntest du mir noch helfen, die zu befüllen?))

1.696 Beiträge seit 2006
vor 7 Jahren

Die Spalte wird jetzt rausgegeben, aber lehr...könntest du mir noch helfen, die zu befüllen?))

dr befüllen, bevor dt.Rows.Add(dr) ausgeführt wird, dann wird die Spalte nicht leer sein.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

B
bigaanan Themenstarter:in
5 Beiträge seit 2017
vor 7 Jahren


dr[Cn] = (ShtRange.Cells[Rnum, Cnum] as ExcelObj.Range).Value2.ToString();


das funktioniert nicht

1.696 Beiträge seit 2006
vor 7 Jahren

Du hast in deine DataTable nur eine Spalte initialisiert, daher kannst du nicht mit n*m Daten befüllen, also denke nach. Außerdem try ... catch sollte dir dabei helfen.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

B
bigaanan Themenstarter:in
5 Beiträge seit 2017
vor 7 Jahren

ok....jetzt bekomme ich die Daten von letzte Spalte, aber der gibt mir auch gleichzeitig die restlichen leeren Zeilen aus........aaaaaaaaaaaaaa ich habe schon alles mögliches ausprobiert


for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++)
            {
            
                dt.Columns.Add(
                    new DataColumn((ShtRange.Cells[1, Cnum] as ExcelObj.Range).Value2.ToString()));
            }
            

            for (int Rnum = 2; Rnum <= ShtRange.Rows.Count; Rnum++)
            {
                DataRow dr = dt.NewRow();
                
                   int Cnum = ShtRange.Columns.Count;
                
                    if ((ShtRange.Cells[Rnum, Cnum] as ExcelObj.Range).Value2 != null)
                    {
                        dr[Cnum - 1] = (ShtRange.Cells[Rnum, Cnum] as ExcelObj.Range).Value2.ToString();
                    }
                
                dt.Rows.Add(dr);
                dt.AcceptChanges();

1.696 Beiträge seit 2006
vor 7 Jahren

wenn du vorher schon auf null geprüft hast, dann bleibt nur noch .Trim() und .Length, mit dessen Hilfe du die "leeren" Inhalte ausfiltern kannst.

Wofür ist der 1. for-Block? Ich dachte du willst nur die letzte Spalte haben und nicht alle?

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

B
bigaanan Themenstarter:in
5 Beiträge seit 2017
vor 7 Jahren

Weil ohne den 1. for-Block bekomme ich immer wieder einen Fehler, dass Spalte 3 nicht gefunden wurde.......warum auch immer