J'ai un DataTable1 avec un tas de lignes que j'ai importées d'Excel. La ligne 1 de cette feuille Excel contient des données qui ne sont pas pertinentes pour ma candidature. Lorsque j'importe cette feuille dans DataTable1, cette première ligne devient l'en-tête.
Ce que j'essaie d'accomplir: Supprimez la ligne d'en-tête de sorte que lorsque je clone DataTable1 vers DataTable2, la deuxième ligne (anciennement troisième, avant la suppression) de DataTable1 soit l'en-tête de DataTable2. Je n'essaye pas de masquer l'en-tête de DataTable1 - j'essaye de le supprimer complètement sans avoir à le supprimer manuellement dans Excel. Cet en-tête / cellule sera toujours identifiable, car dans la feuille Excel, la valeur de cette toute première cellule est littéralement "Données inutiles".
Par exemple:
Données inutiles | Données inutiles | Données inutiles | Données inutiles
Colonne 1 | Colonne 2 | Colonne 3 | Colonne 3 Â Â |
Colonne 3
Les trucs |
Les trucs |
Les trucs |
Des trucs |
Les trucs |
Les trucs |
Les trucs |
Les trucs |
Les trucs |
Les trucs |
Les trucs |
Les trucs |
Les trucs |
Les trucs |
Les trucs |
Les trucs |
Les trucs |
Les trucs |
Les trucs |
Les trucs |
Deviendrait:
Colonne 1 | Colonne 2 | Colonne 3 | Colonne 3 Â Â |
Colonne 3
Les trucs |
Les trucs |
Les trucs |
Des trucs |
Les trucs |
Les trucs |
Les trucs |
Des trucs |
Les trucs |
Les trucs |
Les trucs |
Des trucs |
Les trucs |
Les trucs |
Les trucs |
Des trucs |
Les trucs |
Les trucs |
Les trucs |
Les trucs |
J'ai fait un tas de recherches sur Google et de remue-méninges et je n'arrive pas à comprendre comment y parvenir.
J'ai essayé:
XXX
Ce qui ne fonctionne pas car la ligne [0] est en fait la première ligne après mon en-tête.
if (DataTable1.Rows[0][-1].ToString() == "Unnecessary Data")
{
DataTable2 = DataTable1.Clone();
DataTable2.Rows.Remove(DataTable1.Rows[0]);
}
Ne fonctionne pas non plus car -1 n'est pas un index. Quelqu'un peut-il aider?
3 Réponses :
J'ai construit cet exemple, il n'est pas nécessaire de cloner quoi que ce soit, j'espère que cela vous aidera:
var dt = new DataTable();
dt.Columns.Add("Test");
dt.Rows.Add("1");
dt.Rows.Add("2");
dt.Rows.Add("3");
dt.Rows.RemoveAt(0);
var i = 0;
foreach(var col in dt.Rows[0].ItemArray)
{
dt.Columns[i].ColumnName = col.ToString();
i++;
}
dt.Rows.RemoveAt(0);
// contains "3"
var test = dt.Rows[0].ItemArray[0];
Si vous voulez que la deuxième ligne devienne un en-tête, je ferais quelque chose comme ça, mais pas sûr de votre type de situation:
var dt = new DataTable();
dt.Columns.Add("Test");
dt.Rows.Add("1");
dt.Rows.Add("2");
dt.Rows.Add("3");
dt.Rows.RemoveAt(0);
dt.Rows.RemoveAt(0);
// contains "3"
var test = dt.Rows[0].ItemArray[0];
Hé! Merci. Testé ceci - je vois comment cela fonctionnerait en théorie. Cependant, pour la ligne, dt.Columns [i] .ColumnName = col.ToString () ;, j'obtiens une erreur: 'ColumnName est requis quand il fait partie d'un DataTable.'
Je suppose que la ligne que vous essayez de remplacer en tant que nouveaux noms de colonne contient un NULL ou peut-être simplement une chaîne vide.
Ouais, c'est ce que j'ai pensé aussi - j'ai vérifié deux fois - ce n'est ni nul ni vide :(.
Essayez d'exécuter ceci sur la ligne qui est censée être un en-tête: var test = dt.Rows [0] .ItemArray.Aggregate (string.Empty, (b, s) => string.IsNullOrEmpty (b)? $ "[{ s}] ": $" {b}, [{s}] "); et le poster, devrait nous donner une meilleure idée.
Il montre ma première ligne (pas les en-têtes de colonne).
Il n'y a pas assez de détails sur la façon dont vous importez votre DataTable à partir d'un fichier Excel et je ne suis même pas sûr que le DataTable que vous utilisez soit DataTable de Microsoft.Office.Interop.Excel ou System.Data
Si vous vous assurez que votre DataTable est converti en DataTable de l'espace de noms System.Data , votre problème sera résolu par ce morceau de code:
First Column Second Column 1 First Row
Comme vous pouvez le voir dans l'exemple suivant:
First Column Second Column _ Redundant Row 1 First Row
Le résultat du code après exécution est: p >
Avant dataTable.Rows [0] .Delete (); s'exécute:
//create a DataTable
DataTable dataTable = new DataTable();
//Add Columns for DataTable
dataTable.Columns.Add(new DataColumn("First Column"));
dataTable.Columns.Add(new DataColumn("Second Column"));
//Add redundant DataRow and another DataRow to DataTable
DataRow dataRow = dataTable.NewRow();
dataRow[0] = "_";
dataRow[1] = "Redundant Row";
dataTable.Rows.Add(dataRow);
dataRow = dataTable.NewRow();
dataRow[0] = "1";
dataRow[1] = "First Row";
dataTable.Rows.Add(dataRow);
//print out the DataTable before deleting redundant DataRow
Console.WriteLine("\n" + dataTable.Columns[0] + "\t" + dataTable.Columns[1] + "\n");
foreach (DataRow row in dataTable.Rows)
{
Console.WriteLine(row[0] + "\t\t" + row[1]);
}
//delete redundant DataRow
dataTable.Rows[0].Delete();
//print again the DataSet to see results
Console.WriteLine("\n" + dataTable.Columns[0] + "\t" + dataTable.Columns[1] + "\n");
foreach (DataRow row in dataTable.Rows)
{
Console.WriteLine(row[0] + "\t\t" + row[1]);
}
Après dataTable.Rows [0] .Delete (); exécute:
DataTable.Rows[rowIndex].Delete();
J'espère que cela vous aidera.
Si l'objectif est d'utiliser les valeurs de la deuxième ligne pour définir les noms de colonnes de dataTable1 , et de se débarrasser des première et deuxième lignes:
var dataTable2 = dataTable1.AsEnumerable().Skip(2).CopyToDataTable();
dataTable2.Columns.Cast<DataColumn>()
.ToList()
.ForEach(c => c.ColumnName = dataTable1.Rows[1][c.Ordinal].ToString());
Cependant, si vous devez conserver le dataTable1 tel quel et créer un nouveau DataTable:
dataTable1.Columns.Cast<DataColumn>()
.ToList()
.ForEach(c => c.ColumnName = dataTable1.Rows[1][c.Ordinal].ToString());
dataTable1.Rows.RemoveAt(0);
dataTable1.Rows.RemoveAt(0);
Hey - J'obtiens un 'ColumnName' est requis lorsqu'il fait partie d'une erreur DataTable pour chacun de ces exemples: /
Toujours obtenir la même exception, mais dataTable1 a absolument des valeurs. Vérifié avec cette ligne de code pour s'assurer que: dataTable1.Rows [0] .ItemArray.Aggregate (string.Empty, (b, s) => string.IsNullOrEmpty (b)? $ "[{S}]": $ " {b}, [{s}] ")
La deuxième méthode était incorrecte. Utilisez ceci pour produire ce que vous voyez si tel est votre objectif. Bonne chance.
Résout éventuellement votre problème? stackoverflow.com/q/15492589/1578604 Vous pouvez définir les en-têtes à partir de la ligne dont vous en avez besoin en premier, puis les supprimer rangée lorsque vous avez terminé.