C# 将数据表导入Excel文本将变为数字

C# 将数据表导入Excel文本将变为数字,c#,export-to-excel,C#,Export To Excel,您好,我只是想问一下,我正在尝试将数据表导入excel,其中一列变成指数,比如444201000100100变成4442exp8?这是我的剧本 protected void btnExportfromDt_Click(object sender, EventArgs e) { string strFilename = "FinanceforBulkupload.xls"; UploadDataTableToExcel(LoadData(), strFilename); } pro

您好,我只是想问一下,我正在尝试将数据表导入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();
}
protectedvoid btnexportfromt\u单击(对象发送方,事件参数e)
{
字符串strFilename=“FinanceforBulkupload.xls”;
UploadDataTableToExcel(LoadData(),strFilename);
}
受保护的无效上载DataTableToExcel(DataTable dtEmp,字符串文件名)
{
string attachment=“附件;文件名=“+filename;
Response.ClearContent();
AddHeader(“内容处置”,附件);
Response.ContentType=“application/vnd.ms excel”;
string tab=string.Empty;
foreach(数据列dtEmp.Columns中的数据列dtcol)
{
Response.Write(tab+dtcol.ColumnName);
tab=“\t”;
}
响应。写入(“\n”);
foreach(数据行dr在dtEmp.Rows中)
{
tab=“”;
对于(int j=0;j
在存储值之前,将单个引号预先附加到该值。而不是:

444201000100100
商店:

'444201000100100

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

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

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

Columns("A:A").NumberFormat = "@" ' This is the Text format
在C#中,您应该能够按照以下几点做一些事情:

Excel.Range rng = this.Application.get_Range("A:A");
rng.NumberFormat = "@";
然而,这需要一个对Excel对象的引用,并且从您现有的代码来看,目前您似乎没有引用它


Gary的学生答案也适用,但这样做会导致这些单元格忽略以后在Excel中打开时应用的任何格式。用户需要手动删除前导字符以按预期控制格式。

您有其他人建议的不同选项

请理解,您正在生成的是CSV而不是Excel文件,因此您受到限制

由于单元格格式是excel属性,无法在CSV文件中指定,因此我建议使用EPPlus创建excel文件(.xlsx),并编写代码以指定TravelinGuy建议的列格式


如果您想坚持使用CSV,那么数据在Excel中的显示方式将受到限制。要么您接受Excel根据读取的数据推断数字格式,要么您在前面加上引号…

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

在以下情况下,健壮的解决方案必须将单个
字符前置到字符串

  • 字符串可以被解析为一个数字(Excel使用,但由于您使用的是C#,
    Double.TryParse
    就可以了)
  • 字符串已以记号(
    )开头。(例如,如果字符串
    'quoted'
    ,Excel将其解释为
    quoted'
    ,除非在前面加上另一个勾号--
    “quoted'
  • 字符串以
    =
    字符开头。即使是CSV文件,Excel也将其解释为一个工作表函数。在前面打勾可防止出现这种情况(例如,
    '=这不是工作表函数

如果您仍然觉得这是不可接受的,请知道,当您像这样手动编写文本文件时,您没有其他选择。如果您强烈反对,可以尝试使用或其他第三方工具来构建Excel工作簿。然而,考虑到看起来非常简单的用例,您几乎肯定会得到一个更复杂的解决方案,该解决方案速度较慢,需要更多的代码。我建议大家好好学习,然后按照上面的规则写一个简单的例行公事。

谢谢你的帮助。。。有没有不使用Excel对象的选项?有没有链接建议?我不想使用网格。。我的设计是直接使用datatable到excel…另外,应该注意的是,您可以在输出的每个字符串前加一个勾号。然而,这对用户来说有点不友好。当用户打开工作簿时,他们将看到您想要的数据(初始标记不显示)。但是,当用户编辑单元格值时,他们将看到勾号。