C# 将LINQ结果转换为CSV或Excel
当调用WebApi方法时,我需要使用LINQ查询导出到Excel。我已经构建了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
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标准中