试图从 excel xml 文件中获取有效时间到 OpenOffice Calc
Posted
技术标签:
【中文标题】试图从 excel xml 文件中获取有效时间到 OpenOffice Calc【英文标题】:Trying to get valid time from excel xml file into OpenOfficeCalc 【发布时间】:2016-07-02 00:35:05 【问题描述】:xml文件如下:-
<?xml version="1.0" encoding="iso-8859-1" ?>
<?mso-application progid="Excel.Sheet" ?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40" >
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office" />
<Styles >
<Style ss:ID="Default" ss:Name="Normal" >
<Borders />
<Interior />
<NumberFormat />
<Protection />
<Alignment ss:Vertical="Bottom" />
<Font />
</Style>
<Style ss:ID="s21" >
<NumberFormat ss:Format="dd\/MM\/yyyy HH:mm:ss" />
</Style>
<Style ss:ID="s23" >
<NumberFormat ss:Format="0.00000" />
</Style>
</Styles>
<Worksheet ss:Name="Sheet1" >
<Table ss:ExpandedColumnCount="5" ss:ExpandedRowCount="1040" >
<Row >
<Cell >
<Data ss:Type="String" >Date</Data>
</Cell>
<Cell >
<Data ss:Type="String" >Open</Data>
</Cell>
<Cell >
<Data ss:Type="String" >Close</Data>
</Cell>
<Cell >
<Data ss:Type="String" >High</Data>
</Cell>
<Cell >
<Data ss:Type="String" >Low</Data>
</Cell>
</Row>
<Row >
<Cell ss:StyleID="s21" >
<Data ss:Type="DateTime" >2016-07-02T02:49:00</Data>
</Cell>
<Cell ss:StyleID="s23" >
<Data ss:Type="Number" >0.74900</Data>
</Cell>
<Cell ss:StyleID="s23" >
<Data ss:Type="Number" >0.74800</Data>
</Cell>
<Cell ss:StyleID="s23" >
<Data ss:Type="Number" >0.74900</Data>
</Cell>
<Cell ss:StyleID="s23" >
<Data ss:Type="Number" >0.74800</Data>
</Cell>
</Row>
等
Open Office Calc 中的结果如下:-
Date Open Close High Low
02/07/2016 00:00:00 0.74900 0.74800 0.74900 0.74800
02/07/2016 00:00:00 0.74900 0.75000 0.75000 0.74900
01/07/2016 00:00:00 0.74800 0.74900 0.74900 0.74800
01/07/2016 00:00:00 0.74700 0.74800 0.74800 0.74700
01/07/2016 00:00:00 0.74600 0.74700 0.74700 0.74600
01/07/2016 00:00:00 0.74500 0.74600 0.74600 0.74500
请注意,时间始终为 00:00:00,但 xml 文件包含正确的时间。
我只能在 Open Office Calc 中更改 xml 文件或更改设置
那么我可以改变什么来获得正确的时间值出现在 Open Office Calc 中??
nb:我有“Note Tab Light”,它允许我使用正则表达式,因此修改 xml 文件很实用。
非常感谢 彼得
【问题讨论】:
【参考方案1】:如果OpenOffice
或LibreOffice
尝试导入不同于它们自己的XML 的XML 文件,那么它们正在使用XML 导入过滤器。您可以通过Tools - XML Filter Settings
设置这些过滤器。
MS Excel 2003 XML
的默认导入过滤器包含以下 XSLT:
<xsl:when test="ss:Data/@ss:Type = 'DateTime'">
<xsl:choose>
<xsl:when test="(contains( $data-format, 'Date') or contains($data-format,'y') or contains($data-format,'g') or contains($data-format,'d') or contains($data-format,'e') or starts-with( substring( ss:Data, 11), 'T00:00:00.000' ) ) and (not (contains( $data-format, 'Time') ) )">
<xsl:attribute name="office:value-type">date</xsl:attribute>
<xsl:attribute name="office:date-value">
<xsl:value-of select="substring-before(ss:Data, 'T')"/>
</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="office:value-type">time</xsl:attribute>
<xsl:attribute name="office:time-value">
<xsl:value-of select="concat('P',substring(ss:Data, 11, 3), 'H', substring(ss:Data, 15, 2), 'M', substring(ss:Data, 18,2), 'S')"/>
</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
这意味着过滤器采用任一日期部分或时间部分,但不能同时采用。
可以像这样更改 XSLT:
<xsl:when test="ss:Data/@ss:Type = 'DateTime'">
<xsl:choose>
<xsl:when test="(contains( $data-format, 'Date') or contains($data-format,'y') or contains($data-format,'g') or contains($data-format,'d') or contains($data-format,'e') or starts-with( substring( ss:Data, 11), 'T00:00:00.000' ) ) and (not (contains( $data-format, 'Time') ) )">
<xsl:attribute name="office:value-type">date</xsl:attribute>
<xsl:attribute name="office:date-value">
<!-- <xsl:value-of select="substring-before(ss:Data, 'T')"/> -->
<xsl:value-of select="ss:Data"/>
</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="office:value-type">time</xsl:attribute>
<xsl:attribute name="office:time-value">
<xsl:value-of select="concat('P',substring(ss:Data, 11, 3), 'H', substring(ss:Data, 15, 2), 'M', substring(ss:Data, 18,2), 'S')"/>
</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
但是为此必须在所有应该导入MS Excel 2003 XML
的OpenOffice 应用程序中更改share\xslt\import\spreadsheetml\spreadsheetml2ooo.xsl
。所以这是不切实际的。
人们可能希望 Apache 能够更正 MS Excel 2003 XML
的默认导入过滤器。但他们会吗?
所以总而言之,目前无法将DateTime
从MS Excel 2003 XML
转换为OpenOffice
。
但是MS Excel 2003 XML
相当老了。为什么需要使用这个旧的 XML?为什么不简单地使用真正的 Excel 格式,例如 BIFF
(*.xls
) 或 Office OpenXML
(*.xlsx
)?
【讨论】:
以上是关于试图从 excel xml 文件中获取有效时间到 OpenOffice Calc的主要内容,如果未能解决你的问题,请参考以下文章
将 XML 文件打开到数据网格视图算法中,数据表不支持从 xml 进行模式推断