You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Excel Interop C#读取数据时的小数精度异常与日期格式识别错误问题

使用Excel Interop C#读取数据时的小数精度异常与日期格式识别错误问题

问题描述

我正在使用Excel Interop C#库从Excel提取数据并生成.PX文件,但遇到了两个棘手的问题:

  • 读取小数时出现多余的小数位,比如Excel单元格中显示的1127.17,读取后变成了1127.17000001013
  • 日期值和美元金额都被错误地当成日期进行转换,而且我无法通过固定单元格格式的方式来处理,希望找到一种方法既能正确识别日期并转换为MM/dd/yyyy格式,又能按Excel显示的小数位数读取数值数据。

原始代码

object[,] data = worksheet.get_Range("F3:IK3").Cells.Value2;
for (int j = 1; j <= data.Length; j++)
{
   string strTagValue = string.Empty;
   if (data[1, j] is double oaDate)
   {
      DateTime dt = DateTime.FromOADate(oaDate); // 这里不仅日期,美元金额也被转换成了日期值
      strTagValue = dt.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture);
   }
   else
   {
      strTagValue = Convert.ToString(data[1, j]);
   }
}

问题示例

日期格式识别错误

单元格显示的日期
错误转换后的日期格式

单元格使用的公式

单元格应用的公式

小数精度异常

Excel中显示的小数
读取后带多余小数位的数值

更新后的尝试代码

Excel.Range range = ws1065.get_Range($"F{i}:IK{i}");
object[,] data = new object[range.Rows.Count, range.Columns.Count];
for (int k = 1; k <= range.Rows.Count; k++)
{
  for (int l = 1; l <= range.Columns.Count; l++)
  {
    if (range.Cells[k, l].Value != null)
    {
      string strDataType = range.Cells[k, l].Value.GetType().Name;
      double dlTagValue;
      bool isDouble = double.TryParse(Convert.ToString(range.Cells[k, l].Value), out dlTagValue);
      if (strDataType.ToUpper() == "STRING" && !string.IsNullOrEmpty(range.Cells[k, l].Value) &&
          isDouble && DateTime.TryParseExact(Convert.ToString(DateTime.FromOADate(range.Cells[k, l].Value)),
                                             formats, CultureInfo.InvariantCulture, DateTimeStyles.None,
                                             out startDate))
      {
         isDate = true;
      }
      else
      {
         isDate = false;
       }
    }
    if (isDate)
    {
       DateTime dtTagValue = DateTime.FromOADate(Convert.ToDouble(range.Cells[k, l].Value));
       data[k - 1, l - 1] = dtTagValue.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture);
    }
    else
    {
      decimal dTagValue;
      bool isDecimal = decimal.TryParse(Convert.ToString(range.Cells[k, l].Value), out dTagValue);
      if (isDecimal)
      {
        bool isLong = dTagValue == (long)dTagValue;
        if (isLong)
        {
          data[k - 1, l - 1] = range.Cells[k, l].Value;
        }
        else
        {
          data[k - 1, l - 1] = string.Format("{0:F2}", dTagValue);
        }
      }
      else
      {
        data[k - 1, l - 1] = range.Cells[k, l].Value;
      }
    }
  }
}

额外问题:Zip Code格式

Zip Code显示示例

备注:内容来源于stack exchange,提问作者RGS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 02:54:38