Styling excel от XSL: ошибка таблицы

Поэтому я хотел добавить несколько стилей в мой Excel XSLT. Логика работает нормально, но когда я пытаюсь добавить стиль, выдает ошибку вроде

Ошибка Excel: во время загрузки возникла проблема в следующих областях: Таблица

Ошибки перечислены в: c:\Users\uname\appdat\microsoft\windows\ временныйИнтернет-файлы \content.MSO\xxxxxxxx.log

Мой код:

<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Excel.Sheet"?>
<xsl:stylesheet 
    xmlns:ns="urn:control.services........" 
    xmlns:m="urn:messages........." 
    xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
    xmlns="urn:schemas-microsoft-com:office:spreadsheet"
    xmlns:o="urn:schemas-microsoft-com:office:office"
     xmlns:html="http://www.w3.org/TR/REC-html40"
        xmlns:x="urn:schemas-microsoft-com:office:excel"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <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="s62">
                   <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="12" ss:Color="#000000"   ss:Bold="1"/>
                   <Interior ss:Color="#79DCFF"/>
                  </Style>
    </Styles>
    <xsl:output indent="yes"/>
    <xsl:variable name="header" select="distinct-values(/ns:ServiceRequest/m:ItemRequest/ns:ServiceRequest/m:*/m:*/local-name())"/>
    <xsl:variable name="fields" select="distinct-values(/ns:ServiceRequest/m:ItemRequest/ns:ServiceRequest/m:*/m:*/name())"/>
    <xsl:template match="/">
        <ss:Workbook>
            <ss:Worksheet ss:Name="SomeData">
                    <ss:Table>
                    <xsl:for-each select="($header)">
                    <ss:Column ss:Width="160"/> 
                    </xsl:for-each>
                    <ss:Row>
                        <xsl:for-each select="($header)">
                            <ss:Cell ss:ID="s62">
                                <ss:Data ss:Type="String">
                                    <xsl:value-of select="."/>
                                </ss:Data>
                                </ss:Cell>
                        </xsl:for-each>
                    </ss:Row>
                    <xsl:apply-templates select="ns:ServiceRequest/m:ItemRequest/ns:ServiceRequest/m:*"/>
                    </ss:Table>
                </ss:Worksheet>
            </ss:Workbook>
    </xsl:template>

    <xsl:template match="m:*">
        <xsl:variable name="data" select="."/>
        <ss:Row>
            <xsl:for-each select="$fields"> 
                <ss:Cell>
                    <ss:Data ss:Type="String">
                        <xsl:value-of select="$data/*[name()=current()]/text()"/>
                    </ss:Data>
                </ss:Cell>
             </xsl:for-each>
        </ss:Row>
    </xsl:template>
</xsl:stylesheet>

Я на самом деле хотел выделить шрифты заголовка, сохранить границу и задать цвет фона для заголовка.

1 ответ

Решение

В вашем XSLT есть 2 ошибки:

  1. Ваш <Styles>находятся вне какого-либо шаблона, они вообще не будут отображаться в вашем выходном документе. Они должны быть внутри Workbook.

  2. Клетка не имеет ss:ID только атрибут Стиль имеет ss:ID, чтобы ссылаться на использование стиля ss:StyleID="s62" вместо.

Загляните в c:\Users\uname\appdat\microsoft\windows\ временныйИнтернет-файлы \ content.MSO \ xxxxxxxx.log(вы не можете просмотреть это местоположение, папка скрыта, поэтому скопируйте этот путь в адресную строку вашего проводника или в Окно "Выполнить") это дало бы вам дополнительную информацию, например:

XML ERROR in Table
REASON: Illegal Tag
FILE:   C:\temp\Untitled15.xls
GROUP:  Row
TAG:    Cell
ATTRIB: ID
VALUE:  s62

Office выдаёт заведомо плохие сообщения об ошибках, но, просматривая итоговый документ, вы, как правило, получите некоторую подсказку.

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