OpenXml SDK返回大数字的科学值

时间:2014-09-30 14:23:12

标签: 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

在值中添加单引号前缀可以解决问题(另一个指标,即在某处隐藏了完整的表单值),但它并不是这种情况的解决方案,因为我试试构建用户上传文件的自动处理。

2 个答案:

答案 0 :(得分:1)

使用Open XML Productivity Tool并反映文件的代码。 我做了,这里提供了工具

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);

它的价值还可以! 有趣的事实(也许有些c#gurus可以告诉我们原因)然后你必须首先转换成字符串。

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

答案 1 :(得分:0)

你的风格需要像这样声明:

 CellStyleFormats cellStyleFormats1 = new CellStyleFormats() { Count = (UInt32Value)1U };
            CellFormat cellFormat1 = new CellFormat() { NumberFormatId = (UInt32Value)1U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U, ApplyNumberFormat = true };

注意NumberFormatId和ApplyNumberFormat,这个ID必须是1,这样在XML中看起来像这样:

<xf numFmtId="1" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1"/>

PS: 来自MSDN: https://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.numberingformat(v=office.14).aspx