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