我正在开发一个摄取功能,它将采用格式正确的.xlsx
文件并将记录导入临时存储表,然后处理这些行以创建db记录。
其中一列严格格式化为" Text"但似乎Open XML API逐行处理列单元格的方式不同。一些看似数值的值确实不是(这就是为什么我们将列格式化为文本) -
一些例子是"211377", "211727.01", "209395.388", "209395.435"
这些值表示的并不重要,但会发生的是,某些值(使用Open XML API v2.5库)将作为文本正确读取,无论是从Shared Strings集合中检索还是仅从InnerXML属性中检索,而其他值得到数字似乎与附加的四舍五入或精确度有关。
例如,"211377", "211727.01" and "209395.435"
所有内容都与电子表格完全相同,但"209395.388"
值被引入"209395.38800000001"
(还有其他人也认为这种情况也是如此) 。
似乎没有任何押韵或理由使哪些值搞砸了,以及哪些值导入罚款。真正令人沮丧的是,如果我使用SQL Server Management Studio中的本机导入功能并将相同的电子表格提取到临时表,则不会发生这种情况 - 那么SSMS导入如何将这些值作为纯文本处理所有行,但是Open XML API不能。
答案 0 :(得分:0)
要开始回答,您的主要问题似乎是值,
“209395.388”的值被拉入“209395.38800000001”
是的.xlsx文件值存储为209395.38800000001
而不是209395.388
。它是存储浮点数的正确格式;没错。您只需通过以下代码段
string val = "209395.38800000001"; // <= What we extract from Open Xml
Console.WriteLine(double.Parse(val)); // < = Simply pass it to double and print
输出结果为:
209395.388 // <= yes the expected value
因此,使用Open Xml SDK从.xlsx中提取的值没有任何问题。
现在对于细胞,是的细胞可以具有真实的格式。数字,文本,波兰语或共享字符串文本。您可以styles
到一个单元格,它会将您的字符串格式化为Excel中的所需输出。 (前 - 日期时间格式,强制字符串等)。这就是Excel处理大量数据的方式。它需要这种格式,而.xlsx文件格式必须要复杂一点才能支持所有格式。
我的建议是使用在提取的值上设置的正确解析方法来标识它所代表的格式(例如,确定它是数字还是文本)并应用parse
的类型。
前: -
string val = "209395.38800000001";
Console.WriteLine(float.Parse(val)); // <= Float parse will be deduce a different value ; 209395.4
更新:
以下是如何在内部XML中保存值
亲自尝试;
Make an .xlsx file with value 209395.388 -> Change extention to .zip -> Unzip it -> goto worksheet folder -> open Sheet1
您会注意到,该值作为附加图像中的场景存储为209395.38800000001 ..因此,在提取存储的数字的API上没有任何错误。您有责任决定采用何种格式。
但是如果您在添加数据之前创建整个文本,则会看到.xlsx按原样保存数据;简单地说是字符串。