【发布时间】:2018-02-28 13:56:24
【问题描述】:
我有问题。我在运行时创建一个 CSV,然后让用户能够保存或打开它,但它对我没有任何作用,我做错了什么?有人可以帮我吗?
public void WriteToCSV(List<mifid2_vpc_monitored_detail_view> list, string filename)
{
string attachment = "attachment; filename=" + filename;
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");
HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
WriteHeader();
StringBuilder csv = new StringBuilder();
string _uti, _counterparty;
DateTime _maturity, _date;
decimal _volume;
var newLine = "";
for (int i = 0; i < list.Count; i++)
{
if (list[i].uti_cd == null) _uti = "-"; else _uti = list[i].uti_cd;
if (list[i].namecounterparty == null) _counterparty = "-"; else _counterparty = list[i].namecounterparty;
if (list[i].maturity == null) _maturity = DateTime.MinValue.Date; else _maturity = list[i].maturity;
if (list[i].contract_volume == 0) _volume = 0; else _volume = list[i].contract_volume;
if (list[i].evaluation_date == null) _date = DateTime.MinValue.Date; else _date = list[i].evaluation_date;
newLine = string.Format("{0},{1},{2},{3},{4}", _uti, _counterparty, _maturity, _volume, _date);
csv.AppendLine(newLine);
}
HttpContext.Current.Response.Write(csv.ToString());
HttpContext.Current.Response.End();
}
private void WriteHeader()
{
string columnNames = "UTI code, Counterparty, Maturity, Volume, Evaluation Date";
HttpContext.Current.Response.Write(columnNames);
HttpContext.Current.Response.Write(Environment.NewLine);
}
【问题讨论】:
-
打开导航调试器,查看响应内容,您可能会得到更多信息。
-
在调用 'send()' 方法时由 'XMLHttpRequest' 启动的下载 此下载发生在文档处理期间。进入响应正文:UTI 代码、交易对手、成熟度、交易量、评估日期 ecc ecc ecc
-
通过直接写入响应流来节省 RAM 并开始更快地将结果推送给用户,而不是 StringBuilder。
-
还有:
WriteHeader()长什么样子? -
不要滚动你自己的 CSV 编写逻辑。你在重新发明轮子。您将拥有不遵守 CSV 文件规则的凌乱代码。相反,请使用为您解决这些问题的库,例如 CsvHelper。