2009-03-16 13 views
29

Il foglio di calcolo viene comunque visualizzato, ma con il messaggio di avviso. Il problema sembra verificarsi perché Excel 2007 è più schizzinoso sui formati che corrispondono alle estensioni rispetto alle versioni precedenti di Excel.La generazione di fogli di calcolo Excel genera "formato di file diverso dall'errore di estensione" all'apertura in Excel 2007

Il problema è stato inizialmente rilevato da un programma ASP.Net e genera nell'errore di Excel "Il file che si sta tentando di aprire", Spreadsheet.aspx-18.xls, è in un formato diverso da quello specificato dal file estensione. Verifica ... ". Tuttavia, quando apro il file viene visualizzato correttamente. Sto utilizzando Excel 2007. Firefox identifica il file come foglio di lavoro Excel 97-2003.

Ecco una pagina ASP.NET che genera il file problema:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Spreadsheet.aspx.cs" Inherits="Spreadsheet" %> 

Il codice al file assomiglia:

public partial class Spreadsheet : System.Web.UI.Page { 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Response.ContentType = "application/vnd.ms-excel"; 
     Response.Clear(); 
     Response.Write("Field\tValue\tCount\n"); 

     Response.Write("Coin\tPenny\t443\n"); 
     Response.Write("Coin\tNickel\t99\n"); 

    } 

}

T

+0

Si prega di fare riferimento a http://support.microsoft.com/kb/948615 –

risposta

28

http://blogs.msdn.com/vsofficedeveloper/pages/Excel-2007-Extension-Warning.aspx

che è un link in fondo descrivendo che la SM conosce il problema che descrivi e che non può essere soppresso dal codice ASP.NET. Deve essere soppresso/corretto sul registro del client.

+0

Ho riscontrato questo, questo è il problema. – brendan

+3

L'articolo fornisce anche un'altra correzione, che non comporta la modifica del registro. Ho aggiunto la riga: Response.AddHeader ("Content-Disposition", "Attachment; Filename = Spreadsheet.csv"); e quindi generato un file separato da virgole. Avrei potuto usare le schede con un file .txt. –

+2

In seguito a Jeff Bloom, vedere la mia risposta qui sotto se il risultato è Excel come xml –

0

Sono più interessato all'utilizzo di una griglia e alla modifica del tipo di risposta. Devo ancora avere un problema con questa metodologia. Non ho usato file delimitati da tabulazioni rette. Una possibilità è che \ n potrebbe essere \ r \ n. Solo un colpo cieco.

-2

Usa

content-type = application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

E specificare estensione come XLSX

18

Se siete come me e la generazione del foglio di Excel come documento XML 2003, è possibile rimuovere le avvertenze nel modo seguente:

aggiunto all'uscita XML:

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

aggiunto alla pagina di download:

// Properly outputs the xml file 
response.ContentType = "text/xml"; 

// This header forces the file to download to disk 
response.AddHeader("content-disposition", "attachment; filename=foobar.xml"); 

Ora Excel 2007 non visualizzerà una guardia che il contenuto del file e l'estensione del file non corrispondono.

+3

Ciò significa che il file non si apre automaticamente con Excel. Se hai una versione di excel> 2003 la riga '' Lo faciliterà. Se non funziona, potrebbe dipendere da associazioni di file o da un'impostazione di Excel. – gb2d

+2

@BombDefused Si dovrebbe aprire automaticamente con Excel. –

2

Ho visto questa domanda molte volte. Ho incontrato la stessa difficoltà oggi così ho risolto il problema utilizzando NPOI npoi.codeplex.com/

