【问题标题】:C# exporting csv with incorrect column format (Excel)C# 以不正确的列格式导出 csv (Excel)
【发布时间】: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("&quot;", "\"" + "\"");
    strInput = strInput.Replace("&amp;",  "&");
    strInput = strInput.Replace("&nbsp;", string.Empty);
    strInput = strInput.Replace("''", "'");
    return strInput.Replace("&#39;", "'").Trim();
}

原始 txt 文件 csv:

名字、姓氏、优惠券编号、 "第一个","最后一个","720137994699937608"

【问题讨论】:

  • 您能否发布一些来自 CSV 的原始文本。 CouponNumber 列周围的" 应该已经解决了这个问题。
  • @CodingGorilla 你不能。基本上,所有将内容放在引号中所做的就是转义逗号和换行符。
  • 如果你在excel中你的数值前面加上一个单引号,它会自动格式化为文本。显然,OP 的问题与 CSV 无关,只是在 Excel 中查看。
  • @CodingGorilla 您可以使用 Excel 中的“导入数据”选项来明确说明每列中预期的日期类型。但是每次打开文件时都必须这样做。
  • 亲爱的 OP,有很多信息飞来飞去。大部分都是废话。底线是您正在创建 CSV,但希望在 Excel 中显示它。导入向导是一个好主意,因此在您的优惠券名称前加上一个单引号。然而,真正的答案是编写 Excel 文件而不是 CSV。

标签: c# asp.net excel


【解决方案1】:

您可以像这样包装每个值:

"=""DATA HERE"""

例如:

Column1,Column2
"=""1231231231231323121321""","=""123"""

显然它在 csv 文件中并不漂亮,但它可以根据需要导入到 excel 中。

【讨论】:

  • 单引号,即。 '123123123 做同样的事情。
  • @paqogomez 不,它没有,单引号显示在 excel 的字段中。这不会在单元格中显示任何其他字符
  • 我会告诉你它有效,但我反对将元数据放在 CSV 中。如果你想要一个excel文件,写一个excel文件IMO。
  • @paqogomez 同意,但有时为简单的输出编写 excel 文件的工作量太大。至少有一些方法,虽然看起来很丑,但不用太多努力就可以做他想做的事
  • 这对我有用。我这样写: writer.Write("\"=\"\"" + item.COUPON + "\"\"\"");
【解决方案2】:

如果您使用的是 CSV 文件,您将无能为力。正如其他人所提到的,这是一个 Excel 格式问题。如果您想管理文档的格式,我建议您使用某种 Excel 库。

【讨论】:

    【解决方案3】:

    Excel 的最大精度为15 digits。将这些显示为字符串会令人厌恶吗?

    【讨论】:

    • 他已经在 CSV 文件中的数字周围加上引号,或者至少这是他的代码显示的内容。
    • 只看上面,我认为在数字前面加上一个 ' 会使它在 Excel 中呈现为字符串,但也许不是这样。
    • 对于那些在家玩的人: Anathema - 教皇或教会委员会的正式诅咒,驱逐一个人或谴责一个教义。或者......某人不喜欢的东西。
    • 完美总结了我与 Excel 集成的经验,尤其是通过 COM 集成。
    【解决方案4】:

    如果不需要 CSV 文件,您可以直接将 gridview 导出到 excel。但是,如果您仍然需要 csv 文件,在 excel 列中显示长数字的最简单方法是在将 csv 导入到 excel 之前将该列转换为文本。

    这里是步骤。

    1. 打开 Excel。点击打开,找到文件。打开后,您将看到以下屏幕。

    2. 选择分隔并单击下一步。选择其他添加(,),然后单击下一步。

    1. 在下一个屏幕上突出显示该列并按文本。

    这是最终结果:

    【讨论】:

    • 当您谈论 CSV 时,“转换为文本”的想法毫无意义。 一切都是文本。只有 Excel 试图赋予文件更大的意义。
    • 除非出于某些原因该人从网格转到 csv 到 excel,否则为什么不直接从 csv 转到 excel?或者在将 csv 导出到 excel 之前,使用 excel 的文本导入向导将该 CouponNumber 列转换为文本。
    • 我完全不反对,但是你的代码没有做任何事情来实现这一点?
    猜你喜欢
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多