Télécharger fichier EXCEL à partir de ASP.NET page sans Générer de fichier physique sur le serveur (À La Volée)

Je suis en train d'exportation C# DataTable fichier EXCEL à la volée (sans créer de fichier physique) à l'aide de Microsoft Office EXCEL INTEROP et le télécharger via asp.net page web par le biais de Réponse de l'objet. Je suis en mesure de générer memorystream à l'aide de la bibliothèque, Mais de toute façon le fichier n'est pas enregistré par le flux de mémoire. Code de référence est donnée ci-dessous. Il vous sera demandé de prendre de référence pour DocumentFormat.OpenXml.dll & WindowsBase.DLL (que vous pouvez télécharger sur le site de microsoft).

Une Idée de comment résoudre le problème ? ? ?

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);
}
Pourquoi ne pas faire des tabulations et puis il suffit de l'envoyer à l'utilisateur? Il va ouvrir dans Excel.
Pas vraiment une réponse, mais je peux recommander EPPLus pour créer des fichiers Excel à la volée. stackoverflow.com/a/10547727/284240 Ensuite, tous vous avez besoin est Response.BinaryWrite(pck.GetAsByteArray());
Merci pour la suggestion. Mais je ne veux pas y aller, sinon j'aurais pu générer .fichier csv. Je veux utiliser INTEROP parce que dans l'avenir, je veux ajouter des Images ou Graphiques de la feuille excel (à la volée).
Merci pour le lien, la bibliothèque semble prometteuse. 🙂 Mais je suis en train de développer le même type de bibliothèque. Le code que j'utilise est presque le même code que la bibliothèque a été écrit. J'ai besoin de la mise en œuvre de ExcelDocument.GetAsByteArray() La Méthode. (c'est à dire comment il est la conversion de Flux de l'objet renvoyé par INTEROP à ByteArray)
Vous pouvez utiliser ILSpy afin de refléter le code. Mais gardez à l'esprit que c'est LGPL. Alors pourquoi ne pas l'utiliser en premier lieu?

OriginalL'auteur Sankalp | 2012-05-16