2012-03-07 5 views
13

विफल हो रहा है जब मैं Excel फ़ाइल EPPlus का उपयोग कर जनरेट करने का प्रयास के साथ फाइल, एक्सेल मुझे निम्न त्रुटि संदेश दे:जनरेट कर रहा है एक एक्सेल EPPlus

Excel फ़ाइल 'myfilename.xlsx' नहीं खोल सकता क्योंकि फ़ाइल स्वरूप या फ़ाइल एक्सटेंशन वैध नहीं है। सत्यापित करें कि फ़ाइल दूषित नहीं हुई है और फ़ाइल एक्सटेंशन फ़ाइल के प्रारूप से मेल खाता है।

public ActionResult Index() 
{ 
    using (ExcelPackage package = new ExcelPackage()) 
    { 
     // I populate the worksheet here. I'm 90% sure this is fine 
     // because the stream file size changes based on what I pass to it. 

     var stream = new MemoryStream(); 
     package.SaveAs(stream); 

     string fileName = "myfilename.xlsx"; 
     string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 

     var cd = new System.Net.Mime.ContentDisposition 
     { 
      Inline = false, 
      FileName = fileName 
     }; 
     Response.AppendHeader("Content-Disposition", cd.ToString()); 
     return File(stream, contentType, fileName); 
    } 
} 

किसी भी विचार मैं गलत क्या कर रही हूं:

यहाँ मेरी कोड है?

+0

त्रुटि का कहना है 'myfilename.xslx' जबकि आपका कोड 'myfilename.xlsx' दिखाता है। आप वास्तव में किसका उपयोग कर रहे हैं? –

+0

उत्तर [कल] (http://stackoverflow.com/a/9574414/284240)। मुझे लगता है कि यह एक ही मुद्दा है। –

+0

@ एम। बाबाकॉक - एक्सएलएसएक्स, यह एक टाइपो था। मैं सवाल संपादित करूंगा। –

उत्तर

27

तुम सब करने की ज़रूरत धारा स्थिति रीसेट है:

एक तरीका यह है कि काम करता है निम्नलिखित है। stream.Position = 0;

आप सीधे प्रतिक्रिया पर नहीं लिखना चाहिए, यह एमवीसी तरीका नहीं है। यह सही एमवीसी पाइपलाइन का पालन नहीं करता है और यह प्रतिक्रिया ऑब्जेक्ट पर आपके कंट्रोलर एक्शन कोड को कसकर जोड़ता है।

जब आप File() में 3 पैरामीटर के रूप में एक फ़ाइल नाम जोड़ने के लिए, MVC स्वचालित रूप से सही Content-Disposition हैडर कहते हैं ... तो आप इसे मैन्युअल रूप से जोड़ने की जरूरत नहीं होनी चाहिए।

यह है की कमी, आप यही चाहते है:

public ActionResult Index() 
{ 
    using (ExcelPackage package = new ExcelPackage()) 
    { 
     // I populate the worksheet here. I'm 90% sure this is fine 
     // because the stream file size changes based on what I pass to it. 

     var stream = new MemoryStream(); 
     package.SaveAs(stream); 

     string fileName = "myfilename.xlsx"; 
     string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 

     stream.Position = 0; 
     return File(stream, contentType, fileName); 
    } 
} 
+0

तो इस बारे में सवाल, मैं एक समान विधि का उपयोग कर रहा हूं हालांकि मैं वर्तमान में फ़ाइल ऑब्जेक्ट की बजाय फ़ाइलस्ट्रीम रीस्पॉन्स लौट रहा हूं।जिस समस्या में मैं चल रहा हूं वह यह है कि यदि उपयोगकर्ता पहली फ़ाइल बनाने के दौरान एक से अधिक अनुरोध करता है, तो वे सभी लॉक हो जाते हैं और सेवस विधि कभी पूर्ण नहीं होती है। क्या आपने ईपीप्लस के साथ इसमें भाग लिया है? – Shawn

10

आपका कोड stream को HttpResponse पर लिखा नहीं जा रहा है - संभवतः File विधि में किया जा रहा है जिसे आपने पोस्ट नहीं किया है।

Response.Clear(); 
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
Response.AddHeader(
      "content-disposition", String.Format(CultureInfo.InvariantCulture, "attachment; filename={0}", fileName)); 
Response.BinaryWrite(package.GetAsByteArray()); 
Response.End(); 
+0

'फ़ाइल' विधि' एएसपी.नेट एमवीसी 'का हिस्सा है। मैं इस तरह से कोशिश करूंगा! –

+0

अजीब, अब यह कहता है "एक्सेल को myfilename.xlsx 'में अपठनीय सामग्री मिली। क्या आप इस कार्यपुस्तिका की सामग्री को पुनर्प्राप्त करना चाहते हैं? अगर आप इस कार्यपुस्तिका के स्रोत पर भरोसा करते हैं, तो हाँ पर क्लिक करें।" अगर मैं हां पर क्लिक करता हूं, तो ऐसा लगता है, लेकिन मुझे नहीं पता कि यह त्रुटि क्या दे रही है। –

+0

मैंने पहले उस त्रुटि संदेश को देखा है, आईआईआरसी तब हुआ जब Response.Clear() छोड़ा गया था। एक और संभावना यह है कि एक ईपीप्लस बग फ़ाइल में अमान्य डेटा में परिणाम देता है। आप सर्वर पर फ़ाइल को सहेजकर यह जांच सकते हैं कि यह सर्वर पर खोलते समय आपको एक ही त्रुटि मिलती है या नहीं। – Joe

2

जो जवाब देने के लिए इसी प्रकार, मैं अभी भी Response.ClearHeaders() कॉल करने के लिए किया था:

protected void btnDownload_Click(object sender, EventArgs e) 
    { 

     ExcelPackage pck = new ExcelPackage(); 
     var ws = pck.Workbook.Worksheets.Add("Sample2"); 

     ws.Cells["A1"].Value = "Sample 2"; 
     ws.Cells["A1"].Style.Font.Bold = true; 
     var shape = ws.Drawings.AddShape("Shape1", eShapeStyle.Rect); 
     shape.SetPosition(50, 200); 
     shape.SetSize(200, 100); 
     shape.Text = "Sample 2 outputs the sheet using the Response.BinaryWrite method"; 
     Response.Clear();  
     Response.ClearHeaders(); 
     Response.BinaryWrite(pck.GetAsByteArray()); 
     Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
     Response.AddHeader("content-disposition", "attachment; filename=Sample2.xlsx"); 
     Response.End(); 
    }