C# Excel-Datei in der Konsole ausgeben mit C#

Captium schrieb:
Danke Drexel!!!
Hätte da paar Fragen:
Du sprichst von "Grid" was ist das genau?
Was macht der streamReader genau?
Was ist ist die erste Zeile der Datei(Beispiel?)?
Ich lese ALLES was ich nicht verstehe in erst in der MSDN, aber das wird dort oft auch etwas zu abstrakt erklärt finde ich.

Ich bin noch 16 und blick alles nicht auf anhieb, bitte um Verständnis :D

Trotzdem musst Du Dir einige Sachen mal selbst ergooglen und ausprobieren. Die MSDN ist ja auch voll mit Codebeispielen. Eine gute Anlaufstelle ist immer google mit Keyword+Tutorial.


Grid steht doch in Deinem Code, bzw DataGridView. Ein Grid ist prinzipiell eine Gui Element um weitere Gui Komponenten an einem Raster auszurichten, so dass alle Elemente einheitlich positioniert sind und nicht, dass eine 2 Pixel weiter oben und ein anderes 3 Pixel weiter rechts als andere Elemente. Ein DataGridView im speziellen ist aber eine Gui Komponente zur Darstellung von tabellarischen Daten.
https://msdn.microsoft.com/de-de/library/e0ywh3cz(v=vs.110).aspx

Ein Stream ist prinzipiell eine Folge von Bits, letztendlich sind jegliche Daten immer ein Stream, egal ob es sich um eine Datei, den Ram oder eine Netzwerkverbindung handelt, auf unterster Ebene stehen Bits, die gelesen und geschrieben werden. Der StreamReader wandelt den BitStream wieder in UTF8-Text um.
https://msdn.microsoft.com/de-de/li...(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp
https://msdn.microsoft.com/de-de/library/system.io.textreader(v=vs.110).aspx
Erster google link: https://www.dotnetperls.com/streamreader

Was ist ist die erste Zeile der Datei(Beispiel?)? -> Die Frage versteh ich nicht ganz. Du hast doch gesagt, Du hast eine CSV Datei. Mach sie mit einem Text Editor auf und schau Dir die erste Zeile an.
 
Alles klar,

wie mache ich das alles jetzt, ohne das die Datei von Anfang an eine CSV Datei ist?
Also ein ganz normales Excel file.

MfG
 
Das habe ich alles durch, verstehen ist was anderes.
Wie und warum muss ich jetzt meinen Code abändern damit ich eine Excel-Datei in Microsoft SQL Server Management Studio schreiben und abspeichern kann?
Kann ich zum Code nur was hinzufügen oder muss was ganz neues her?
Gegoogelt habe ich schon was alles zum Thema, aber ohne Beispiele ist das schwer zu verstehen, wenn einfach ein riesen Codeblock dahin geklatscht wird.
 
Was willst du tun? Was hat MS SQL Server damit zu tun? Das in eine Datenbank zu schreiben macht nochmal ein ganz neues Kapitel auf, nein das geht nicht mit wenigen Codezeilen. Du musst schließlich erstmal eine entsprechende Datenbank erstellen und deine Tabelle da rein mappen (z.B. welche Spalte wo hin). Dafür gibt es einen Haufen verschiedene Ansätze. Per Hand, Entity Framework, etc.

Hier eine Methode, um eine Exceldatei, in der die Spaltennamen in der ersten Zeile stehen, zu einem DataTable umzuwandeln. Damit hat man schon mal eine Menge gewonnen.

