Xuất sang CSV bằng MVC, C # và jQuery


85

Tôi đang cố gắng xuất danh sách sang tệp CSV. Tôi đã làm cho tất cả hoạt động cho đến thời điểm tôi muốn ghi vào tệp vào luồng phản hồi. Điều này không làm bất cứ điều gì.

Đây là mã của tôi:

Gọi phương thức từ trang.

$('#btn_export').click(function () {
         $.post('NewsLetter/Export');
});

Mã trong bộ điều khiển như sau:

[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();
        }

Nhưng sau khi Response.Write(sw)không có gì xảy ra. Có thể lưu một tập tin theo cách này không?

Trân trọng

Chỉnh sửa
Các tiêu đề phản hồi tôi thấy khi nhấp vào nút là:

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

Điều đó có vẻ ổn với tôi ..

Chỉnh sửa
Tôi đã loại bỏ phần jQuery và thay thế nó bằng một siêu liên kết và điều này hiện đang hoạt động tốt đối với tôi:

<a class="export" href="NewsLetter/Export">exporteren</a>

1
Có thể câu hỏi này trên SO sẽ hữu ích: stackoverflow.com/questions/4522590/…
Rob

Bạn có thể ghi lại câu trả lời của mình như một câu trả lời thực tế hơn là chỉnh sửa câu hỏi.
Caltor

Câu trả lời:


250

yan.kun đã đi đúng hướng nhưng điều này dễ dàng hơn nhiều.

    public FileContentResult DownloadCSV()
    {
        string csv = "Charlie, Chaplin, Chuckles";
        return File(new System.Text.UTF8Encoding().GetBytes(csv), "text/csv", "Report123.csv");
    }

Làm thế nào chúng ta sẽ xử lý các chuỗi có chứa dấu phẩy? Tôi đã thử sử dụng dấu ngoặc kép làm định nghĩa văn bản nhưng dường như nó không hoạt động.
Mike Cole,

1
@mmssaann Đó là cái hay của nó, bạn không sử dụng javascript. Bạn chỉ cần đặt href của thẻ liên kết của mình thành hành động. <a href="ControllerName/ActionName">Download CSV</a>
Biff MaGriff

1
Tôi đã đặt href cho thẻ liên kết. Nó đang hoạt động tốt. Tuy nhiên, tôi vẫn có thể thấy toàn bộ trang được đăng lại. có cách nào để hạn chế đăng lại không?
mmssaann

1
@mmssaann Bạn nên đặt một câu hỏi mới với thông tin chi tiết về thiết lập cụ thể của bạn.
Biff MaGriff

1
Mình dùng cách của bạn để tạo CSV tải xuống, mọi thứ có vẻ ok, mình gỡ lỗi thì nó vào controller. Nhưng trình duyệt không hiển thị bất kỳ dấu hiệu của tệp tải xuống? Bạn có nghĩ rằng điều gì đang xảy ra, tôi cần thay đổi Web.config hay gì đó không?
zquanghoangz 25/09/18

13

Với MVC, bạn có thể chỉ cần trả lại một tệp như sau:

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")));
}

8
Bạn có thực sự muốn tạo một loạt các tệp trên máy chủ web không? Làm sạch chúng thì sao? Còn về vấn đề bảo mật?
chris

@chris không tạo tệp trong bộ nhớ của máy chủ chứ không phải hệ thống tệp?
galdin

Mình dùng cách của bạn để tạo CSV download, mọi thứ có vẻ ok, mình gỡ lỗi thì nó vào controller. Nhưng trình duyệt không hiển thị bất kỳ dấu hiệu của tệp tải xuống? Bạn có nghĩ rằng điều gì đang xảy ra, tôi cần thay đổi Web.config hay gì đó không?
zquanghoangz 25/09/18

7

Ngoài câu trả lời của Biff MaGriff. Để xuất tệp bằng JQuery, hãy chuyển hướng người dùng đến một trang mới.

$('#btn_export').click(function () {
    window.location.href = 'NewsLetter/Export';
});

5

Điều gì xảy ra nếu bạn thoát khỏi trình ghi chuỗi:

        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();

nope đó cũng không tạo ra sự khác biệt. Tôi đã giải quyết tất cả theo một cách khác. Xem bản chỉnh sửa của tôi. Cảm ơn sự giúp đỡ của bạn anyway!
Gerard

3

Tôn trọng Biff, đây là một vài chỉnh sửa cho phép tôi sử dụng phương pháp này để trả lại CSV từ jQuery / Post đối với máy chủ và quay lại dưới dạng lời nhắc CSV cho người dùng.

    [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");
    }

Bạn sẽ cần dòng unescape nếu bạn đang đánh nó từ một biểu mẫu có mã như sau,

    var input = $("<input>").attr("type", "hidden").attr("name", "mydata").val(data);
    $('#downloadForm').append($(input));
    $("#downloadForm").submit();

3

Từ một nút trong chế độ xem, hãy gọi .click (gọi một số tập lệnh java). Từ đó gọi phương thức điều khiển bằng window.location.href = 'Controller / Method';

Trong bộ điều khiển hoặc thực hiện cuộc gọi cơ sở dữ liệu và lấy dữ liệu hoặc gọi một số phương thức lấy dữ liệu từ bảng cơ sở dữ liệu đến một cơ sở dữ liệu và sau đó thực hiện theo sau,

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();
                           }

1

Ngay cả khi bạn đã giải quyết vấn đề của mình, đây là một cách khác, hãy thử xuất csv bằng mvc.

return new FileStreamResult(fileStream, "text/csv") { FileDownloadName = fileDownloadName };

0

Tôi nghĩ bạn đã quên sử dụng

  Response.Flush();

Dưới

  Response.Write(sw);

hãy kiểm tra


-3

Tạo tệp excel đơn giản trong mvc 4

public ActionResult results () {return File (new System.Text.UTF8Encoding (). GetBytes ("string data"), "application / csv", "filename.csv"); }


Đây không phải là một câu trả lời hay. Vui lòng tham khảo Làm cách nào để viết một câu trả lời hay?
Clijsters

Đó là một câu trả lời tốt. Nó chỉ được định dạng sai và sao chép câu trả lời hay nhất đã được đăng 6 năm trước đó. : D
Caltor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.