C# 将LINQ结果转换为CSV或Excel

C# 将LINQ结果转换为CSV或Excel,c#,asp.net,.net,excel,linq,C#,Asp.net,.net,Excel,Linq,当调用WebApi方法时,我需要使用LINQ查询导出到Excel。我已经构建了LINQ查询,它将返回正确的数据,现在我需要将其导出为.csv或Excel文件格式 我试过使用MemoryStream和StreamWriter,但我想我现在只是在追根究底 [HttpGet] [Route("Download")] public Task<IActionResult> Download(int memberId) { var results = (from violations i

当调用WebApi方法时,我需要使用LINQ查询导出到Excel。我已经构建了LINQ查询,它将返回正确的数据,现在我需要将其导出为.csv或Excel文件格式

我试过使用
MemoryStream
StreamWriter
,但我想我现在只是在追根究底

[HttpGet]
[Route("Download")]
public Task<IActionResult> Download(int memberId)
{
    var results = (from violations in _db.tblMappViolations
                   where violations.MemberID == memberId
                   select new IncomingViolations
                       {
                           Contact = violations.ContactName,
                           Address = violations.str_Address,
                           City = violations.str_City,
                           State = violations.str_State,
                           Zip = violations.str_Zipcode,
                           Country = violations.str_Country,
                           Phone = violations.str_Phone,
                           Email = violations.str_Email,
                           Website = violations.str_WebSite,
                       }).FirstOrDefault();

    MemoryStream stream = new MemoryStream(results);
    StreamWriter writer = new StreamWriter(stream);    

    writer.Flush();
    stream.Position = 0;

    FileStreamResult response = File(stream, "application/octet-stream"); 
    response.FileDownloadName = "violations.csv";

    return response;
}
[HttpGet]
[路线(“下载”)]
公共任务下载(int memberId)
{
var results=(来自_db.tblmappinvalinces中的冲突)
其中。MemberID==MemberID
选择新的收入冲突
{
Contact=contractions.ContactName,
地址=冲突。str_地址,
城市=违规。str_城市,
状态=违规。str_状态,
Zip=inflictions.str_Zipcode,
国家=违规行为。str_国家,
Phone=违规行为。str_Phone,
电子邮件=违规。str_电子邮件,
网站=违规行为。str_网站,
}).FirstOrDefault();
MemoryStream stream=新的MemoryStream(结果);
StreamWriter writer=新StreamWriter(流);
writer.Flush();
流位置=0;
FileStreamResult response=文件(流,“应用程序/八位字节流”);
response.FileDownloadName=“inflictions.csv”;
返回响应;
}

以下是如何从服务器向用户发送CSV文件。

string attachment = "attachment; filename=MyCsvLol.csv";
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.AddHeader("content-disposition", attachment);
HttpContext.Current.Response.ContentType = "text/csv";
HttpContext.Current.Response.AddHeader("Pragma", "public");

var sb = new StringBuilder();
// Add your data into stringbuilder
sb.Append(results.Contact);
sb.Append(results.Address);
sb.Append(results.City);
// and so on
HttpContext.Current.Response.Write(sb.ToString());
用于从API发送

MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
// Write Your data here in writer
writer.Write("Hello, World!");
writer.Flush();
stream.Position = 0;

HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new StreamContent(stream);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "Export.csv" };
return result;
更新:-

public HttpResponseMessage Download()
{
    var results = (from violations in _db.tblMappViolations
       where violations.MemberID == memberId
       select new IncomingViolations
           {
               Contact = violations.ContactName,
               Address = violations.str_Address,
               City = violations.str_City,
               State = violations.str_State,
               Zip = violations.str_Zipcode,
               Country = violations.str_Country,
               Phone = violations.str_Phone,
               Email = violations.str_Email,
               Website = violations.str_WebSite,
           });
    var sb = new StringBuilder();
    MemoryStream stream = new MemoryStream();
    StreamWriter writer = new StreamWriter(stream);
    foreach(var tempResult in results)
    {
        sb.Append(tempResult.Contact+",");
        sb.Append(tempResult.Address+",");
        sb.Append(tempResult.City+",");
        sb.Append(tempResult.State+",");
        sb.Append(tempResult.Zip+",");
        sb.Append(tempResult.Country+",");
        sb.Append(tempResult.Phone+",");
        sb.Append(tempResult.Email+",");
        sb.Append(tempResult.Website+",");
        sb.Append(Enviroment.NewLine);
    }
    writer.Write(sb.ToString());
    writer.Flush();
    stream.Position = 0;

    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
    result.Content = new StreamContent(stream);
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "Export.csv" };

    return result;
}

将结果保存在DataTable中,然后使用

XLWorkbook workbook = new XLWorkbook();
DataTable table = GetYourTable();
workbook.Worksheets.Add(table);

如果您从一开始就知道要写入哪个文件,那么您一定要使用stream writer,否则请使用stream reader,然后使用stream writer。

首先,要在其他区域重用代码,请始终创建帮助程序类

我采用了这种方法,将列表转换为以标题作为属性名的流,如果您想从中获得一个文件,基本上,我只需添加另一个步骤:

第1步:

public static Stream ConvertToCSVStream<T>(IEnumerable<T> objects)
       {
          Type itemType = typeof(T);
          var properties = itemType.GetProperties();

        var mStream = new MemoryStream();
        StreamWriter sWriter = new StreamWriter(mStream);

        var values = objects.Select(o =>
        {
            return string.Join(",", properties.Select(p =>
            {
                var value = p.GetValue(o).ToString();
                if (!Regex.IsMatch(value, "[,\"\\r\\n]"))
                {
                    return value;
                }

                value = value.Replace("\"", "\"\"");

                return string.Format("\"{0}\"", value);

            })) + sWriter.NewLine;
        });

        var valuesInStrings = values.Aggregate((current, next) => current + next);
        try
        {
            sWriter.Write(string.Join(",", properties.Select(x => x.Name.Replace("_", " "))) + sWriter.NewLine);

            sWriter.Write(valuesInStrings);
        }
        catch (Exception e)
        {
            mStream.Close();
            throw e;
        }

        sWriter.Flush();
        mStream.Position = 0;

        return mStream;
    }
 public FileStreamResult CreateFile(MemoryStream mStream, string path, string name)
        {
            //set values, names, content type, etc 
            //return filestream
        }

或者您觉得更好的任何其他方法。

太好了,很抱歉,您能将其与我上面的代码混合在一起吗?理解仍然有困难。对我来说,实际问题是关于你刚才通过将
//将数据添加到stringbuilder
注释中而忽略的部分。@AlexD的“blend”意思是“为我做我的工作,这样我就不必理解你的答案,只需复制并粘贴它。”不,我不是这个意思。只是想更好地理解它如何与我目前拥有的内容相匹配。@AlexD,您有两个问题,1)如何将对象图序列化为CSV或Excel数据,2)如何返回序列化数据,以便客户端知道其CSV或Excel数据。您要问的是哪个问题?为什么序列化某些任意对象会使它成为您希望Excel能够正确读取和解析的对象?此问题是或的副本,具体取决于您要问的问题。我应该使用哪个库来执行此操作?XL工作簿不包括在.NET标准中