2013-03-14 2 views
1

Я хочу создать файл excel .xls с xls. Я уже понял, как сгенерировать файл. Только при открытии файла в MS Excel я получаю следующие ошибки.Ошибка в MS excel при генерации xls с xslt

Файл поврежден и не может быть открыт.

Это выход;

enterFile: Order_2013.xls 

<?xml version="1.0"?> 
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"><Styles><Style xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" ss:ID="Default" ss:Name="Normal"><Alignment ss:Vertical="Bottom"/><Borders/><Font/><Interior/><NumberFormat/><Protection/></Style><Style xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" ss:ID="s21"><Font ss:Size="22" ss:Bold="1"/></Style><Style xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" ss:ID="s22"><Font ss:Size="14" ss:Bold="1"/></Style><Style xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" ss:ID="s23"><Font ss:Size="12" ss:Bold="1"/></Style><Style xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" ss:ID="s24"><Font ss:Size="10" ss:Bold="1"/></Style></Styles><Worksheet xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" ss:Name="order"><Table><Column ss:AutoFitWidth="0" ss:Width="85"/><Column ss:AutoFitWidth="0" ss:Width="115"/><Column ss:AutoFitWidth="0" ss:Width="115"/><Column ss:AutoFitWidth="0" ss:Width="160"/><Column ss:AutoFitWidth="0" ss:Width="115"/><Column ss:AutoFitWidth="0" ss:Width="85"/><Column ss:AutoFitWidth="0" ss:Width="85"/><Column ss:AutoFitWidth="0" ss:Width="160"/><Row ss:AutoFitHeight="0" ss:Height="27.75"><Cell ss:StyleID="s21"><Data ss:Type="String">Example Spreadsheet</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="18"><Cell ss:StyleID="s22"><Data ss:Type="String">Vuurvlinderronde 15</Data></Cell></Row><Row><Cell><Data ss:Type="String"> 
          test 
          </Data></Cell></Row><Row xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" ss:AutoFitHeight="0" ss:Height="18"><Cell ss:StyleID="s23"><Data ss:Type="String"> 
       Collumn 1 
       </Data></Cell></Row><Row xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel"><Cell ss:StyleID="s24"><Data ss:Type="String"> 
        Collumn 2 
       </Data></Cell><Cell ss:StyleID="s24"><Data ss:Type="String"> 
        Collumn 3 
       </Data></Cell><Cell ss:StyleID="s24"><Data ss:Type="String"> 
        Collumn 4 
       </Data></Cell><Cell ss:StyleID="s24"><Data ss:Type="String"> 
        Collumn 5 
       </Data></Cell></Row></Table></Worksheet></Workbook> code here 

Это XSL таблицы стилей

<?xml version="1.0" encoding="ISO-8859-1"?> 
<?mso-application progid="Excel.Sheet"?> 

<files> 
<file filename="Order_%Y%.xls"> 

<xsl:stylesheet version="1.0" 
xmlns:html="http://www.w3.org/TR/REC-html40" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    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"> 

    <xsl:template match="/"> 

<xsl:for-each select="orders/order"> 

     <Workbook> 
      <Styles> 
       <Style ss:ID="Default" ss:Name="Normal"> 
        <Alignment ss:Vertical="Bottom" /> 
        <Borders /> 
        <Font /> 
        <Interior /> 
        <NumberFormat /> 
        <Protection /> 
       </Style> 
       <Style ss:ID="s21"> 
        <Font ss:Size="22" ss:Bold="1" /> 
       </Style> 
       <Style ss:ID="s22"> 
        <Font ss:Size="14" ss:Bold="1" /> 
       </Style> 
       <Style ss:ID="s23"> 
        <Font ss:Size="12" ss:Bold="1" /> 
       </Style> 
       <Style ss:ID="s24"> 
        <Font ss:Size="10" ss:Bold="1" /> 
       </Style> 
      </Styles> 

      <Worksheet ss:Name="order"> 
       <Table> 
        <Column ss:AutoFitWidth="0" ss:Width="85" /> 
        <Column ss:AutoFitWidth="0" ss:Width="115" /> 
        <Column ss:AutoFitWidth="0" ss:Width="115" /> 
        <Column ss:AutoFitWidth="0" ss:Width="160" /> 
        <Column ss:AutoFitWidth="0" ss:Width="115" /> 
        <Column ss:AutoFitWidth="0" ss:Width="85" /> 
        <Column ss:AutoFitWidth="0" ss:Width="85" /> 
        <Column ss:AutoFitWidth="0" ss:Width="160" /> 

        <Row ss:AutoFitHeight="0" ss:Height="27.75"> 
         <Cell ss:StyleID="s21"> 
          <Data ss:Type="String">Voorbeeld</Data> 
         </Cell> 
        </Row> 
        <Row ss:AutoFitHeight="0" ss:Height="18"> 
         <Cell ss:StyleID="s22"> 
          <Data ss:Type="String"> 
           <xsl:value-of select="shipping/street" /> 
          </Data> 
         </Cell> 
        </Row> 
        <Row> 
         <Cell> 
          <Data ss:Type="String"> 
          test 
          </Data> 
         </Cell> 
        </Row> 

        <xsl:call-template name="orders" /> 


       </Table> 
      </Worksheet> 


     </Workbook> 
