J'essaye d'exporter une liste dans un fichier CSV. J'ai tout fonctionné jusqu'au point où je veux écrire dans un fichier dans le flux de réponse. Cela ne fait rien.
Voici mon code:
Appelez la méthode à partir de la page.
$('#btn_export').click(function () {
$.post('NewsLetter/Export');
});
Le code dans le contrôleur est le suivant:
[HttpPost]
public void Export()
{
try
{
var filter = Session[FilterSessionKey] != null ? Session[FilterSessionKey] as SubscriberFilter : new SubscriberFilter();
var predicate = _subscriberService.BuildPredicate(filter);
var compiledPredicate = predicate.Compile();
var filterRecords = _subscriberService.GetSubscribersInGroup().Where(x => !x.IsDeleted).AsEnumerable().Where(compiledPredicate).GroupBy(s => s.Subscriber.EmailAddress).OrderBy(x => x.Key);
ExportAsCSV(filterRecords);
}
catch (Exception exception)
{
Logger.WriteLog(LogLevel.Error, exception);
}
}
private void ExportAsCSV(IEnumerable<IGrouping<String, SubscriberInGroup>> filterRecords)
{
var sw = new StringWriter();
//write the header
sw.WriteLine(String.Format("{0},{1},{2},{3}", CMSMessages.EmailAddress, CMSMessages.Gender, CMSMessages.FirstName, CMSMessages.LastName));
//write every subscriber to the file
var resourceManager = new ResourceManager(typeof(CMSMessages));
foreach (var record in filterRecords.Select(x => x.First().Subscriber))
{
sw.WriteLine(String.Format("{0},{1},{2},{3}", record.EmailAddress, record.Gender.HasValue ? resourceManager.GetString(record.Gender.ToString()) : "", record.FirstName, record.LastName));
}
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=adressenbestand.csv");
Response.ContentType = "text/csv";
Response.Write(sw);
Response.End();
}
Mais après que Response.Write(sw)
rien ne se passe. Est-il même possible d'enregistrer un fichier de cette façon?
Cordialement
Modifier
Les en-têtes de réponse que je vois lorsque je clique sur le bouton sont:
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/csv; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNetMvc-Version: 2.0
Content-Disposition: attachment; filename=adressenbestand.csv
X-Powered-By: ASP.NET
Date: Wed, 12 Jan 2011 13:05:42 GMT
Content-Length: 113
Ce qui me semble correct.
Edit
Je me suis débarrassé de la partie jQuery et l'ai remplacée par un lien hypertexte et cela fonctionne très bien pour moi maintenant:
<a class="export" href="NewsLetter/Export">exporteren</a>
c#
jquery
asp.net-mvc
csv
Gérard
la source
la source
Réponses:
yan.kun était sur la bonne voie mais c'est beaucoup plus facile.
public FileContentResult DownloadCSV() { string csv = "Charlie, Chaplin, Chuckles"; return File(new System.Text.UTF8Encoding().GetBytes(csv), "text/csv", "Report123.csv"); }
la source
<a href="ControllerName/ActionName">Download CSV</a>
Avec MVC, vous pouvez simplement renvoyer un fichier comme celui-ci:
public ActionResult ExportData() { System.IO.FileInfo exportFile = //create your ExportFile return File(exportFile.FullName, "text/csv", string.Format("Export-{0}.csv", DateTime.Now.ToString("yyyyMMdd-HHmmss"))); }
la source
En plus de la réponse de Biff MaGriff. Pour exporter le fichier à l'aide de JQuery, redirigez l'utilisateur vers une nouvelle page.
$('#btn_export').click(function () { window.location.href = 'NewsLetter/Export'; });
la source
Que se passe-t-il si vous vous débarrassez du stringwriter:
Response.Clear(); Response.AddHeader("Content-Disposition", "attachment; filename=adressenbestand.csv"); Response.ContentType = "text/csv"; //write the header Response.Write(String.Format("{0},{1},{2},{3}", CMSMessages.EmailAddress, CMSMessages.Gender, CMSMessages.FirstName, CMSMessages.LastName)); //write every subscriber to the file var resourceManager = new ResourceManager(typeof(CMSMessages)); foreach (var record in filterRecords.Select(x => x.First().Subscriber)) { Response.Write(String.Format("{0},{1},{2},{3}", record.EmailAddress, record.Gender.HasValue ? resourceManager.GetString(record.Gender.ToString()) : "", record.FirstName, record.LastName)); } Response.End();
la source
En ce qui concerne Biff, voici quelques modifications qui me permettent d'utiliser la méthode pour faire rebondir CSV de jQuery / Post contre le serveur et revenir en tant qu'invite CSV à l'utilisateur.
[Themed(false)] public FileContentResult DownloadCSV() { var csvStringData = new StreamReader(Request.InputStream).ReadToEnd(); csvStringData = Uri.UnescapeDataString(csvStringData.Replace("mydata=", "")); return File(new System.Text.UTF8Encoding().GetBytes(csvStringData), "text/csv", "report.csv"); }
Vous aurez besoin de la ligne unescape si vous appuyez dessus à partir d'un formulaire avec un code comme celui-ci,
var input = $("<input>").attr("type", "hidden").attr("name", "mydata").val(data); $('#downloadForm').append($(input)); $("#downloadForm").submit();
la source
À partir d'un bouton dans la vue, appelez .click (appelez un script java). À partir de là, appelez la méthode du contrôleur par window.location.href = 'Controller / Method';
Dans le contrôleur, effectuez l'appel de base de données et récupérez la table de données ou appelez une méthode pour obtenir les données de la table de base de données vers une table de données, puis procédez comme suit,
using (DataTable dt = new DataTable()) { sda.Fill(dt); //Build the CSV file data as a Comma separated string. string csv = string.Empty; foreach (DataColumn column in dt.Columns) { //Add the Header row for CSV file. csv += column.ColumnName + ','; } //Add new line. csv += "\r\n"; foreach (DataRow row in dt.Rows) { foreach (DataColumn column in dt.Columns) { //Add the Data rows. csv += row[column.ColumnName].ToString().Replace(",", ";") + ','; } //Add new line. csv += "\r\n"; } //Download the CSV file. Response.Clear(); Response.Buffer = true; Response.AddHeader("content-disposition", "attachment;filename=SqlExport"+DateTime.Now+".csv"); Response.Charset = ""; //Response.ContentType = "application/text"; Response.ContentType = "application/x-msexcel"; Response.Output.Write(csv); Response.Flush(); Response.End(); }
la source
Même si vous avez résolu votre problème, en voici un autre, essayez d'exporter csv à l'aide de mvc.
return new FileStreamResult(fileStream, "text/csv") { FileDownloadName = fileDownloadName };
la source
Je pense que tu as oublié d'utiliser
sous
Vérifiez s'il vous plaît
la source
Création de fichier Excel simple dans mvc 4
public ActionResult results () {return File (nouveau System.Text.UTF8Encoding (). GetBytes ("string data"), "application / csv", "filename.csv"); }
la source