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!
Hallo,
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ß
**:::
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?))
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.
**:::
dr[Cn] = (ShtRange.Cells[Rnum, Cnum] as ExcelObj.Range).Value2.ToString();
das funktioniert nicht
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.
**:::
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();
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?
**:::
Weil ohne den 1. for-Block bekomme ich immer wieder einen Fehler, dass Spalte 3 nicht gefunden wurde.......warum auch immer