Convertir DataTable au format CSV, les flux de
Ont actuellement une DataTable, mais qui souhaitent le diffuser à l'utilisateur par l'intermédiaire d'un WebHandler. FileHelpers a CommonEngine.DataTableToCsv(dt, "file.csv")
. Cependant, il l'enregistre dans un fichier. Comment puis-je enregistrer un flux à la place? Je sais comment le faire quand je sais que les colonnes avancé ou qu'ils ne changent pas, mais je veux générer les en-têtes de colonne droite de la table de données.
Si je sais que les colonnes je viens de créer la catégorie:
[DelimitedRecord(",")]
public class MailMergeFields
{
[FieldQuoted()]
public string FirstName;
[FieldQuoted()]
public string LastName;
}
Ensuite utiliser FileHelperEngine et ajouter les enregistrements:
FileHelperEngine engine = new FileHelperEngine(typeof(MailMergeFields));
MailMergeFields[] merge = new MailMergeFields[dt.Rows.Count + 1];
//add headers
merge[0] = new MailMergeFields();
merge[0].FirstName = "FirstName";
merge[0].LastName = "LastName";
int i = 1;
//add records
foreach (DataRow dr in dt.Rows)
{
merge[i] = new MailMergeFields();
merge[i].FirstName = dr["Forename"];
merge[i].LastName = dr["Surname"];
i++;
}
Finalement écrire dans un flux:
TextWriter writer = new StringWriter();
engine.WriteStream(writer, merge);
context.Response.Write(writer.ToString());
Malheureusement, comme je ne connais pas les colonnes avant de la main, je ne peux pas créer la classe avant de la main.
- Les types de Fichiers de la bibliothèque open source. Pourquoi n'avez-vous pas de crack en et ajouter votre propre méthode?
- Vous pouvez le vérifier gist.github.com/riyadparvez/4467668
- Ce résumé contient un bogue où les entrées par des virgules ne sera pas manipulée correctement. Voir stackoverflow.com/q/769621/1461424
Vous devez vous connecter pour publier un commentaire.
Vous pouvez simplement écrire quelque chose rapidement vous-même:
Et à tester:
EDIT: Re vos commentaires:
Dépend de comment vous voulez que votre csv formaté mais en général, si le texte contient des caractères spéciaux, vous souhaitez encadrer par des guillemets exemple: "mon texte". Vous pouvez ajouter la vérification dans le code qui crée le csv pour vérifier les caractères spéciaux et renferme le texte de guillemets si elle est. Comme pour l' .NET 2.0 chose, juste créer un helper dans votre classe ou supprimer le mot de cela dans la déclaration de la méthode et de l'appeler de la sorte : les Extensions.ToCsv(table);
string s = result.ToString(); s = s.TrimEnd(new char[] { '\r', '\n' }); return s;
Mise à jour de 1
J'ai modifié pour utiliser StreamWriter au lieu de cela, ajouter une option pour vérifier si vous avez besoin d'en-têtes de colonne dans votre sortie.
Comme vous pouvez le voir, vous pouvez choisir la sortie initiale StreamWriter, si vous utilisez
StreamWriter(Flux BaseStream), vous pouvez écrire csv dans MemeryStream, FileStream, etc.
Origine
J'ai une simple table de données au format csv, une fonction, il me sert bien:
Si vous pouvez transformer votre datatable dans un IEnumerable cela devrait fonctionner pour vous...
Je ne sais pas si ce converti à partir de VB, C#, ok, mais si vous ne voulez pas de guillemets autour de vos numéros, vous pouvez comparer le type de données comme suit..
Si vous souhaitez diffuser le CSV à l'utilisateur sans la création d'un fichier puis j'ai trouvé le suivant à être la méthode la plus simple. Vous pouvez utiliser n'importe quelle extension/méthode pour créer le ToCsv fonction () (qui retourne une chaîne de caractères sur la base de la DataTable).
J'ai utilisé le code suivant, pillés de quelqu'un du blog (pls pardonner l'absence de citation). Il prend soin de citations, de retour à la ligne et de la virgule dans un raisonnablement de manière élégante en citant chaque valeur de champ.
Vous pouvez essayer d'utiliser quelque chose comme cela.
Dans ce cas, j'ai utilisé une procédure stockée à obtenir plus de tables de données et l'exportation de tous
au format CSV.
Alibres bd'agir réponse a fonctionné pour moi. J'avais besoin de poster le ruisseau à droite du navigateur. Ce qui j'imagine est une alternative commune. J'ai ajouté ce qui suit à alibres bd'agir main() de code pour ce faire: