我正在使用 Office Open XML SDK 读取 .xlsx 文件并且对读取日期/时间值感到困惑。我的一个电子表格有此标记(由 Excel 2010 生成)
<x:row r="2" spans="1:22" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<x:c r="A2" t="s">
<x:v>56</x:v>
</x:c>
<x:c r="B2" t="s">
<x:v>64</x:v>
</x:c>
.
.
.
<x:c r="J2" s="9">
<x:v>17145</x:v>
</x:c>
单元格 J2 中有一个日期序列值和一个样式属性 s="9"
。然而,Office Open XML 规范表示 9 对应于后面的超链接。这是ECMA-376,第二版,第 1 部分 - 基础知识和标记语言引用.pdf 第 4,999 页的屏幕截图。
规范中包含的presetCellStyles.xml 文件还引用builtinId
9 作为后续超链接。
<followedHyperlink builtinId="9">
规范中的所有样式都只是视觉格式样式,而不是数字样式。数字样式在哪里定义?如何区分样式引用 s="9"
和指示单元格格式(视觉)样式与数字样式?
显然,我在错误的位置寻找将单元格上的样式与其数字格式相匹配的位置。在哪里可以找到此信息?
最佳答案
s 属性引用 styles.xml 中的样式 xf 条目。样式 xf 又引用数字格式掩码。要识别包含日期的单元格,您需要执行样式 xf -> numberformat 查找,然后识别该数字格式掩码是否是日期/时间数字格式掩码(而不是百分比或会计数字格式掩码)。
style.xml 文件包含以下元素:
<xf numFmtId="14" ... applyNumberFormat="1" />
<xf numFmtId="1" ... applyNumberFormat="1" />
这些是 xf 条目,它们反过来为您提供引用数字格式掩码的 numFmtId。
您应该在 style.xml 顶部附近找到 numFmts 部分,作为 styleSheet 元素的一部分
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<numFmts count="3">
<numFmt numFmtId="164" formatCode="[$-414]mmmm\ yyyy;@" />
<numFmt numFmtId="165" formatCode="0.000" />
<numFmt numFmtId="166" formatCode="#,##0.000" />
</numFmts>
这里可能是数字格式id,也可能是内置格式之一。小于 164 的数字格式代码 (numFmtId) 是“内置”的。
我的列表不完整:
0 = 'General';
1 = '0';
2 = '0.00';
3 = '#,##0';
4 = '#,##0.00';
9 = '0%';
10 = '0.00%';
11 = '0.00E+00';
12 = '# ?/?';
13 = '# ??/??';
14 = 'mm-dd-yy';
15 = 'd-mmm-yy';
16 = 'd-mmm';
17 = 'mmm-yy';
18 = 'h:mm AM/PM';
19 = 'h:mm:ss AM/PM';
20 = 'h:mm';
21 = 'h:mm:ss';
22 = 'm/d/yy h:mm';
37 = '#,##0 ;(#,##0)';
38 = '#,##0 ;[Red](#,##0)';
39 = '#,##0.00;(#,##0.00)';
40 = '#,##0.00;[Red](#,##0.00)';
44 = '_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)';
45 = 'mm:ss';
46 = '[h]:mm:ss';
47 = 'mmss.0';
48 = '##0.0E+0';
49 = '@';
27 = '[$-404]e/m/d';
30 = 'm/d/yy';
36 = '[$-404]e/m/d';
50 = '[$-404]e/m/d';
57 = '[$-404]e/m/d';
59 = 't0';
60 = 't0.00';
61 = 't#,##0';
62 = 't#,##0.00';
67 = 't0%';
68 = 't0.00%';
69 = 't# ?/?';
70 = 't# ??/??';
缺失值主要与东亚变体格式有关。
关于excel - 什么表明 Office Open XML 单元格包含日期/时间值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4730152/