</xsl:for-each> 
    </xsl:template> 



    <xsl:template name="orders"> 

     <Row ss:AutoFitHeight="0" ss:Height="18"> 
      <Cell ss:StyleID="s23"> 
       <Data ss:Type="String"> 
       Collumn 1 
       </Data> 
      </Cell> 
     </Row> 
     <Row> 
      <Cell ss:StyleID="s24"> 
       <Data ss:Type="String"> 
        Collumn 2 
       </Data> 
      </Cell> 
      <Cell ss:StyleID="s24"> 
       <Data ss:Type="String"> 
        Collumn 3 
       </Data> 
      </Cell> 
      <Cell ss:StyleID="s24"> 
       <Data ss:Type="String"> 
        Collumn 4 
       </Data> 
      </Cell> 
      <Cell ss:StyleID="s24"> 
       <Data ss:Type="String"> 
        Collumn 5 
       </Data> 
      </Cell> 
     </Row> 

     <xsl:for-each 
      select="orders/order"> 

      <Row> 
       <Cell> 
        <Data ss:Type="String"> 
         <xsl:value-of select="order_id" /> 
        </Data> 
       </Cell> 
       <Cell> 
        <Data ss:Type="String"> 
         <xsl:value-of select="order_id" /> 
        </Data> 
       </Cell> 
       <Cell> 
        <Data ss:Type="String"> 
         <xsl:value-of select="order_id" /> 
        </Data> 
       </Cell> 
       <Cell> 
        <Data ss:Type="String"> 
         <xsl:value-of select="order_id" /> 
        </Data> 
       </Cell> 
      </Row> 

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


</xsl:stylesheet> 

</file> 
</files> 

Я надеюсь, что кто-то может мне точку в правильном решении.

Заранее благодарен!

J

+0

Не могли бы вы показать образец вашего входного XML, который вы используете? Благодаря! –

ответ

1

Excel файлов в формате XML, имеют расширение .xlsx иначе Excel ожидает формат Биф.

+0

Спасибо, но, к сожалению, ошибка все еще там! –

+0

Если вы сохраняете как .xml, Excel 2007 создает файл ошибки при открытии, что может помочь. Когда я смотрю на XML-файл, созданный в Excel, столбцы находятся внутри строк. У вас есть строки внутри столбцов. – grahamj42

0

В вашем образце XSLT, вы приложили XSL: таблицы стилей элемент в файла элемента.

<files> 
    <file filename="Order_%Y%.xls"> 
     <xsl:stylesheet version="1.0" .... 
     <!-- XSLT Code.... --> 
     </xsl:stylesheet> 
    </file> 
</files> 

Может быть, ты не хотел, чтобы поместить их в свой вопрос, но файлы и файл элементы должны определенно не быть там. Я не думаю, что файлы - это действительный Excel XML вообще. Я бы ожидал, что элемент Workbook будет самым большим элементом в XML-файле Excel.

Ваш текущий вывод также включает строку текста enterFile: Order_2013.xls наверху. Опять же, может быть, это просто проблема с вашим вопросом, но ее не должно быть в выходе. Результат должен быть хорошо сформированным XML-документом.

Еще одна вещь, чтобы отметить использование инструкции по обработке

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

Хотя это верно для XML Excel, он не должен быть помещен в файл XSLT. В его нынешнем виде это будет инструкция обработки для XSLT-процессора, которая будет игнорировать его! Вам нужен ваш XSLT, чтобы выписать инструкцию обработки в свой вывод. Чтобы сделать это, добавьте эту команду в первом шаблоне

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

Когда я попробовал XSLT на пустой файл XML, я был в состоянии генерировать XML файл Excel, который открыт успешно.

Смежные вопросы