public static class ExcelExtensions 
{ 
    /// <summary> 
    /// Creates an Excel document from any IEnumerable returns a memory stream 
    /// </summary> 
    /// <param name="rows">IEnumerable that will be converted into an Excel worksheet</param> 
    /// <param name="sheetName">Name of the Ecel Sheet</param> 
    /// <returns></returns> 
    public static FileStreamResult ToExcel(this IEnumerable<object> rows, string sheetName) 
    { 
     // Create a new workbook and a sheet named by the sheetName variable 
     var workbook = new HSSFWorkbook(); 
     var sheet = workbook.CreateSheet(sheetName); 

     //these indexes will be used to track to coordinates of data in our IEnumerable 
     var rowIndex = 0; 
     var cellIndex = 0; 

     var excelRow = sheet.CreateRow(rowIndex); 

     //Get a collection of names for the header by grabbing the name field of the display attribute 
     var headerRow = from p in rows.First().GetType().GetProperties() 
         select rows.First().GetAttributeFrom<DisplayAttribute>(p.Name).Name; 


     //Add headers to the file 
     foreach (string header in headerRow) 
     { 
      excelRow.CreateCell(cellIndex).SetCellValue(header); 
      cellIndex++; 
     } 

     //reset the cells and go to the next row 
     cellIndex = 0; 
     rowIndex++; 

     //Inset the data row 
     foreach (var contentRow in rows) 
     { 
      excelRow = sheet.CreateRow(rowIndex); 

      var Properties = rows.First().GetType().GetProperties(); 

      //Go through each property and inset it into a single cell 
      foreach (var property in Properties) 
      { 
       var cell = excelRow.CreateCell(cellIndex); 
       var value = property.GetValue(contentRow); 

       if (value != null) 
       { 
        var dataType = value.GetType(); 

        //Set the type of excel cell for different data types 
        if (dataType == typeof(int) || 
         dataType == typeof(double) || 
         dataType == typeof(decimal) || 
         dataType == typeof(float) || 
         dataType == typeof(long)) 
        { 
         cell.SetCellType(CellType.NUMERIC); 
         cell.SetCellValue(Convert.ToDouble(value)); 
        } 
        if (dataType == typeof(bool)) 
        { 
         cell.SetCellType(CellType.BOOLEAN); 
         cell.SetCellValue(Convert.ToDouble(value)); 
        } 
        else 
        { 
         cell.SetCellValue(value.ToString()); 
        } 
       } 
       cellIndex++; 
      } 

      cellIndex = 0; 
      rowIndex++; 
     } 

     //Set the width of the columns 
     foreach (string header in headerRow) 
     { 
      sheet.AutoSizeColumn(cellIndex); 
      cellIndex++; 
     } 


     return workbook.GetDownload(sheetName); 
    } 

    /// <summary> 
    /// Converts the NPOI workbook into a byte array for download 
    /// </summary> 
    /// <param name="file"></param> 
    /// <param name="fileName"></param> 
    /// <returns></returns> 
    public static FileStreamResult GetDownload(this NPOI.HSSF.UserModel.HSSFWorkbook file, string fileName) 
    { 
     MemoryStream ms = new MemoryStream(); 

     file.Write(ms); //.Save() adds the <xml /> header tag! 
     ms.Seek(0, SeekOrigin.Begin); 

     var r = new FileStreamResult(ms, "application/vnd.ms-excel"); 
     r.FileDownloadName = String.Format("{0}.xls", fileName.Replace(" ", "")); 

     return r; 
    } 

    /// <summary> 
    /// Get's an attribute from any given property 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    /// <param name="instance"></param> 
    /// <param name="propertyName"></param> 
    /// <returns></returns> 
    public static T GetAttributeFrom<T>(this object instance, string propertyName) where T : Attribute 
    { 
     var attrType = typeof(T); 
     var property = instance.GetType().GetProperty(propertyName); 
     return (T)property.GetCustomAttributes(attrType, false).First(); 
    } 
} 

Spero è risultato utile.

1

Stavo cercando di risolvere questo problema durante alcuni giorni.Infine, ho trovato la soluzione qui: http://www.aspsnippets.com/Articles/Solution-ASPNet-GridView-Export-to-Excel-The-file-you-are-trying-to-open-is-in-a-different-format-than-specified-by-the-file-extension.aspx

Namespace:

using System.IO; 
using System.Data; 
using ClosedXML.Excel; 

Codice:

DataTable dt = new DataTable("GridView_Data"); 
// Fill your DataTable here... 

//Export: 
    using (XLWorkbook wb = new XLWorkbook()) 
    { 
     wb.Worksheets.Add(dt); 

     Response.Clear(); 
     Response.Buffer = true; 
     Response.Charset = ""; 
     Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
     Response.AddHeader("content-disposition", "attachment;filename=GridView.xlsx"); 
     using (MemoryStream MyMemoryStream = new MemoryStream()) 
     { 
      wb.SaveAs(MyMemoryStream); 
      MyMemoryStream.WriteTo(Response.OutputStream); 
      Response.Flush(); 
      Response.End(); 
     } 
    } 
Problemi correlati