以下是我正在使用的内容:客户端的AngularJS,BreezeJS。对于服务器,我使用的是Web API和MVC 5.
我一直在寻找如何从服务器构建和检索excel电子表格的方法,但我不知所措。
我发现这个名为linqtocsv的插件有助于从linq构建csv文件。找到了代码项目示例here,找到了nuget链接here。
我还发现了有关堆栈流的问题的好用法:Web API HttpResponseMessage content return is incomplete
所以在实现上面的插件--linq到csv之后,并按照上面提到的stackover问题,似乎没有任何工作。
这是我的服务器端代码(均直接来自已提到的链接):
[HttpPost]
public HttpResponseMessage DistributorReport(JObject formValues)
{
try
{
var cqmo = formValues.ToObject<DistributorCQMO>();
var query = new FindDistributorsByLocationQuery
{
States = cqmo.States.Select(x => x.id),
Cities = cqmo.Cities.Select(x => x.id),
CitiesExclusion = cqmo.ExcludedCities.Select(x => x.id),
ZipCodes = cqmo.ZipCodes.Select(x => x.id),
ZipCodesExclusion = cqmo.ExcludedZipCodes.Select(x => x.id),
ProductFamily = cqmo.ProductFamily.id,
ProductSubFamilies = cqmo.ProductSubFamily.Select(x => x.id),
MatchAllFilter = cqmo.MatchAllFilter,
ClientTypeFilter = cqmo.ClientTypeFilter
};
IEnumerable<DistributorDTO> distributors = this.queryProcessor.Process(query).AsQueryable();
CsvFileDescription outputFileDescription = new CsvFileDescription
{
SeparatorChar = '\t', // tab delimited
FirstLineHasColumnNames = true
};
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new CsvContent<DistributorDTO>(outputFileDescription,
"ObserverTripList.csv",
distributors)
};
return response;
}
catch (Exception ex)
{
// logger.ErrorException("Exception exporting as excel file: ", ex);
return Request.CreateResponse(HttpStatusCode.InternalServerError);
}
}
这是辅助类:
public class CsvContent<T> : HttpContent
{
private readonly MemoryStream _stream = new MemoryStream();
public CsvContent(CsvFileDescription outputFileDescription, string filename, IEnumerable<T> data)
{
var cc = new CsvContext();
var writer = new StreamWriter(_stream);
cc.Write(data, writer, outputFileDescription);
writer.Flush();
_stream.Position = 0;
Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
Headers.ContentDisposition.FileName = filename;
}
protected override Task SerializeToStreamAsync(Stream stream, TransportContext context)
{
return _stream.CopyToAsync(stream);
}
protected override bool TryComputeLength(out long length)
{
length = _stream.Length;
return true;
}
}
我尝试使用breeze来发布我的帖子,它返回包含在breeze对象中的数据,如果在挖掘返回的对象后,进入它的httpreponse属性,你会看到它的原始形式,标签分隔的数据但是,内容应用程序在application / json中; charset = utf-8而不是excel格式化。
编辑:
我现在有以下工作:
$.ajax({
type: 'POST',
url: 'MappingTool.API/api/Report/DistributorReport',
data: JSON.stringify(jsonData),
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function (returnValue) {
alert("success")
// window.location = '/Reports/Download?file=' + returnValue;
}
});
我得到了正确的回复,并且能够在fiddler和chrome调试器中查看所有结果。但是如何让浏览器自动下载文件?
感谢任何反馈!
编辑:
这是我应该从MVC控制器或API控制器获取的东西吗?似乎有更多支持MVC控制器,比如可以在MVC中使用的FileResult类型;这将给我自动下载:“exporting excel file to view mvc”我看到它使用API控制器完成;但是,API控制器不是委托简单数据类型而不是媒体内容的重点吗?