OpenXML 2.0获得错误的单元格值

4

我在读取一个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不为空的条件传递,然后使用以下代码检索值: value = targetCell.CellValue.Text.Trim(); 这个错误如何修复?
为什么会出现这个错误?

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

5

由于在Excel中将数字存储为双精度类型,因此您可以先将字符串解析为双精度类型,然后将其转换回字符串以获取用于显示的值:

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

让微软自己解决它的问题。

1

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


这是一个好的解决方法,但问题在于我实际上并没有处理来自Excel文件的任何信息,这意味着我可能会读取数字或纯文本,在这种情况下,你的代码就会失效。 - Gil
1
如果您想将显示匹配到Excel的显示,请查看https://dev59.com/r2445IYBdhLWcg3ws8dq的答案。您可以根据单元格格式设置来格式化字符串。这似乎是您应用程序的最合适的答案。 - emd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接