Linq to CSV:将数据转换为 .CSV 文件并从操作中返回文件,而不在服务器上保存文件

Posted

技术标签:

【中文标题】Linq to CSV:将数据转换为 .CSV 文件并从操作中返回文件,而不在服务器上保存文件【英文标题】:Linq to CSV : Convert data to .CSV file and return file from an action without saving file on the server 【发布时间】:2014-03-16 09:17:07 【问题描述】:

我是 LinqToCsv 和这个 tutorial 将我的数据转换为可下载的 csv 文件。

我做了什么:

我创建了一个如下所示的操作:

public FileResult GetReportCsvData(MyFilterModel model)

    var data = _myService.GetMyData(model);

    var fileName = String.Format("0_1_2:yyyy_MMM_d", Helpers.GetLoggedInUserName(), "Ad-Reports", DateTime.Today) + ".csv";
    var outputFileDescription = new CsvFileDescription  SeparatorChar = ',', FirstLineHasColumnNames = true ;
    
    var cc = new CsvContext();
    cc.Write(data, "c:/" + fileName, outputFileDescription);

    return File("c:/" + fileName, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);

并使用以下 jquery 我得到我的 csv 文件:

exportCsv: function () 
    var data = this.getFilters();
    var url = '/MyController/GetReportCsvData';
    var form = document.createElement('form');
    form.action = url;
    form.method = 'POST';
    form.style.display = 'none';        
    for (i in data) 
        if (data[i] != "") 
            var inputElement = document.createElement('textarea');
            inputElement.name = i;
            inputElement.value = data[i];
            form.appendChild(inputElement);
        
    
    document.body.appendChild(form);
    form.submit();

这行得通,我得到了带有下载提示的 csv 文件。

我想要什么

使用当前代码,我必须将文件保存在我的服务器上 (C:/filename),然后返回它的 File 对象。

我不想将它保存在我的服务器上。

我必须做出哪些改变才能实现这一目标?

【问题讨论】:

【参考方案1】:

在您写入磁盘的“cc.Write”上,outputFileDescription 已经是一个 TextStream。因此,不要先将其保存到磁盘,然后使用“文件”从磁盘读取它,只需返回 TextStream

【讨论】:

@Kodefoo 为什么? Google 可以提供成千上万个示例,说明如何读取文本流而不先将其保存到磁盘并再次从磁盘读取? 那么添加到您的答案中应该没问题,并使其对通过谷歌搜索最终到达这里的其他人更有帮助。

以上是关于Linq to CSV:将数据转换为 .CSV 文件并从操作中返回文件,而不在服务器上保存文件的主要内容,如果未能解决你的问题,请参考以下文章

pandas to_csv:将 pandas 写入 csv 时抑制 csv 文件中的科学记数法

将 CSV 文件转换为 XML

如何将csv文件转换为numpy数组格式?

将带有标题的CSV转换为哈希数组

使用 python pandas 将 csv 转换为 html

to_CSV 将 np.array 保存为字符串而不是列表