【发布时间】:2014-10-21 09:38:02
【问题描述】:
我使用 C# 和 EPPlus 将数字和非数字值混合存储在电子表格的单个列中。当我用 Excel 打开电子表格时,它会在单元格中显示带有数值的绿色三角形,给出警告“数字存储为文本”,并为特定单元格提供忽略它的选项。我可以通过代码来完成还是某些 Excel 特定功能?
【问题讨论】:
我使用 C# 和 EPPlus 将数字和非数字值混合存储在电子表格的单个列中。当我用 Excel 打开电子表格时,它会在单元格中显示带有数值的绿色三角形,给出警告“数字存储为文本”,并为特定单元格提供忽略它的选项。我可以通过代码来完成还是某些 Excel 特定功能?
【问题讨论】:
你真的有两个使用代码的选择:
将 .NumberFormat property of Range 更改为 TEXT(我相信 epplus 中的等价物是 Cell[row, column].Style.NumberFormat.Format)
在任何数字前加上 '(单引号) - Excel 然后将数字视为 TEXT - 在视觉上,它按原样显示数字,但公式将显示单引号.
或者,我不建议依赖它
【讨论】:
来自 EPPlus 文档:
我的号码格式不起作用 如果您将数字数据添加为字符串(就像原始 ExcelPackage 所做的那样),Excel 会将数据视为字符串并且不会被格式化。设置数值时不要使用 ToString 方法。
string s="1000"
int i=1000;
worksheet.Cells["A1"].Value=s; //Will not be formatted
worksheet.Cells["A2"].Value=i; //Will be formatted
worksheet.Cells["A1:A2"].Style.Numberformat.Format="#,##0";
http://epplus.codeplex.com/wikipage?title=FAQ&referringTitle=Documentation
【讨论】:
这是对我有用的 TechnoPriest 答案的派生 - 我添加了对十进制值的处理,并更改了方法的名称以更准确地记录其真正存在的理由:
public static void ConvertValueToAppropriateTypeAndAssign(this ExcelRangeBase range, object value)
{
string strVal = value.ToString();
if (!String.IsNullOrEmpty(strVal))
{
decimal decVal;
double dVal;
int iVal;
if (decimal.TryParse(strVal, out decVal))
{
range.Value = decVal;
}
else if (double.TryParse(strVal, out dVal))
{
range.Value = dVal;
}
else if (Int32.TryParse(strVal, out iVal))
{
range.Value = iVal;
}
else
{
range.Value = strVal;
}
}
else
{
range.Value = null;
}
}
【讨论】:
您可以检查您的值是否为整数,将其转换为 int 并将数字分配给单元格的值。然后它将被保存为数字,而不是字符串。
public static void SetValueIntOrStr(this ExcelRangeBase range, object value)
{
string strVal = value.ToString();
if (!String.IsNullOrEmpty(strVal))
{
double dVal;
int iVal;
if (double.TryParse(strVal, out dVal))
range.Value = dVal;
else if (Int32.TryParse(strVal, out iVal))
range.Value = iVal;
else
range.Value = strVal;
}
else
range.Value = null;
}
【讨论】: