excel - 什么表明 Office Open XML 单元格包含日期/时间值?

标签 excel openxml openxml-sdk

我正在使用 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 页的屏幕截图。

alt text

规范中包含的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/

相关文章:

c# - 如何使用 .NET 中的 OpenXML SDK 在 .docx 文件中的特定位置插入元素

vb.net - 如何使用 Open XML 将公式插入 Excel 2010 工作表?

sql - 如何在不打开Excel工作表的情况下刷新Excel中的SQL连接

java - 如何创建和写入 Excel 文件 (.xlsx)?

c# - 如何在 C# 中访问 Excel 工作表单元格

c# - 使用 XML 直接签署 Office Word 文档

excel - OpenOfficeXML : Copy worksheet from one work book to another

c# OpenXML 搜索和替换不保存的文本

excel - 无法关闭用户窗体

c# - 如何将 Decimal 值四舍五入到一个精度,以便总位数不超过 15?