通过XSLT应用html:color时,Excel不显示文本

时间:2018-12-12 02:18:07

标签: excel xslt

许多月前,我问(并回答了)一个有关在XSLT for Excel中将文本颜色作为模板参数传递的问题(请参阅:Passing Excel text color parameter to templates) 起初我以为这是相关的,因为我在模板中有“数据”部分,但是由于这次文本颜色是硬编码的,所以没有用。只是要确保做一个超级简单的测试用例。也许我太累了,看不到简单的解决方案。

我有一个包含两组文本的单元格。如果检查变量通过,那么我想将文本的第二部分写成红色,而将第一部分始终写成白色。

下面是我简单的XSLT测试用例。我希望在此设置中看到白色文本为“PériodeDu 01-01-2019 Au 31-01-2019”,红色文本为“ Aucun Mois FiscalSélectionné”。如果法语因任何原因困扰您,只需将英语变量切换为Y(喜欢编写双语报告!)。

令我更加恼火的是,在SpreadsheetML中,我看到了所需的结果,但是它并没有显示在Excel本身中。而是Excel只是显示一个空白单元格。

XSLT测试用例:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0" xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
<xsl:output encoding="UTF-8" method="xml" indent="no"/>

<xsl:variable name="english" select="'N'"/>
<xsl:variable name="selectedDates" select="'N'"/>
<xsl:variable name="reportPeriodStart" select="'01-01-2019'"/>
<xsl:variable name="reportPeriodEnd" select="'31-01-2019'"/>

<xsl:template match="/">
    <Workbook>
        <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
            <Author>Developer</Author>
            <Created>2018-12-11T17:43:39Z</Created>
            <Version>16.00</Version>
        </DocumentProperties>
        <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
            <AllowPNG/>
        </OfficeDocumentSettings>
        <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
            <WindowHeight>8712</WindowHeight>
            <WindowWidth>23040</WindowWidth>
            <WindowTopX>32767</WindowTopX>
            <WindowTopY>32767</WindowTopY>
            <ProtectStructure>False</ProtectStructure>
            <ProtectWindows>False</ProtectWindows>
        </ExcelWorkbook>
        <Styles>
            <Style ss:ID="Default" ss:Name="Normal">
                <Alignment ss:Vertical="Bottom"/>
                <Borders/>
                <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
                <Interior/>
                <NumberFormat/>
                <Protection/>
            </Style>
            <Style ss:ID="s43">
                <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
                <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#FFFFFF" ss:Bold="1"/>
                <Interior ss:Color="#005C96" ss:Pattern="Solid"/>
            </Style>
        </Styles>
        <Worksheet ss:Name="Sheet1">
            <Table>
                <Column ss:AutoFitWidth="0" ss:Width="500"/>
                <Row>
                    <Cell ss:StyleID="s43">
                        <Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
                            <B>
                                <Font html:Color="FFFFFF">
                                    <xsl:choose>
                                        <xsl:when test="$english = 'Y'">
                                            <xsl:value-of select="concat('Period of ', $reportPeriodStart, ' To ', $reportPeriodEnd)"/>                                                    
                                        </xsl:when>
                                        <xsl:otherwise>
                                            <xsl:value-of select="concat('Période Du ', $reportPeriodStart, ' Au ', $reportPeriodEnd)"/>        
                                        </xsl:otherwise>
                                    </xsl:choose>
                                </Font>
                                <xsl:if test="$selectedDates = 'N'">
                                    <Font html:Color="FF0000">
                                        <xsl:choose>
                                            <xsl:when test="$english = 'Y'"> No Fiscal Month Selected</xsl:when>
                                            <xsl:otherwise> Aucun Mois Fiscal Sélectionné</xsl:otherwise>
                                        </xsl:choose>
                                    </Font>
                                </xsl:if>
                            </B>
                        </Data>
                    </Cell>
                </Row>
            </Table>
            <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
                <PageSetup>
                    <Layout x:Orientation="Landscape"/>
                    <PageMargins x:Bottom="0.5" x:Left="0.25" x:Right="0.25" x:Top="0.5"/>
                </PageSetup>
                <FitToPage/>
                <Print>
                    <FitHeight>0</FitHeight>
                    <ValidPrinterInfo/>
                    <Scale>89</Scale>
                    <HorizontalResolution>600</HorizontalResolution>
                    <VerticalResolution>600</VerticalResolution>
                </Print>
                <ProtectObjects>False</ProtectObjects>
                <ProtectScenarios>False</ProtectScenarios>
            </WorksheetOptions>
        </Worksheet>
    </Workbook>
</xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

链接的问题实际上对此有答案(彼得·范德·韦尔的答案显示了正确的格式)

您的问题在于此元素

 <Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">

通过在此处使用默认的名称空间声明,您还将Data元素放入该名称空间。 Data必须位于urn:schemas-microsoft-com:office:spreadsheet命名空间中。由于已经绑定到前缀ss,因此您只需要这样声明:

<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">

此外,字体颜色需要带有#前缀...

<Font html:Color="#FFFFFF">

所以,您的表格元素应该看起来像这样

<Table>
    <Column ss:AutoFitWidth="0" ss:Width="500"/>
    <Row>
        <Cell ss:StyleID="s43">
            <ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
                <B>
                    <Font html:Color="#FFFFFF">
                        <xsl:choose>
                            <xsl:when test="$english = 'Y'">
                                <xsl:value-of select="concat('Period of ', $reportPeriodStart, ' To ', $reportPeriodEnd)"/>                                                    
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:value-of select="concat('Période Du ', $reportPeriodStart, ' Au ', $reportPeriodEnd)"/>        
                            </xsl:otherwise>
                        </xsl:choose>
                    </Font>
                    <xsl:if test="$selectedDates = 'N'">
                        <Font html:Color="#FF0000">
                            <xsl:choose>
                                <xsl:when test="$english = 'Y'"> No Fiscal Month Selected</xsl:when>
                                <xsl:otherwise> Aucun Mois Fiscal Sélectionné</xsl:otherwise>
                            </xsl:choose>
                        </Font>
                    </xsl:if>
                </B>
            </ss:Data>
        </Cell>
    </Row>
</Table>

请注意,您仍然会看到它没有显示换行符的问题,但是如果无法解决,您可能需要问另一个问题