在OpenOffice中转换XML格式的计算(Excel)数据
我需要将OpenOffice Excel数据转换为XML。我的机器中有ApacheOpenOffice 4.1.1,而不是MS-Office 样本数据。 第一行是标签在OpenOffice中转换XML格式的计算(Excel)数据,xml,openoffice-calc,Xml,Openoffice Calc,我需要将OpenOffice Excel数据转换为XML。我的机器中有ApacheOpenOffice 4.1.1,而不是MS-Office 样本数据。 第一行是标签 CustData FirstName MiddleName LastName EMail PhoneNumber abe x Park abe@mail.com 2323232323 poppy
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>
您可以下载OpenXmlSDK 它包含可帮助您发现excel文档结构的生产力工具,例如: 然后使用任何可用的XSLT教程了解将一种XML结构转换为另一种XML结构的方法 这也可以帮助你:
Openoffice和Libreoffice Calc能够通过XSLT和导出过滤器转换其XML。要使用示例数据执行此操作,请执行以下操作: 首先,创建以下XSL文件并将其另存为SampleDataExportFilter.XSL: 现在打开Calc并选择工具-XML过滤器设置: 选择“新建”并填写“常规”对话框: 在寄存器转换中,选择SampleDataExportFilter.xsl作为要导出的XSLT: 用“确定”确认,用“关闭”确认XML筛选器设置 现在创建以下计算文件:
使用File-Export,您现在应该能够使用文件类型CustData.xml作为xml导出电子表格数据。绝妙提示!在Calc 6.0.7.3中发现错误,如果两个连续单元格的值相同,它将跳过第二个单元格的值,并使用下一个单元格的值!该行的所有后续值也会被一列移位,并且在该行中是累积的。如果我重新组织列,使并列列中没有相同的字段值,并将.xsl中的单元格引用更改为匹配,则效果良好。OpenOffice和Microsoft Office格式都已采用XML格式或压缩XML格式。您可能应该将Calc保存的实际XML文档作为输入,并使用XSLT对其进行转换。@MathiasMüller从何处获取Calc保存的实际XML文档,使用XSLT进行转换以及如何使用它?如果举一个openoffice的例子,它对我真的是一个很大的帮助。Calc将您的文档保存为文件系统中的文件。如果在纯文本编辑器中打开这样一个文件,您将立即看到它是一个XML文档。查看这个普通文件,找出感兴趣的数据所在的位置。使用XSLT模板将这些元素作为目标。请注意:我只能为您指出正确的方向,您的问题对于Stackoverflow来说过于模糊和宽泛。使用OpenOffice 3.4进行验证时,我看到一个完美的XML文件在我面前。但当我按下Validate时,它给了我两个错误:文档无效:找不到语法。和文档根元素roor必须匹配DOCTYPE root null。如果我尝试使用它导出,它将失败。你知道会出什么问题吗?OpenOffice 3.4?真正地目前的版本是4.x。OOXML验证器中提到的错误与此无关。语法是文档类型声明DTD。导出的XML当然没有。为什么它应该有?下一个错误是此错误的后续错误。使用oO自己的XML过滤器尝试同样的方法,例如MS Excel 2003 XML。同样的错误。这些错误不会导致导出失败。是的,真的,当我习惯了这些错误时,我讨厌它们更改或删除X。或者,当事情停止运行时,更新软件会无数次地发生在我身上。无论如何,我是用这个方法计算出来的:它和你的例子有些不同,但我得到的结果与我在你的例子中尝试的方法相同。我的例子非常简单,只适用于例子中显示的计算表:B列中的FirstName,C列中的MiddleName,。。。。提供它是为了理解不是现成的解决方案的原则,我只是更改了XSL文件中的第一行命名和相应部分。我认为我甚至不应该改变XSL,因为它寻找的是一个单元格而不是值,xml可以是任何东西。奇怪的是,它确实在验证时显示了一个XML文件,但它不会保存它。
<?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() > 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>