【问题标题】:How can I prevent Excel from converting values to date format?如何防止 Excel 将值转换为日期格式?
【发布时间】:2016-09-13 04:39:48
【问题描述】:

最近(以前没有人注意到它发生过,如果有的话)Excel 正在将一些“ID”类型的值转换为日期。正如您在此处看到的那样,有一些逻辑值被转换为哪些逻辑,用户在其中添加了一个列来显示底层值的真正含义,以及它们应该如何表示(原始,无转换):

所以因为“01”后面有一个“-”,Excel 认为“01-”应该是一月,假设最后两个字符代表年份。

在不包含破折号的项目代码中,它们是单独存在的。如何防止 Excel 以这种方式“提供帮助”并将这些值转换为日期?

更新

针对 Scott Craner 的评论,这是我必须写出该值的代码:

using (var memberItemCodeCell = priceComplianceWorksheet.Cells[rowToPopulate, DETAIL_MEMBERITEMCODE_COL])
{
    memberItemCodeCell.Style.Font.Size = DATA_FONT_SIZE;
    memberItemCodeCell.Value = _memberItemCode;
    memberItemCodeCell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
}

...当我尝试通过在单元格名称后键入“for”来确定如何将值格式化为文本或常规时,我看到了以下选项:

那么我需要使用什么 - FormatedText (sic) 或 ConditionalFormatting,以及如何具体设置这些以将列格式化为 Text 或 General,如果这两者中的任何一个是首选?

【问题讨论】:

  • 将列格式化为TextGeneral
  • 您将希望将语言标签添加到您的 OP。因此,那些知道该语言的人会被提醒。
  • (VBA 使用的是什么 IDE/编辑器?)
  • 如果您输入的值可能被误解为日期,General 格式将不会保留。对我来说,似乎只有 text 格式是一个可靠的选择。
  • 我认为您正在寻找的是 memberitemCodeCell.numberformat="@" 假设 memberitemCodeCell 引用您 Excel 工作表中的目标范围。

标签: c# excel date epplus


【解决方案1】:

我通常在准备表格以放置数据时,定义数据类型,以便 Excel 不会尝试查找数据类型。

在这种情况下,我将使用文本数据类型。示例:

【讨论】:

    【解决方案2】:

    我想您想将数字格式更改为文本。

    文本格式由NumberFormat 属性使用“at”字符指定。

    memberItemCodeCell.Style.Font.Size = DATA_FONT_SIZE;
    memberItemCodeCell.NumberFormat = "@";
    memberItemCodeCell.Value = _memberItemCode;
    memberItemCodeCell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
    

    另外,关于它的价值,请查看有关ValueValue2 之间区别的文章/问题。了解差异并使用正确的差异是很好的。在你的情况下,我怀疑这很重要。

    【讨论】:

    • 在 EPPlus 中略有不同:memberItemCodeCell.Style.Numberformat.Format = "@"; EPPlus 中没有 Value2。
    • 这可能会阻止转换为最新的问题,但我仍然得到一个绿色三角形,抱怨“数字存储为文本”
    • 好吧,我承认我不知道 EPPlus 是什么……现在我知道了。我看到了代码并认为它​​是 COM。就三角形而言。我认为这只是来自 Excel 的警告。我可能是错的,但我认为这是一个 Excel 级别的设置,这意味着您可以在您的机器上解决它,但不能保证它不会在另一个机器上引发相同的警告。也就是说,这真的不是问题。这只是 Excel 警告您这可能是一个错误。
    • 是的,我知道可以在单个用户的计算机上关闭警告,但他们不想看到它们并这样做。因此,无论用户的 Excel 设置如何,我都需要一种编程方式来防止显示警告(平均绿色三角形或增量)。
    • 我不知道这是可能的......我很想知道你得到什么回应。
    【解决方案3】:

    最终对我有用的是使用这种技术为单元格中的值分配正确的数据类型(通过调用 ConvertValueToAppropriateTypeAndAssign()),然后在事后根据需要进行格式化:

    public static readonly string NUMBER_FORMAT_CURRENCY = "$#,##0.00;($#,##0.00)";
    public static readonly string NUMBER_FORMAT_THOUSANDS = "#,##0";
    public static readonly string PERCENTAGE_FORMAT = "0.00%;[Red]-0.00%";
    public static readonly string NUMBER_FORMAT_TEXT = "@";
    public static readonly string NUMBER_FORMAT_DOUBLE = "0.00"; 
    
    . . .
    
    using (var percentageCell = priceComplianceWorksheet.Cells[rowToPopulate, SUMMARY_PERCENTAGE_COL])
    {
        ConvertValueToAppropriateTypeAndAssign(percentageCell, totalPercentage);
        percentageCell.Style.Numberformat.Format = PERCENTAGE_FORMAT;
    }
    
    . . .
    
    // Adapted from https://stackoverflow.com/questions/26483496/is-it-possible-to-ignore-excel-warnings-when-generating-spreadsheets-using-epplu
    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;
            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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      • 2015-10-25
      • 1970-01-01
      相关资源
      最近更新 更多