【问题标题】:Creating XML for import into Excel, particularly dates创建 XML 以导入 Excel,尤其是日期
【发布时间】:2010-11-10 15:14:51
【问题描述】:

您好。

我有一个生成一些性能记录数据的简单应用程序,我需要 Excel 可以访问输出。

我创建了一个包含字段等的 XML 文档,并且可以在 Excel 中打开它。

问题是,如何强制 Excel 将日期视为日期?我尝试将日期值保存为各种格式,但 Excel 始终将其视为文本。如果我单击单元格并按 Enter,它会愉快地将其显示为日期。当我做“文本到列”的事情时也是如此。

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<entries>
  <entry>
    <StartDate>14/07/2009 01:02:35</StartDate>
    <Total>1084</Total>
    <Connecting>788</Connecting>
    <Disconnecting>0</Disconnecting>
    <Queries>98</Queries>
  </entry>
  <entry>
    <StartDate>14/07/2009 01:10:00</StartDate>
    <Total>1054</Total>
    <Connecting>228</Connecting>
    <Disconnecting>1</Disconnecting>
    <Queries>104</Queries>
  </entry>
</entries>

【问题讨论】:

    标签: xml excel import


    【解决方案1】:

    诀窍是让 Excel 为您推断日期。为了这样对待日期,请将您的日期值格式化为 UTC (iso8601) 并删除“Z”以及之后的所有内容(excel 不支持这些)。比如转这个:

    1999-05-31T13:20:00Z-05:00 
    

    到这里:

    1999-05-31T13:20:00
    

    有关 Excel 如何推断 XML 类型的更多信息,请查看MSDN

    【讨论】:

    • 这让我很生气 Microsoft Excel 不支持 XML 中的标准日期时间格式。
    【解决方案2】:

    您可以完全指定工作表格式。感觉有点难看,制作人需要了解这么多目的地。

    <Worksheet ss:Name="Sheet2">
      <Table ss:ExpandedColumnCount="12" ss:ExpandedRowCount="15" x:FullColumns="1"
       x:FullRows="1" ss:DefaultRowHeight="13.2">
       <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="47.4" ss:Span="11"/>
       <Row ss:Index="4">
        <Cell ss:StyleID="s22"><Data ss:Type="DateTime">2009-04-20T00:00:00.000</Data></Cell>
    

    【讨论】:

    • 啊,我明白了。我不打算创建一个实际的 Excel XML 文档,似乎有点过分了。有必要吗?
    【解决方案3】:

    我会尝试这条路线: 创建一个 XML 地图数据源,例如:(我们将其称为“entriesMap.xsd”)

    <?xml version="1.0"?> 
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3schools.com" xmlns="http://www.w3schools.com" elementFormDefault="qualified">
        <xs:element name="entries">
          <xs:complexType>
            <xs:element name="entry">
                <xs:complexType>
                    <xs:sequence>
                      <xs:element name="StartDate" type="xs:timeDate"/>
                      <xs:element name="Total" type="xs:integer"/>
                      <xs:element name="Connecting" type="xs:string"/>
                      <xs:element name="Disconnecting" type="xs:string"/>
                      <xs:element name="Queries" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
          </xs:complexType>
        </xs:element>  
    </xs:schema>
    

    在新的 Excel 工作表中:

    1. 打开“XML 源”窗格(数据-->XML-->XML 源)
    2. 在 XML Source 窗格中选择“XML Maps...”按钮
    3. 选择“添加...”按钮
    4. 选择并打开 XML 映射文件(更改文件类型 *.xsd:我们的是 entryMap.xsd)
    5. 将地图元素(StartDate、Total 等)拖动到它们自己的列或一次全部拖动顶部元素
    6. 转到数据-->XML-->导入...
    7. 选择您的 XML 数据文件

    不确定我的 xsd 文件是否正确,但我相信如果你走这条路,它会起作用。

    【讨论】:

    【解决方案4】:

    这对我有用,而无需使用 xsd 或其他任何东西:

    <StartDate>2009-07-14T01:02:35</StartDate>
    

    Excel根据实际区域设置显示:

    07/14/2009 01:02
    

    【讨论】:

      【解决方案5】:

      您还可以创建一个与 XML 连接的 Excel。在包含 XML 数据的工作表上,为您使用公式从 tekst 值创建日期时间值的每个日期时间字段添加额外的列,例如 =DATEVALUE([datetime_txt]) + TIMEVALUE([datetime_txt])。 即使在刷新您的连接之后,Excel 也会将此视为日期时间。

      【讨论】:

        【解决方案6】:

        我看到了你的问题。您的日期格式是 dd/mm/yyyy。如果将其更改为 mm/dd/yyyy,Excel 会自动将其识别为日期。

        因此,一种解决方案是更改记录性能数据的方式。

        另一种方法是在 Excel 中创建一个使用如下公式的新列:

        =VALUE(MID(A2,4,2)&"/"&LEFT(A2,2)&RIGHT(A2,LEN(A2)-5))
        (where A2 is the cell containing the date text)
        

        这个公式在物理上重新排列日期,使月份在日期之前,然后对其应用 VALUE 函数以将其转换为数字日期+时间。

        如果可能只有一个“日”数字(例如,1/07/2009 01:02:35),您需要使用 if 语句检查,如下所示:

        =VALUE(IF(FIND("/",A2)=2,MID(A2,3,2)&"/"&LEFT(A2,1)&RIGHT(LEN(A2)-4),MID(A2,4,2)&"/"&LEFT(A2,2)&RIGHT(A2,LEN(A2)-5)))
        

        希望对您有所帮助。

        另一个想法:如果这只是要在您的机器上使用,您也许可以更改您的 Windows 默认日期/时间格式。我认为这会影响 Excel 解释日期的方式。

        【讨论】:

        • 我可以将记录器的输出格式设置为我喜欢的任何格式,我不想在 Excel 中添加任何公式。基本上我希望我可以打开它并且 Excel 会识别它。毕竟它可以识别数字 :) 我的语言环境设置为英国,所以 dd/mm/yyyy 格式的作品 - 如果我添加另一列并使用类似 =MONTH(A2) 的内容,它会正确显示为“7” ,但该字段仍然是文本,所以我不能只点击“短日期”按钮来格式化它。我将放弃 Excel 并为它创建一个 XSLT 或其他东西。
        • @Cylindric,啊,你是对的。您可能已经在这一点上继续前进,但我认为您需要做的就是让您的记录器格式化日期+时间以匹配正确的 XML 模式 DateTime 简单数据类型(“YYYY-MM-DDThh:mm:ss” ) 不是 Excel 首选格式之一。我刚刚尝试了一个示例,它可以工作。如果您未在 XML 中引用 XSD 文件,Excel 会推断架构,并且仅当根据 XML 架构规范将元素格式化为正确的 DateTime 时,它​​才会推断元素包含日期。见:w3schools.com/Schema/schema_dtypes_date.asp
        猜你喜欢
        • 1970-01-01
        • 2020-05-09
        • 1970-01-01
        • 2019-07-25
        • 2015-04-03
        • 2014-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多