Code:
/// <summary>
        /// Liest eine Exceldatei ein und erstellt aus ihr ein DataTable
        /// </summary>
        /// <param name="excelFile"></param>
        /// <returns></returns>
        private DataTable excelToDataTable(string excelFile)
        {            
            //Verbindung zu Excel mittels OleDb
            string sConnection = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={excelFile};Extended Properties=\"Excel 12.0;HDR=No;IMEX=1\"";

            using (OleDbConnection oleExcelConnection = new OleDbConnection(sConnection))
            {
                oleExcelConnection.Open();
                //Herausfinden, wie das sheet heißt
                DataTable dtTablesList = oleExcelConnection.GetSchema("Tables");
                string sSheetName = null;
                if (dtTablesList.Rows.Count > 0)
                {
                    sSheetName = dtTablesList.Rows[0]["TABLE_NAME"].ToString();
                }
                dtTablesList.Clear();
                dtTablesList.Dispose();
                //Daten auslesen
                if (!string.IsNullOrEmpty(sSheetName))
                {
                    OleDbDataAdapter excelDataAdapter = new OleDbDataAdapter("Select * From [" + sSheetName + "]", oleExcelConnection);
                    DataSet excelData = new DataSet();
                    excelDataAdapter.Fill(excelData);
                    //Erste Tabelle auslesen und in DataTable umwandeln
                    DataTable returnTable = excelData.Tables[0];
                    //Die Werte der ersten Zeile zu Spaltennamen machen
                    if (returnTable.Rows.Count > 0)
                    {
                        for (int i = 0; i < returnTable.Rows[0].ItemArray.Count(); i++)
                        {                            
                            returnTable.Columns[i].ColumnName = returnTable.Rows[0].ItemArray[i].ToString();
                        }
                        //Die erste Zeile daraufhin entfernen, sie enthält schließlich nur die Spaltennamen
                        returnTable.Rows.RemoveAt(0);
                    }

                    return returnTable;
                }
                else
                {
                    //Wenn kein Sheet gefunden wird, ist der Rückgabewert null
                    return null;
                }
            }
        }
 
Zuletzt bearbeitet:
@Enurian

Danke dir, aber...
...so sehr kenne ich mich mit C# noch nicht aus. Mehr als die hälfte der Methode sagt mir leider nichts.

Ich muss mir das jetzt Schritt für Schritt selber beibringen, aber wie das am besten geht ist die Frage...?
 
Das hat nix mit C# selber zu tun denke ich. Dein Problem ist das allgemeine Verständnis vom Programmieren.

Man kann nicht behaupten, das man schon etliche Programme geschrieben hat, aber scheitert dann schon am Grundverständnis.
Bevor du in die GUI Programmierung einsteigst, solltest du es villt erstmal mit einer Konsolen Anwendung versuchen, die du nach und nach dann um eine Datenbankanbindung und eine grafische Oberfläche erweiterst.

Das Ganze kann man dann weiter stricken indem man die Software modular gestaltet. Aber das führt hier zu weit, als erstes sollten mal die grundsätzlichen Dinge des Programmierens verstanden werden.
Da spielt es dann auch erstmal keine Rolle ob es sich um C#, Java, VisualBasic oder was sonst für eine Sprache handelt.

Logisches Denken und mathematisches Verständnis kommt übrigens auch zum Tragen.
 
Soooooo hab jetzt was zusammengetippt, aber das funktioniert nicht wie ich will. xD
Im C# Teil stimmt alles glaube ich soweit.
Wo ist mein Fehler?
Mein C# Code:
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ImportCSVFile
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnImport_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.WaitCursor;

            DataTable importData = GetDataFromFile();

            if (importData == null) return;
                SaveImportDataToDatabase(importData);

            MessageBox.Show("Import Complete");
            txtFileName.Text = string.Empty;

            Cursor = Cursors.Default;
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void btnBrowse_Click(object sender, EventArgs e)
        {

            OpenFileDialog ofd = new OpenFileDialog();
            ofd.DefaultExt = ".csv";
            ofd.Filter = "Comma Separated (*.csv)|*.csv";
            ofd.ShowDialog();

            txtFileName.Text = ofd.FileName;
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        private DataTable GetDataFromFile()
        {
            DataTable importedData = new DataTable();
            try
            {
                using (StreamReader sr = new StreamReader("txtFileName.Text"))
                {

                    string header = sr.ReadLine();
                    if (string.IsNullOrEmpty(header))
                    {
                        MessageBox.Show("No file data");
                        return null;
                    }

                    string[] headerColumns = header.Split(',');
                    foreach (string headerColumn in headerColumns)
                    {
                        importedData.Columns.Add(headerColumn);
                    }

                    while (!sr.EndOfStream)
                    {
                        string line = sr.ReadLine();

                        if (string.IsNullOrEmpty(line)) continue;

                        string[] fields = line.Split(',');

                        DataRow importedRow = importedData.NewRow();

                        for (int i = 0; i < fields.Count(); i++)
                        {
                            importedRow[i] = fields[i];
                        }

                        importedData.Rows.Add(importedRow);

                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("The file could not be read:");
                Console.WriteLine(e.Message);
            }
            return importedData;
        }

        private void SaveImportDataToDatabase(DataTable importData)
        {
            using (SqlConnection conn = new SqlConnection("Server=localhost; Database=TestDB;Trusted_Connection=True;"))
            {
                conn.Open();
                foreach (DataRow importRow in importData.Rows)
                {
                    SqlCommand cmd = new SqlCommand("INSERT INTO ImportData (StatioID, ClientID, rate, ShowTitleID) " +  
                                                    "VALUES (@stationId, @clientId, @rate, @showTitleID)", conn);

                    cmd.Parameters.AddWithValue("@stationId", importRow["StationID"]);
                    cmd.Parameters.AddWithValue("@clientId", importRow["ClientID"]);
                    cmd.Parameters.AddWithValue("@rate", importRow["rate"]);
                    cmd.Parameters.AddWithValue("@showTitleID", importRow["ShowTitleID"]);

                    cmd.ExecuteNonQuery();
                }
            }
        }
    }
}


So sieht es in SQL aus(Vom SQL Teil verstehe ich absolut nichts, hab nur heraus gefunden das es so in etwa funken sollte):
Code:
INSERT INTO dbo.ImportData
SET StationID = 1, 
ClientID = 1, 
rate = 1, 
ShowTitleID = 1

"Oberste 1000 Zeilen auswählen" in SQL:
Code:
SELECT TOP (1000) [Id]
      ,[ImportDate]
      ,[StationID]
      ,[ClientID]
      ,[rate]
      ,[ShowTitleID]
  FROM [TestDB].[dbo].[ImportData]

Ziel ist, das was in meiner CSV-Datei ist soll hier drinne stehen am Ende: sql.PNG
Geht aber leider nicht, und selber finde ich nicht den Fehler bzw. meine SQL Kenntnisse sind (noch) überschaubar.

Hoffe jemand kann mir wieder helfen... :)

