将数据 table 导入到 Excel 文本变为数字

importing Data table to Excel text becomes numeric

您好,我想问一下我正在尝试将数据表导入 excel,其中一列变成指数,例如 444201000100100 变成 4442exp8?这是我的脚本

protected void btnExportfromDt_Click(object sender, EventArgs e)
{
    string strFilename = "FinanceforBulkupload.xls";
    UploadDataTableToExcel(LoadData(), strFilename);
}
protected void UploadDataTableToExcel(DataTable dtEmp,string filename)
{
    string attachment = "attachment; filename="+filename;
    Response.ClearContent();
    Response.AddHeader("content-disposition", attachment);
    Response.ContentType = "application/vnd.ms-excel";
    string tab = string.Empty;
    foreach (DataColumn dtcol in dtEmp.Columns)
    {
        Response.Write(tab + dtcol.ColumnName);
        tab = "\t";
    }
    Response.Write("\n");
    foreach (DataRow dr in dtEmp.Rows)
    {
        tab = "";
        for (int j = 0; j < dtEmp.Columns.Count; j++)
        {
            Response.Write(tab + Convert.ToString(dr[j]));

            tab = "\t";
        }
        Response.Write("\n");
    }
    Response.End();
}

在存储值之前预先附加一个单引号。而不是:

444201000100100

商店:

'444201000100100

必须写入单元格格式文本,但我们用于写入单元格的方法不允许您添加格式,您应该尝试另一种方法来写入 Excel 文件

您还可以将目标列的格式设置为文本类型(或您喜欢的任何 Excel 格式),以防止它这样做以及删除前导零和 [ 的其他解释=22=] 单元格格式规则。

当您即时创建输出文档时,您需要设置特定列或整个工作表以具有此格式规则。在 VBA 中,此命令是:

Columns("A:A").NumberFormat = "@" ' This is the Text format

在 C# 中,您应该能够按照以下方式执行某些操作:

Excel.Range rng = this.Application.get_Range("A:A");
rng.NumberFormat = "@";

然而,这将需要对 Excel 对象的引用,并且从您现有的代码来看,您目前似乎在没有它的情况下工作。

Gary​​'s Student 的回答同样有效,但这样做会导致这些单元格忽略稍后在 Excel 中打开时应用的任何格式。用户将需要手动删除前导 ' 以按预期控制格式。

你有不同的选择。

了解您生成的是 CSV 而不是 Excel 文件,因此您受到限制。

由于单元格格式是 excel 属性 且无法在 CSV 文件中指定,我建议使用 EPPlus 创建一个 excel 文件 (.xlsx) 并编写代码按照 TravelinGuy 的建议指定列格式。 http://epplus.codeplex.com/

如果您想坚持使用 CSV,那么您在 Excel 中的数据显示方式会受到限制。要么你接受 Excel 从它正在阅读的内容推断出一种数字格式,要么你在前面加上引号...

不幸的是,在将数据发送到 Excel 时,您必须手动执行次要编码。自动化 API 以及任何基于文本的文件格式(如 CSV 或(如您的情况)制表符分隔文件)都是如此。

在以下情况下,可靠的解决方案必须在字符串前添加一个 ' 字符。

  • 字符串可以解析为数字(Excel 使用 VariantChangeTypeEx,但由于您使用的是 C#,Double.TryParse 可以解决问题)
  • 字符串已经以勾号开头 (')。 (例如,如果您有字符串 'quoted',Excel 会将其解释为 quoted',除非您在前面再打一个勾 -- ''quoted'。)
  • 字符串以 = 字符开头。即使是 CSV 文件,Excel 也将其解释为工作表函数。在前面打勾可以防止这种情况(例如 '=This is not a worksheet function)。

如果您仍然觉得这不可接受,请知道,当您像现在这样手动编写文本文件时别无选择。如果您强烈反对,可以尝试使用 Open XML SDK 或其他一些第 3 方工具来构建 Excel 工作簿。但是,考虑到看起来非常简单的用例,您几乎肯定会得到一个更复杂的解决方案,该解决方案速度较慢且需要更多代码。我建议只接受它并编写一个遵守上述规则的简单例程。