我正在使用 OpenXML SDK 来解析 .xlsx 文件。
当我在 Excel 文件中有非常大的数字时,即 344230125015305000
,OpenXML 将其转换为科学版本,即 3.4423012501530502E+17
。这很奇怪,因为 Excel 文件中存在“完整”值,这意味着它没有被截断并且它应该在 Cell 中的某处可用。对象。
欢迎提出任何建议。
更新:
@AlexeiLevenkov 建议我查看 xml 文件,这些值似乎以科学形式存储。有趣的是,Excel 仍然显示完整的表格。
例子:
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/