【问题标题】:Is it possible to ignore Excel warnings when generating spreadsheets using EPPlus?使用 EPPlus 生成电子表格时是否可以忽略 Excel 警告?
【发布时间】:2014-10-21 09:38:02
【问题描述】:

我使用 C# 和 EPPlus 将数字和非数字值混合存储在电子表格的单个列中。当我用 Excel 打开电子表格时,它会在单元格中显示带有数值的绿色三角形,给出警告“数字存储为文本”,并为特定单元格提供忽略它的选项。我可以通过代码来完成还是某些 Excel 特定功能?

【问题讨论】:

    标签: c# excel epplus


    【解决方案1】:

    你真的有两个使用代码的选择:

    • .NumberFormat property of Range 更改为 TEXT(我相信 epplus 中的等价物是 Cell[row, column].Style.NumberFormat.Format

    • 在任何数字前加上 '单引号) - Excel 然后将数字视为 TEXT - 在视觉上,它按原样显示数字,但公式将显示单引号.

    或者,我不建议依赖它

    • 使用 Excel 的属性并取消选中显示警告的选项

    【讨论】:

    • 实际上只有最后一个解决方案对我有用。前两个给出相同的绿色三角形
    【解决方案2】:

    来自 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

    【讨论】:

    • 我不想格式化数值,我希望它们按原样显示。所以我没有'int i'值我宁愿有'string s'值和Excel用警告标志标记它
    【解决方案3】:

    这是对我有用的 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;
        }
    }
    

    【讨论】:

    • 这正是我所需要的。我确实在 value.ToString() 之前添加了一个空对象检查,因为我有时会发送空值。
    【解决方案4】:

    您可以检查您的值是否为整数,将其转换为 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;
    }
    

    【讨论】:

    • 你有一个如何调用它的例子吗?
    • 我添加了有关此请求的更具体的答案,以在此处举例说明如何调用它:stackoverflow.com/questions/39417362/…
    • 这似乎有效:使用 (var footerMonth1Cell = prodUsageWorksheet.Cells[columnFooterRow, MONTH1_COL]) { SetValueDoubleOrIntOrStr(footerMonth1Cell, monthsTruncatedYears[0]); }
    猜你喜欢
    • 1970-01-01
    • 2018-07-21
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 2020-12-11
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多