Danke schon mal
 
Zuletzt bearbeitet:
Ist ganz einfach, du hast in deiner DataTable keinerlei Datentypen für die Spalten definiert und auch keinerlei Typkonvertierung von den Zeilen aus der CSV gemacht.

Daher ist alles String, da dein Wert direkt über das Array von Split reinkommt, somit bricht dann auch dein SQL Query zusammen.
 
Hmm, ist mir nicht ganz klar...wie müsste es dann aussehen?

Ich habe nur diese Fehlermeldung im SQL :
Meldung 156, Ebene 15, Status 1, Zeile 2
Falsche Syntax in der Nähe des SET-Schlüsselworts

Dachte ich muss nur das beheben...vielleicht ist es ja auch das.
 
Zuletzt bearbeitet:
Diese INSERT-Syntax funktioniert glaube ich nur in MySQL. Der Rest sieht aber stark nach MS-SQL aus, stimmt's?
 
Die Fehlermeldung sagt es doch schon, hättest die mal gleich geschrieben...
Code:
INSERT INTO dbo.ImportData
(StationID, ClientID, rate, ShowTitleID)
VALUES (1, 1, 1, 1)
 
Ja es handelt sich um MS-SQL.
Enurian, der gibt trotzdem was komplett anderes aus als das was in der eigentlichen CSV-Datei steht...
Das gibt es jetzt ausFalscheausgabe.PNG
 
Das ist doch richtig, wenn du den Code von Enurian übernimmst.
Am Ende steht in dieser ominösen csv-Datei aber auch genau das drin und du suchst einen Fehler den es nicht gibt.
 
Nein, MS-Sql gibt nur einsen aus und in "ImportData" gibt er aus wann das Programm von C# aus gestartet wurde.
Du kannst ja den Code, den ich vorhin gepostet habe, kopieren und es selber probieren :)
 
Zuletzt bearbeitet:
Ich brauche den Code nicht auszuführen, um zu wissen dass der 1en schreibt. Ich habe einen Verdacht, warum in ImportData das aktuelle Datum steht. Das ist aber etwas was du aktiv einstellen musst, hältst es aber nicht für nötig das zu erwähnen. Man kann schlecht helfen, wenn die Hälfte erraten werden muss.
 
Wie soll ich etwas erwähnen, von dem ich bis jetzt selber keine Ahnung hatte, dass es das gibt?

Kann mir jemand anderes helfen?
 
Wie sieht denn der aktuelle Code aus?
 
Ich habe doch nur die korrekte Syntax aufgeschrieben... wenn du VALUES (1,1,1,1) so übernimmst, schreibt er natürlich auch nur Einsen rein. Musst du also durch die korrekten Parameter ersetzen. Und die ImportDate-Spalte wird wahrscheinlich "... DEFAULT getdate()" in der Definition haben. Kann halt keiner riechen.
 
Zurück
Oben