将数据 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 工作簿。但是,考虑到看起来非常简单的用例,您几乎肯定会得到一个更复杂的解决方案,该解决方案速度较慢且需要更多代码。我建议只接受它并编写一个遵守上述规则的简单例程。
您好,我想问一下我正在尝试将数据表导入 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 工作簿。但是,考虑到看起来非常简单的用例,您几乎肯定会得到一个更复杂的解决方案,该解决方案速度较慢且需要更多代码。我建议只接受它并编写一个遵守上述规则的简单例程。