c# - OpenXml SDK 返回大量的科学值

标签 c# openxml

我正在使用 OpenXML SDK 来解析 .xlsx 文件。

当我在 Excel 文件中有非常大的数字时,即 344230125015305000,OpenXML 将其转换为科学版本,即 3.4423012501530502E+17。这很奇怪,因为 Excel 文件中存在“完整”值,这意味着它没有被截断并且它应该在 Cell 中的某处可用。对象。

enter image description here

欢迎提出任何建议。

更新:

@AlexeiLevenkov 建议我查看 xml 文件,这些值似乎以科学形式存储。有趣的是,Excel 仍然显示完整的表格。

enter image description here

例子:

344110425109461000 -> 3.4411042510946099E+17
344230125015305000 -> 3.4423012501530502E+17
344770124807291000 -> 3.4477012480729101E+17
344770224905172000 -> 3.4477022490517197E+17

试图转换回完整形式,即

(long)Double.Parse("3.4411042510946099E+17", CultureInfo.InvariantCulture)

返回不正确的值(344110425109460992 上面的代码片段)。

向值添加单引号前缀可以解决问题(另一个指示器,完整形式的值隐藏在某处),但这不是这种情况的解决方案,因为我正在尝试构建一个自动处理用户上传的文件。

最佳答案

使用 Open XML Productivity Tool 并反射(reflect)文件的代码。 我做到了,这是该工具提供的内容

public class GeneratedClass
{
    // Creates an Cell instance and adds its children.
    public Cell GenerateCell()
    {
        Cell cell1 = new Cell(){ CellReference = "A1", StyleIndex = (UInt32Value)1U };
        CellValue cellValue1 = new CellValue();
        cellValue1.Text = "3.4411042510946099E+17";

        cell1.Append(cellValue1);
        return cell1;
    }
}

所以你可以看到大数字只以科学记数法存储,那么你只需要

Double value = Double.Parse("3.4411042510946099E+17", 
   NumberStyles.AllowExponent | NumberStyles.AllowDecimalPoint, 
   System.Globalization.CultureInfo.InvariantCulture);

这个值就ok了! 有趣的事实(也许某些 C# 专家可以告诉我们原因)是您必须先转换为字符串。

String strdouble =  value.ToString("#", System.Globalization.CultureInfo.InvariantCulture);
Int64 conv = Convert.ToInt64(value);
// conv will be: 344110425109460992
Int64 conv1 = Convert.ToInt64(strdouble, System.Globalization.CultureInfo.InvariantCulture);
// conv1 will be: 344110425109461000

关于c# - OpenXml SDK 返回大量的科学值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26123217/

相关文章:

c# - 为什么在 C# 编译器中引入 const 关键字?

c# - 尽管存在 Controller ,但 Web API 未找到 Controller

c# - OpenXML 读取 CustomXMLPart

sql-server - 从 XML SQL Select 语句获取值

C# 任务.工厂.CancellationToken

c# - 使用 Windows Identity Foundation 重定向到自定义登录页面

c# - 为什么将值转换为 IEnumerable<T> 的行为会根据我初始化值的方式而有所不同?

c# - OpenXML 向现有 Excel 文件添加新行

ms-office - 使用 Office "open"XML - 这有多难?

sql-server - 如何从具有动态节点数的 XML 文件创建 SQL 表?