Можно ли игнорировать предупреждения Excel при создании электронных таблиц с помощью EPPlus?

Я храню сочетание числовых и нечисловых значений в одном столбце в электронной таблице, используя C# и EPPlus. Когда я открываю электронную таблицу в Excel, в ячейках отображаются зеленые треугольники с числовыми значениями, которые предупреждают "Число сохранено как текст" и дают возможность игнорировать их для конкретной ячейки. Могу ли я сделать это из кода или это особенность Excel?

4 ответа

Решение

У вас действительно есть 2 варианта использования кода:

  • изменить свойство.NumberFormat для Range на TEXT (я полагаю, что эквивалент в epplusCell[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;
}
Другие вопросы по тегам