尝试从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文件是实用的。
非常感谢彼得
如果OpenOffice
或LibreOffice
尝试导入与自己的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 XML
到OpenOffice
获得DateTime
。
但MS Excel 2003 XML
是相当古老的。 为什么你需要使用这个旧的XML? 为什么不简单地使用像BIFF
( *.xls
)或Office OpenXML
( *.xlsx
)的真正的Excel fromats?