2009-05-29 19 views
5

Tengo una plantilla XSLT que se aplica a un archivo XML de datos. La plantilla genera un archivo Excel Spreadsheet XML.Aplicar XSLT en XML antes de importar a Excel

Todo funciona maravillosa excepto por un pequeño problema ....

Al abrir la hoja de cálculo en Excel, lo trata como una importación XML y me pregunta si la hoja de estilo debe ser aplicado. Me gustaría tenerlo para que aplique automáticamente cualquier plantilla XSLT que esté asociada con el archivo.

A continuación se muestra un código de ejemplo .... gracias de antemano ....

documento XML ...

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="spreadstyle.xsl"?> 

<ResponseBody> 
    <ActivityDetails> 
     <ActivityDetail> 
      <TranCodeDesc>LateChargeAssessment</TranCodeDesc> 
     </ActivityDetail> 
    </ActivityDetails> 
</ResponseBody> 

plantilla XSLT ...

<?xml version="1.0"?> 
<?mso-application progid="Excel.Sheet"?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 


    <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
    xmlns:o="urn:schemas-microsoft-com:office:office" 
    xmlns:x="urn:schemas-microsoft-com:office:excel" 
    xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
    xmlns:html="http://www.w3.org/TR/REC-html40"> 

    <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> 
     <Author>tbarbedo</Author> 
     <Created>2009-05-29T18:21:48Z</Created> 
     <Version>12.00</Version> 
    </DocumentProperties> 
    <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> 
     <WindowHeight>8895</WindowHeight> 
     <WindowWidth>18015</WindowWidth> 
     <WindowTopX>0</WindowTopX> 
     <WindowTopY>105</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> 
    </Styles> 
    <Worksheet ss:Name="Sheet1"> 
     <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="5000" x:FullColumns="1" 
     x:FullRows="1" ss:DefaultRowHeight="15"> 
      <Row><Cell><Data ss:Type="String">Transaction Code Descriptions (MAGIC) </Data></Cell></Row> 
      <xsl:for-each select="ResponseBody/ActivityDetails/ActivityDetail">  
       <Row> 
        <Cell> 
         <Data ss:Type="String"> 
          <xsl:value-of select="TranCodeDesc" /> 
         </Data> 
        </Cell> 

       </Row> 
      </xsl:for-each> 

     </Table> 
     <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> 
     <PageSetup> 
     <Header x:Margin="0.3"/> 
     <Footer x:Margin="0.3"/> 
     <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/> 
     </PageSetup> 
     <Selected/> 
     <Panes> 
     <Pane> 
     <Number>3</Number> 
     <ActiveRow>1</ActiveRow> 
     </Pane> 
     </Panes> 
     <ProtectObjects>False</ProtectObjects> 
     <ProtectScenarios>False</ProtectScenarios> 
     </WorksheetOptions> 
    </Worksheet> 
    </Workbook> 

</xsl:template> 
</xsl:stylesheet> 
+0

Esto no es realmente una pregunta XSLT, pero una de Excel ... – 0x6adb015

Respuesta

3

Según tengo entendido, no hay forma de evitar el Importación XML ... dialo g que se muestra. La razón se explica en este artículo de MSDN (Transform XML Files with XSLT When Importing into Microsoft Excel 2002):

XML es un lenguaje de marcas utilizado para describir datos estructurados (por ejemplo, que en una hoja de trabajo) para que pueda ser leído por una variedad de aplicaciones. Los diseñadores pueden crear elementos XML personalizados, lo que permite la definición, transmisión, validación e interpretación de datos entre aplicaciones y entre organizaciones. Esta versatilidad brinda muchas oportunidades para el intercambio de datos, pero también tiene al menos un desafío inherente. Al manipular los elementos de un documento XML, los diseñadores pueden crear cualquier cantidad de dimensiones de elementos anidados dentro de un documento. Estas relaciones de elemento primario/secundario pueden generar ambigüedad en el paradigma bidimensional de filas y columnas de una hoja de cálculo de Excel.

Para hacer frente a esta ambigüedad, Excel fuerza un formato a los datos XML que recibe, a menos que los datos provienen de una hoja de estilo que permite predefinir otro formato . Este formato forzado se crea utilizando un algoritmo de aplanamiento a llene las filas y columnas que comprenden una hoja de trabajo. Sin embargo, aunque este formato es efectivo al forzar datos multidimensionales en un formato bidimensional , no siempre presenta los datos en el formato óptimo para un lector humano.

Entonces, ¿cómo sabe Excel cuándo usar el algoritmo de aplanamiento o la hoja de estilo XSLT? Cuando se abre Excel o importa un archivo de datos XML, busca un elemento dentro del archivo que apunta a en una hoja de estilos XSLT. Si ese elemento está presente, Excel muestra un cuadro de diálogo que le solicita que aplique la hoja de estilos o que abra el archivo sin una hoja de estilos.

3

Si se agrega esta instrucción en la hoja XSL:

<xsl:template match="/"> 
    <xsl:processing-instruction name="mso-application"> 
    <xsl:text>progid="Excel.Sheet"</xsl:text> 
    </xsl:processing-instruction> 

.... excel ejecutará bien

+0

Parece que esto no funcionará. Ya tengo en la fila .xml con . Y ese código xslt solo crea esta cadena. La indicación "Import XML" aparece de todos modos :( –