Попытка получить правильное время из файла 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: у меня есть "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>
Но для этого нужно изменить share\xslt\import\spreadsheetml\spreadsheetml2ooo.xsl
во всех приложениях OpenOffice, которые должны импортировать MS Excel 2003 XML
, Так что это неосуществимо.
Можно надеяться, что Apache исправит фильтр импорта по умолчанию для MS Excel 2003 XML
, Но будут ли они?
Итак, в заключение стоит сказать, что в настоящее время невозможно получить DateTime
от MS Excel 2003 XML
в OpenOffice
,
Но MS Excel 2003 XML
довольно старый. Зачем вам нужен этот старый XML? Почему бы просто не использовать настоящие форматы Excel, такие как BIFF
(*.xls
) или же Office OpenXML
(*.xlsx
)?