2009-05-29 3 views
5

Ho un modello XSLT che viene applicato a un file XML di dati. Il modello genera un file XML di fogli di calcolo Excel.Applicare XSLT su XML prima di importare in Excel

Tutto funziona meraviglioso tranne per un problema minore ....

Quando ho aperto il foglio di calcolo in Excel, si considera come un'importazione XML e mi chiede se deve essere applicato il foglio di stile. Mi piacerebbe averlo così applica automaticamente qualsiasi modello XSLT associato al file.

Di seguito è riportato un codice di esempio .... grazie in anticipo ....

XML Document ...

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

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

XSLT Template ...

<?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

Questa non è una domanda XSLT, ma una Excel ... – 0x6adb015

risposta

3

Dalla mia comprensione, non c'è modo di aggirare il dialo di importazione XML ... g viene mostrato. Il motivo è spiegato in questo articolo di MSDN (Transform XML Files with XSLT When Importing into Microsoft Excel 2002):

XML è un linguaggio di markup utilizzato per descrivere dati strutturati (come quella di un foglio di lavoro), in modo che possa essere letto da una varietà di applicazioni. I progettisti possono creare elementi XML personalizzati, consentendo la definizione, la trasmissione, la convalida e l'interpretazione dei dati tra le applicazioni e tra le organizzazioni. Questa versatilità offre molte opportunità per lo scambio di dati, ma ha anche almeno una sfida intrinseca. Manipolando gli elementi di un documento XML, i progettisti possono creare qualsiasi numero di dimensioni di elementi annidati all'interno di un documento. Queste relazioni tra elementi padre/figlio possono portare ad ambiguità nel paradigma di riga e colonna bidimensionale di un foglio di lavoro di Excel.

Per far fronte a questa ambiguità, Excel costringe un formato per tutti i dati XML che riceve, a meno che i dati viene fornito con un foglio di stile che predefinisce un altro formato . Questo formato forzato viene creato utilizzando un algoritmo di livellamento per popola le righe e le colonne che comprendono un foglio di lavoro. Tuttavia, mentre questo formato è efficace nel forzare i dati multidimensionali in un formato bidimensionale , non è sempre presentare i dati nel formato ottimale per un lettore umano.

Quindi, in che modo Excel sa quando utilizzare nell'algoritmo di conversione o nel foglio di stile XSLT ? Quando Excel si apre o importa un file di dati XML, cerca un elemento all'interno del file che punta a un foglio di stile XSLT. Se l'elemento è presente, Excel visualizza una finestra di dialogo che richiede di applicare il foglio di stile o di aprire il file senza un foglio di stile.

3

Se si aggiunge questa istruzione nel foglio xsl:

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

.... excel funzionerà correttamente

+0

Sembra che questo non funzioni. Ho già una riga in .xml con . E quel codice xslt crea solo questa stringa. Prompt "Importa XML" appare comunque :( –