【发布时间】:2014-07-24 21:12:28
【问题描述】:
我正在将一个充满数据的 gridview 导出到一个 CSV 文件,其中一列包含一个最多 18 位非浮点数的优惠券号码。该数字需要在 Excel 中显示为完整的数字csv 文件。当我在 Excel 中打开 csv 文件时,例如 720137994699937608,其他显示为:
然后,当我调整列大小或将列类型更改为编号时,优惠券编号显示为:
您会注意到 excel 将优惠券编号更改为浮点数,现在优惠券编号中的数字已在末尾替换为零。这很糟糕。
这是我的导出代码:
protected void btnExport_Click(object sender, EventArgs e)
{
Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition",
"attachment;filename=Reports All Prizes.csv");
Response.Charset = "";
Response.ContentType = "csv";
StringBuilder sb = new StringBuilder();
sb.Append("FirstName" + ',');
sb.Append("LastName" + ',');
sb.Append("CouponNumber" + ',');
string[] splitColumns = sb.ToString().Split(new Char[] { ',' });
//append new line
sb.Append("\r\n");
for (int i = 0; i < gvReportsAllPrizes.Rows.Count; i++)
{
foreach (string column in splitColumns)
{
if (column == "FirstName")
{
//capatilize first letter.
string first = Globals.ReplaceHTML(gvReportsAllPrizes.Rows[i].Cells[1].Text.Trim());
if (string.IsNullOrEmpty(first))
{
first = "";
}
if (!string.IsNullOrEmpty(first))
{
first = first.ToLower();//convert to lowercase before uppercasing the first letter.
first = "\"" + first.First().ToString().ToUpper() + String.Join("", first.Skip(1)) +
"\"";
}
sb.Append(first + ',');
}
else if (column == "LastName")
{
//capatilize first letter.
string last = Globals.ReplaceHTML(gvReportsAllPrizes.Rows[i].Cells[2].Text.Trim());
if (string.IsNullOrEmpty(last))
{
last = "";
}
if (!string.IsNullOrEmpty(last))
{
last = last.ToLower();//convert to lowercase before uppercasing the first letter.
last = "\"" + last.First().ToString().ToUpper() + String.Join("", last.Skip(1)) +
"\"";
}
sb.Append(last + ',');
}
else if (column == "CouponNumber")
{
string cn = Globals.ReplaceHTML(gvReportsAllPrizes.Rows[i].Cells[8].Text.Trim());
if (string.IsNullOrEmpty(cn))
{
cn = "";
}
if (!string.IsNullOrEmpty(cn))
{
sb.Append("\"" + cn + "\"" + ',');
}
else
{
sb.Append(cn + ',');
}
}
}
//append new line
sb.Append("\r\n");
}
Response.Output.Write(sb.ToString());
Response.Flush();
Response.End();
}
public static string ReplaceHTML(string strInput)
{
strInput = strInput.Replace(""", "\"" + "\"");
strInput = strInput.Replace("&", "&");
strInput = strInput.Replace(" ", string.Empty);
strInput = strInput.Replace("''", "'");
return strInput.Replace("'", "'").Trim();
}
原始 txt 文件 csv:
名字、姓氏、优惠券编号、 "第一个","最后一个","720137994699937608"
【问题讨论】:
-
您能否发布一些来自 CSV 的原始文本。 CouponNumber 列周围的
"应该已经解决了这个问题。 -
@CodingGorilla 你不能。基本上,所有将内容放在引号中所做的就是转义逗号和换行符。
-
如果你在excel中你的数值前面加上一个单引号,它会自动格式化为文本。显然,OP 的问题与 CSV 无关,只是在 Excel 中查看。
-
@CodingGorilla 您可以使用 Excel 中的“导入数据”选项来明确说明每列中预期的日期类型。但是每次打开文件时都必须这样做。
-
亲爱的 OP,有很多信息飞来飞去。大部分都是废话。底线是您正在创建 CSV,但希望在 Excel 中显示它。导入向导是一个好主意,因此在您的优惠券名称前加上一个单引号。然而,真正的答案是编写 Excel 文件而不是 CSV。