Download EXCEL-Datei aus ASP.NET Seite, ohne dass physische Datei auf dem server (On-The-Fly)

Ich versuche zum exportieren von C# DataTable an EXCEL-Datei on-the-fly (ohne physische Datei erstellen), die mit Microsoft Office EXCEL-INTEROP und laden Sie es über asp.net Webseite über Response-Objekt. Ich bin in der Lage zu erzeugen memorystream mit der Bibliothek, Aber irgendwie wird die Datei nicht gerettet durch den Speicher zu streamen. Referenz-code ist unten angegeben. Sie werden benötigt, um nehmen Bezug für DocumentFormat.OpenXml.dll & WindowsBase.DLL (download von microsoft-Website).

Irgendeine Idee, wie das problem zu beheben ? ? ?

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);
    }
  • Warum es nicht als tab-delimited und dann schickt einfach für den Benutzer? Es öffnet sich in Excel.
  • Nicht wirklich eine Antwort, aber ich kann empfehlen, EPPLus, erstellen von Excel-Dateien on the fly. stackoverflow.com/a/10547727/284240 Dann alles, was Sie brauchen, ist Response.BinaryWrite(pck.GetAsByteArray());
  • Danke für die Anregung. Aber ich will nicht, diesen Weg zu gehen, sonst hätte ich generieren .csv-Datei. Ich möchte die Verwendung von INTEROP-denn in Zukunft möchte ich hinzufügen, Bilder/Grafiken, um das excel-sheet (das auch on-the-fly).
  • Danke für den link, die Bibliothek scheint vielversprechend. 🙂 Aber ich versuche mich zu entwickeln, die die gleiche Art von Bibliothek. Der code, den ich verwende, ist fast der gleiche code, der die Bibliothek geschrieben wurde. Ich brauche die Umsetzung der ExcelDocument.GetAsByteArray () - Methode. (d.h. wie es ist, die Umwandlung von Stream-Objekt zurückgegeben, die von INTEROP, um ByteArray -)
  • Sie können ILSpy reflektieren Sie den code. Aber Bedenken Sie, dass es LGPL. Also warum nicht verwenden es in Erster Linie?
InformationsquelleAutor Sankalp | 2012-05-16
Schreibe einen Kommentar