c# एक्सेल 2007 में खोलते समय एक्सेल स्प्रेडशीट पीढ़ी के परिणाम "एक्सटेंशन त्रुटि से अलग फ़ाइल प्रारूप" में परिणाम




excel webforms (5)

स्प्रेडशीट अभी भी प्रदर्शित होती है, लेकिन चेतावनी संदेश के साथ। समस्या तब होती है क्योंकि एक्सेल 2007 Excel के पुराने संस्करणों की तुलना में उनके एक्सटेंशन से मेल खाने वाले प्रारूपों के बारे में अधिक पसंद है।

समस्या को शुरुआत में एएसपी.Net प्रोग्राम द्वारा खोजा गया था और एक्सेल त्रुटि में उत्पन्न होता है "जिस फ़ाइल को आप खोलने की कोशिश कर रहे हैं," Spreadsheet.aspx-18.xls ', फ़ाइल एक्सटेंशन द्वारा निर्दिष्ट एक अलग प्रारूप में है। सत्यापित करें ... "। हालांकि, जब मैं फ़ाइल खोलता हूं तो यह ठीक दिखता है। मैं Excel 2007 का उपयोग कर रहा हूं। फ़ायरफ़ॉक्स फ़ाइल को Excel 97-2003 वर्कशीट के रूप में पहचानता है।

यहां एक एएसपी.नेट पृष्ठ है जो समस्या उत्पन्न करता है:

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

फ़ाइल के पीछे कोड इस तरह दिखता है:

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"); 

    } 

}

टी


मैंने इस सवाल को कई बार पूछा है। मैं आज भी एक ही कठिनाई में भाग गया इसलिए मैंने एनपीओआई 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();
    }
}

यह आपको उपयोगी लगने की आशा है।


मैं कुछ दिनों के दौरान इस मुद्दे को हल करने की कोशिश कर रहा था। अंत में, मुझे यहां समाधान मिला है: 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

नेमस्पेस:

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

कोड:

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();
        }
    }

उपयोग

सामग्री प्रकार = आवेदन / vnd.openxmlformats-officedocument.spreadsheetml.sheet

और xlsx के रूप में एक्सटेंशन निर्दिष्ट करें


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

यह मूल रूप से वर्णन करने वाला एक लिंक है कि एमएस आपके वर्णन की समस्या के बारे में जानता है और इसे एएसपी.NET कोड से दबाया नहीं जा सकता है। इसे ग्राहक की रजिस्ट्री पर दबाया / ठीक किया जाना चाहिए।


यदि आप मेरे जैसे हैं और एक्सेल शीट को 2003 एक्सएमएल दस्तावेज़ के रूप में उत्पन्न करते हैं, तो आप निम्न कार्य करके चेतावनियां हटा सकते हैं:

एक्सएमएल आउटपुट में जोड़ा गया:

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

डाउनलोड पेज में जोड़ा गया:

// 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");

अब एक्सेल 2007 एक चेतावनी प्रदर्शित नहीं करेगा कि फ़ाइल सामग्री और फ़ाइल एक्सटेंशन मेल नहीं खाता है।