使用 XSLT 从 XML 生成 EXCEL

Posted

技术标签:

【中文标题】使用 XSLT 从 XML 生成 EXCEL【英文标题】:Generate EXCEL from XML using XSLT 【发布时间】:2014-08-17 01:03:00 【问题描述】:

我有下面的 XML。想要使用 XSLT 从中生成 EXCEL。但我是新手,不知道如何从 XML 生成 XLS 以及如何将它用于 XSLT。

XML --

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<mig:menu-compare xmlns:mig="http://www.com/migration/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www..com/migration">
    <mig:menu-info>
        <mig:menu type="one" name="HCOTA"/>
        <mig:menu type="two" name="RTACOF"/>
    </mig:menu-info>
    <mig:field-details>
        <mig:fields existence="one">
            <mig:field name="taChrgOffMsg.taChrgOffCrit.funcCode">
                <mig:field-type type="one">
                    <mig:group-name>cota</mig:group-name>
                    <mig:page-name>cotacrit</mig:page-name>
                    <mig:control-type>Combo Box</mig:control-type>
                    <mig:ui-field>funcCode</mig:ui-field>
                    <mig:label>FLT000204</mig:label>
                    <mig:mandatory>Y</mig:mandatory>
                </mig:field-type>
            </mig:field>
            <mig:field>
                <mig:field-type type="one">
                    <mig:group-name>cota</mig:group-name>
                    <mig:page-name>cotares</mig:page-name>
                    <mig:control-type>Button</mig:control-type>
                    <mig:ui-field>endMenu</mig:ui-field>
                    <mig:label></mig:label>
                    <mig:mandatory></mig:mandatory>
                </mig:field-type>
            </mig:field>
        </mig:fields>
        <mig:fields existence="both">
            <mig:field name="taChrgOffMsg.taChrgOffCrit.Acct.foracid">
                <mig:field-type type="one">
                    <mig:group-name>cota</mig:group-name>
                    <mig:page-name>cotacrit</mig:page-name>
                    <mig:control-type>Text Field</mig:control-type>
                    <mig:ui-field>acctId</mig:ui-field>
                    <mig:label>FLT000265</mig:label>
                    <mig:mandatory>Y</mig:mandatory>
                </mig:field-type>
                <mig:field-type type="two">
                    <mig:group-name>Rtacof</mig:group-name>
                    <mig:page-name>Rtacof_criteria_form</mig:page-name>
                    <mig:control-type>FinAccountId</mig:control-type>
                    <mig:ui-field>acctId$accountId</mig:ui-field>
                    <mig:label>FLT001251</mig:label>
                    <mig:mandatory>true</mig:mandatory>
                    <mig:section-structure>group1.section1.subSection1.finRow1.finCell1</mig:section-structure>
                </mig:field-type>
            </mig:field>
            <mig:field name="taChrgOffMsg.taChrgOffCrit.chargeOffType">
                <mig:field-type type="one">
                    <mig:group-name>cota</mig:group-name>
                    <mig:page-name>cotacrit</mig:page-name>
                    <mig:control-type>Radio Button</mig:control-type>
                    <mig:ui-field>chargeOffMode</mig:ui-field>
                    <mig:label>FLT0045</mig:label>
                    <mig:mandatory>Y</mig:mandatory>
                </mig:field-type>
                <mig:field-type type="two">
                    <mig:group-name>Rtacof</mig:group-name>
                    <mig:page-name>Rtacof_criteria_form</mig:page-name>
                    <mig:control-type>FinRadioButtonGroup</mig:control-type>
                    <mig:ui-field>chargeMode</mig:ui-field>
                    <mig:label>FLT003817</mig:label>
                    <mig:mandatory>false</mig:mandatory>
                    <mig:section-structure>group1.section1.subSection12.finRow2.finCell4</mig:section-structure>
                </mig:field-type>
            </mig:field>
          </mig:fields>
        <mig:fields existence="ux">
            <mig:field name="taChrgOffMsg.taChrgOffCrit.Acct.acctName">
                <mig:field-type type="two">
                    <mig:group-name>Rtacof</mig:group-name>
                    <mig:page-name>Rtacof_criteria_form</mig:page-name>
                    <mig:control-type>FinAccountId</mig:control-type>
                    <mig:ui-field>acctId$accountNameDesc</mig:ui-field>
                    <mig:label>FLT001251</mig:label>
                    <mig:mandatory>true</mig:mandatory>
                    <mig:section-structure>group1.section1.subSection1.finRow1.finCell1</mig:section-structure>
                </mig:field-type>
            </mig:field>
            <mig:field name="taChrgOffMsg.taChrgOffCrit.Acct.Acct_1.Acct_2.1.acctName_2.1">
                <mig:field-type type="two">
                    <mig:group-name>Rtacof</mig:group-name>
                    <mig:page-name>Rtacof_criteria_form</mig:page-name>
                    <mig:control-type>FinAccountId</mig:control-type>
                    <mig:ui-field>acctId$accountNameDesc_2.1</mig:ui-field>
                    <mig:label>FLT001251</mig:label>
                    <mig:mandatory>true</mig:mandatory>
                    <mig:section-structure>group1.section1.subSection1.finRow1.finCell1</mig:section-structure>
                </mig:field-type>
            </mig:field>
           </mig:fields>
    </mig:field-details>
</mig:menu-compare>

我想要带有行的 EXCEL - 字段名称(唯一)、组名称、页面名称等(合并组名称、页面名称为 'ONE')和另一个组名称、页面名称等(合并此作为“二”)

【问题讨论】:

首先我建议生成一个CSV文件而不是XLS,因为它是纯文本并且更容易维护(并且可以通过Excel导入);其次,这是一个非常广泛的问题(根本不是一个真正的问题)。您是否尝试过任何可以向我们展示的方法? 另一种选择是生成html表格,也可以自动导入Excel。如果您需要包含样式、颜色、公式和特定的 Excel 数据,您将生成 XLS。在这种情况下,请检查以下问题:***.com/questions/23898158/… 和 ***.com/questions/24118320/… 【参考方案1】:

我现在正在做同样的研究,我遇到了xsl-excel-engine by Pavel Ptacek - 我还没有尝试过,但看起来很有希望。

【讨论】:

以上是关于使用 XSLT 从 XML 生成 EXCEL的主要内容,如果未能解决你的问题,请参考以下文章

java 怎样解析 excel生成的xml文件

自动生成XSLT - 通用/默认XSLT

使用 xslt 2 从节点生成 xpath

根据 XSD 兼容 XML 输入 -> XSD 兼容 XML 输出的 1:1 映射从 XSD 生成 XSLT 文件

使用 POM.xml 为 Webdriver 脚本生成 XSLT 报告

如何使用 XSLT 复制 XML 以生成相同形式的另一个新 XML