Ich versuche, C# DataTable in EXCEL-Datei im laufenden Betrieb zu exportieren (ohne Erstellen einer physischen Datei) mit Microsoft Office EXCEL INTEROP und downloaden Sie es durch asp.net Webseite durch Response Objekt. Ich bin in der Lage, Speicherströme mit Hilfe der Bibliothek zu generieren. Aber irgendwie wird die Datei nicht durch den Speicherstrom gespeichert. Referenzcode ist unten angegeben. Sie müssen Referenz für DocumentFormat.OpenXml.dll & WindowsBase.DLL nehmen (die Sie von der Microsoft-Website herunterladen können).Laden EXCEL-Datei von ASP.NET-Seite ohne Erstellen einer physischen Datei auf dem Server (On The Fly)
Irgendeine Idee, wie man das Problem löst? ? ?
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 nicht als tab-getrennte und dann senden Sie das nur an den Benutzer? Es wird in Excel geöffnet. –
Nicht wirklich eine Antwort, aber ich kann [EPPLus] (http://epplus.codeplex.com/releases/view/42439) empfehlen, um Excel-Dateien im laufenden Betrieb zu erstellen. http://stackoverflow.com/a/10547727/284240 Dann alles, was Sie brauchen, ist Response.BinaryWrite (pck.GetAsByteArray()); ' –
@ James: Danke für den Vorschlag. Aber ich möchte nicht so gehen, sonst hätte ich .csv-Datei generieren können. Ich möchte INTEROP verwenden, weil ich zukünftig Bilder/Graphen zum Excel-Blatt hinzufügen möchte (das auch im laufenden Betrieb). – Sankalp