Попытка получить правильное время из файла 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)?

Другие вопросы по тегам