在OpenOffice中将Calc(Excel)数据转换为XML

6

我有一个需求,需要将OpenOffice Excel数据转换成XML格式。我的电脑上安装的是Apache OpenOffice 4.1.1(而不是MS Office)。

样本数据。(第一行是标签名)

CustData FirstName  MiddleName  LastName   EMail             PhoneNumber
           abe       x          Park      abe@mail.com       2323232323
           poppy     y          Kaith     Poppy@mail.com     2323232323

需要的结果如下:

<CustData>
        <FirstName>abe</FirstName>  
        <MiddleName>x</MiddleName>
        <LastName>Park</LastName>   
        <EMail>abe@mail.com</EMail>             
        <PhoneNumber>2323232323</PhoneNumber>
</CustData>
<CustData>
       <FirstName>poppy</FirstName>  
       <MiddleName>y</MiddleName>
       <LastName>Kaith</LastName>   
        <EMail>Poppy@mail.com </EMail>             
        <PhoneNumber>2323232323</PhoneNumber>
</CustData>

OpenOffice和Microsoft Office格式已经是XML格式(或压缩的XML格式)。您可以将Calc保存的实际XML文档作为输入,并使用XSLT进行转换。 - Mathias Müller
@MathiasMüller 我们从哪里获取 Calc 保存的实际 XML 文档,以及用于转换的 XSLT,如何使用它?如果能够提供一个 OpenOffice 的示例,那对我来说真的是非常有帮助的。 - Rohit
Calc将您的文档保存为文件存储在文件系统中。如果您在纯文本编辑器中打开这样的文件,您会立即看到它是一个XML文档。查看这个普通文件,并找出有趣的数据位于哪里。使用XSLT模板定位这些元素。请注意:我只能指引您正确的方向,您的问题对于Stackoverflow来说过于模糊和广泛。 - Mathias Müller
3个回答

6

OpenOffice和LibreOffice Calc可以使用导出过滤器(Export Filters)通过XSLT转换其XML。要对您的示例数据执行此操作,请按照以下步骤进行:

首先创建以下XSL文件,并将其保存为SampleDataExportFilter.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" exclude-result-prefixes="office table text">

 <xsl:template match="/">
  <root>
   <xsl:apply-templates select="/*/office:body" />
  </root>
 </xsl:template>

 <xsl:template match="office:body">
  <xsl:apply-templates />
 </xsl:template>

 <xsl:template match="office:spreadsheet">
  <xsl:apply-templates />
 </xsl:template>

 <xsl:template match="office:spreadsheet/table:table">

   <xsl:for-each select="table:table-row[position() &gt; 1]">

   <CustData>
    <FirstName><xsl:value-of select="table:table-cell[2]/text:p" /></FirstName> 
    <MiddleName><xsl:value-of select="table:table-cell[3]/text:p" /></MiddleName>
    <LastName><xsl:value-of select="table:table-cell[4]/text:p" /></LastName>   
    <EMail><xsl:value-of select="table:table-cell[5]/text:p" /></EMail>            
    <PhoneNumber><xsl:value-of select="table:table-cell[6]/text:p" /></PhoneNumber>
   </CustData>

   </xsl:for-each>

 </xsl:template>
</xsl:stylesheet>

现在打开 Calc 并选择 工具 - XML 过滤器设置:

enter image description here

选择New并填写对话框General

enter image description here

在注册表中选择“转换”,将SampleDataExportFilter.xsl作为导出的XSLT

enter image description here

点击确定按钮,然后点击关闭按钮以保存XML过滤器设置。

现在创建以下Calc文件:

enter image description here

使用“文件” - “导出”,您现在应该能够将电子表格数据导出为XML,使用“文件类型”为“CustData(.xml)”。请保留HTML标签。

使用OpenOffice 3.4进行验证时,我看到了一个完全正常的XML文件。但是当我按下“验证”按钮时,它会给出两个错误:文档无效:找不到语法。文档根元素“roor”必须匹配DOCTYPE根元素“null”。如果我尝试使用此导出,它将失败。有什么想法是错的吗? - Madmenyo
OpenOffice 3.4?真的吗?当前版本是4.x。oO XML验证器提到的错误并不相关。Grammar是文档类型声明(DTD)。导出的XML当然没有这个。为什么它应该有呢?下一个错误是这个的后继者。例如,使用oO自己的XML过滤器MS Excel 2003 XML尝试相同的操作。同样的“错误”。这些错误不能导致导出失败。 - Axel Richter
在我的OOCalc 4.11上可以工作。导出具体是怎么失败的?有错误信息吗?只保存空的<root/> XML文件?还是根本没有保存? - Axel Richter
尝试导出时出现简单的错误消息:“无法保存”或类似的东西。在验证导出XSL时,它显示了我在第一条评论中提到的这两个错误,但这也适用于我的当前工作解决方案。这是有效的:https://www.dropbox.com/s/zorkxxst6lkb47z/import.xsl?dl=0无论我对表格做什么更改,这都可以正常工作。它只会为每个具有数据的行获取B1:B6。 - Madmenyo
抱歉,无法重现。我的XSL也可以在OpenOffice Calc 3.2.1上正常工作,但我在Ubuntu中没有找到它。 - Axel Richter
显示剩余4条评论

1

0

太棒了!在Calc 6.0.7.3中发现了一个bug,如果两个连续的单元格具有相同的值,则跳过第二个单元格的值并使用下一个单元格的值!该行的所有后续值也向右移动一列,并且在该行内是累积的。如果我重新组织列,使相邻列中没有相同的字段值,并更改.xsl中的单元格引用号以匹配,则可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接