【问题标题】:OpenXML 2.0 Gets wrong cell valueOpenXML 2.0 获取错误的单元格值
【发布时间】:2016-09-06 17:43:43
【问题描述】:

我在读取 Excel 2010 工作表中的值时遇到了一点问题。

在标准 Excel 2010 工作表上,我有一个单元格,其货币格式为小数点后两位,值为 1270,14 €

当我在 OpenXML 2.0(C# 代码)上读取此值时,我得到 1270.1400000000001 而不是原来的 1270.14

任何具有相同格式的单元格上的其他值也会发生同样的情况。

从单元格 OpenXML 代码中获取值:

private string GetCellValue(string column, int row)
{
    column = column.ToUpper();
    var targetCell = cells.Where(p => p.CellReference == (column + row)).SingleOrDefault();

    var value = String.Empty;

    if (targetCell.DataType != null && targetCell.DataType.Value == CellValues.SharedString)
    {
        var index = int.Parse(targetCell.CellValue.Text);
        value = cellValues[index].InnerText.Trim();
    }
    else
    {
        if (targetCell.CellValue != null)
        {
            value = targetCell.CellValue.Text.Trim();
        }
        else
        {
            value = null;
        }
    }

    return value;
}

特定值通过'if' DataType is not null 条件,并用该行检索值:

value = targetCell.CellValue.Text.Trim();

如何解决这个问题?

为什么会出现这个错误?

【问题讨论】:

  • 这与 OpenXML 无关 - 这是使用“浮点运算”(在几乎所有平台和几乎所有语言上)的固有问题...... Excel 确实格式化了显示的值。 ..你也可以这样做...
  • @Yahia - 如果该值是某种计算的结果,那么您可能是对的,但不是。 '1270,14' 是在单元格上键入的数字,预先格式化为具有两位小数的货币。由于我没有进行任何类型的计算\公式,我认为这里不存在“浮点运算”的问题。
  • 你刚刚证明了我的观点:单元格被 格式化 为十进制,有 2 个小数位......但是当你从 .NET 访问它时,你会得到一个双精度值,这反过来是容易出现任何“浮点运算”!

标签: c# .net-4.0 openxml openxml-sdk excel-2010


【解决方案1】:

由于Excel中数字是以double形式存储的,所以可以先将字符串解析为double,然后再转回字符串得到显示的值:

    string s = Convert.ToDouble(value).ToString();

让微软自己解决问题。

【讨论】:

    【解决方案2】:

    虽然它可能不适合您的应用程序,但最简单的解决方法是简单地将您返回的值四舍五入并分配它或在适用的情况下返回它。 somevarhere=Math.Round(Convert.ToDouble(value), 2)

    【讨论】:

    • 这是一个很好的解决方法,但问题是我并没有真正处理来自 excel 文件的任何信息,这意味着我可以读取数字或简单的文本,在这种情况下你的代码会中断.
    • 如果您想将您的显示与 Excel 的显示相匹配,请查看stackoverflow.com/questions/4730152/… 的答案您可以根据单元格格式设置字符串的格式。这似乎是您的应用程序最合适的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    相关资源
    最近更新 更多