尝试从Excel的xml文件到OpenOfficeCalc有效的时间

这个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文件包含正确的时间。

我只能修改xml文件或更改Open Office Calc中的设置

那么,我可以改变什么,以获得正确的时间值出现在Open Office Calc?

NB:我有“注意选项灯”,它允许我使用正则expression式,所以修改XML文件是实用的。

非常感谢彼得

如果OpenOfficeLibreOffice尝试导入与自己的XML不同的XML文件,那么他们正在使用XML导入filter。 您可以通过Tools - XML Filter Settings来设置这些筛选Tools - XML Filter Settings

MS Excel 2003 XML的默认导入filter包含以下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> 

这意味着filter采取date部分时间部分,但不是两个。

可以像下面这样改变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的默认导入filter。 但他们会吗?

所以最后是说,目前不可能从MS Excel 2003 XMLOpenOffice获得DateTime

MS Excel 2003 XML是相当古老的。 为什么你需要使用这个旧的XML? 为什么不简单地使用像BIFF*.xls )或Office OpenXML*.xlsx )的真正的Excel fromats?