Можно ли игнорировать предупреждения Excel при создании электронных таблиц с помощью EPPlus?
Я храню сочетание числовых и нечисловых значений в одном столбце в электронной таблице, используя C# и EPPlus. Когда я открываю электронную таблицу в Excel, в ячейках отображаются зеленые треугольники с числовыми значениями, которые предупреждают "Число сохранено как текст" и дают возможность игнорировать их для конкретной ячейки. Могу ли я сделать это из кода или это особенность Excel?
4 ответа
У вас действительно есть 2 варианта использования кода:
изменить свойство.NumberFormat для Range на TEXT (я полагаю, что эквивалент в epplus
Cell[row, column].Style.NumberFormat.Format
)префикс любого числа с
'
(одиночная кавычка) - Excel затем обрабатывает число как ТЕКСТ - визуально он отображает число как есть, но формула покажет одинарную кавычку.
В качестве альтернативы, на которую я бы не рекомендовал полагаться
- играть со свойствами Excel и снимите флажок для отображения предупреждений
Из документации 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;
}