2012-05-16 8 views
7

मैं माइक्रोसॉफ्ट ऑफिस एक्सेल इंटरऑप का उपयोग करके फ्लाई (भौतिक फाइल बनाने के बिना) पर EXCEL फ़ाइल में सी # डेटाटेबल निर्यात करने की कोशिश कर रहा हूं और इसे डाउनलोड कर रहा हूं प्रतिक्रिया वस्तु के माध्यम से asp.net वेबपृष्ठ। मैं लाइब्रेरी का उपयोग कर मेमोरीस्ट्रीम उत्पन्न करने में सक्षम हूं लेकिन किसी भी तरह से फाइल मेमोरी स्ट्रीम के माध्यम से सहेजी नहीं जा रही है। संदर्भ कोड नीचे दिया गया है। आपको DocumentFormat.OpenXml.dll & WindowsBase.DLL (जिसे आप माइक्रोसॉफ्ट साइट से डाउनलोड कर सकते हैं) के लिए संदर्भ लेना होगा।सर्वर पर भौतिक फ़ाइल जेनरेट किए बिना एएसपी.नेट पेज से EXCEL फ़ाइल डाउनलोड करें (0 फ्लाई पर)

कोई विचार समस्या को हल करने का तरीका कैसे है? ? ?

Private void DownloadFile() 
{ 
       DataSet objTable = ReadTableFromViewstate(); 
      if (objTable != null && objTable.Rows.Count > 0) 
      { 

       string strDownloadableFilename = "TestExcelFileName.xls"; 
       MemoryStream fs1 = new MemoryStream(); 
       if (CreateExcelFile.CreateExcelDocument(objTable, fs1)) 
       { 
        Response.Clear(); 
         byte[] data1 = new byte[fs1.Length]; 
         fs1.Read(data1, 0, data1.Length); 
         fs1.Close(); 

        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
        Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", strDownloadableFilename)); 
        Response.BinaryWrite(data1); ; 
        Response.End(); 

       } 
       else 
       { 
        LblErrorMessage.Text = "Error Exporting File."; 
       } 
      } 

     } 

..

public static bool CreateExcelDocument(DataSet ds, System.IO.Stream excelFileStream) 
    { 
     try 
     { 
      using (SpreadsheetDocument document = SpreadsheetDocument.Create(excelFileStream, SpreadsheetDocumentType.Workbook)) 
      { 
       CreateParts(ds, document); 
      } 

      Trace.WriteLine("Successfully created: " + excelFileStream); 
      return true; 
     } 
     catch (Exception ex) 
     { 
      Trace.WriteLine("Failed, exception thrown: " + ex.Message); 
      return false; 
     } 
    } 
.. 




private static void CreateParts(DataSet ds, SpreadsheetDocument document) 
     { 
      WorkbookPart workbookPart = document.AddWorkbookPart(); 
      Workbook workbook = new Workbook(); 
      workbookPart.Workbook = workbook; 

      // If we don't add a "WorkbookStylesPart", OLEDB will refuse to connect to this .xlsx file ! 

       WorkbookStylesPart workbookStylesPart = workbookPart.AddNewPart<WorkbookStylesPart>("rIdStyles"); 
      Stylesheet stylesheet = new Stylesheet(); 

      workbookStylesPart.Stylesheet = stylesheet; 

      Sheets sheets = new Sheets(); 

      // Loop through each of the DataTables in our DataSet, and create a new Excel Worksheet for each. 
     uint worksheetNumber = 1; 
     foreach (DataTable dt in ds.Tables) 
     { 
      // For each worksheet you want to create 
      string workSheetID = "rId" + worksheetNumber.ToString(); 
      string worksheetName = dt.TableName; 

      WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>(workSheetID); 
      WriteDataTableToExcelWorksheet(dt, worksheetPart); 

      Sheet sheet = new Sheet() { Name = worksheetName, SheetId = (UInt32Value)worksheetNumber, Id = workSheetID }; 
      sheets.Append(sheet); 

      worksheetNumber++; 
     } 

     workbook.Append(sheets); 
    } 
+0

टैब-डिलीमिट के रूप में ऐसा क्यों नहीं करें और फिर उसे उपयोगकर्ता को भेजें? यह एक्सेल में खुल जाएगा। –

+1

वास्तव में कोई जवाब नहीं है, लेकिन मैं फ्लाई पर एक्सेल फ़ाइलों को बनाने के लिए [EPPLus] (http://epplus.codeplex.com/releases/view/42439) की अनुशंसा कर सकता हूं। http://stackoverflow.com/a/10547727/284240 तो आपको केवल 'Response.BinaryWrite (pck.GetAsByteArray()) की आवश्यकता है; ' –

+0

@ जेम्स: सुझाव के लिए धन्यवाद। लेकिन मैं इस तरह से नहीं जाना चाहता, अन्यथा मैं .csv फ़ाइल उत्पन्न कर सकता था। मैं INTEROP का उपयोग करना चाहता हूं क्योंकि भविष्य में, मैं एक्सेल शीट (वह भी फ्लाई पर) में छवियां/ग्राफ़ जोड़ना चाहता हूं। – Sankalp

उत्तर

3

सभी के लिए धन्यवाद, अंत में मैं अपनी समस्या का समाधान मिल गया। इस लाइन

    byte[] data1 = fs1.ToArray(); 

साथ

    byte[] data1 = new byte[fs1.Length]; 
        fs1.Read(data1, 0, data1.Length); 
        fs1.Close(); 

और मेरी समस्या का समाधान हो गया: मैं बस में निम्न कोड पंक्ति बदल दिया।

1

मेमोरी स्ट्रीम को लिखने के बाद, आपको इसे पढ़ने से पहले पॉइंटर को अपनी उत्पत्ति में वापस सेट करने की आवश्यकता है।

fs1.Seek(0, SeekOrigin.Begin); 
संबंधित मुद्दे