我正在尝试将a导出DataTable
到Microsoft Excel 2016,并且让我的代码“成功”运行了一次。当它确实运行时,我尝试打开Excel文件,它告诉我文件格式无效(尝试导出到XLSX
)。这完全是另一个问题,但是我也将其包括在内,以防万一它对您有帮助。
在以下每次尝试导出时,代码都将引发COMException
带有以下消息的消息:
无法访问“ System.IO.MemoryStream”。
堆栈跟踪显示:
在Microsoft.Office.Interop.Excel._Workbook.SaveAs(对象文件名,对象文件格式,对象密码,对象WriteResPassword,对象ReadOnlyRecommended,对象CreateBackup,XlSaveAsAccessMode AccessMode,对象冲突解决方案,对象AddToMru,对象TextCodepage,对象TextVisualLayout,对象本地)
在MyNamespace.btnExportToExcel_Click(Object sender,EventArgs e)在C:\ ... \ PageName.aspx.cs:line 279中
两者均无助于调试过程。我遇到过一些例外,即Stream
在尝试重新打开该对象之前没有关闭该对象,这很容易解决,并且这里存在大量的问题。
我正在using
语句中创建流,Stream
即使发生异常,该流也应自动关闭并处理。尽管如此,我还尝试将aClose
和手动添加Dispose
到finally
代码块中,但仍然会引发异常。
using (MemoryStream fs = new MemoryStream()) {
try {
Excel.Application xlApp = new Excel.Application();
Excel.Workbook xlWorkBook = xlApp.Workbooks.Add(Missing.Value);
var xlSheets = xlWorkBook.Sheets as Excel.Sheets;
var xlNewSheet = (Excel.Worksheet)xlSheets.Add(xlSheets[1], Type.Missing, Type.Missing, Type.Missing);
xlNewSheet.Name = "newsheet";
System.Data.DataTable dt = (System.Data.DataTable)excelGrid.DataSource;
for (int x = 0; x < dt.Rows.Count; x++)
for (int y = 0; y < dt.Columns.Count; y++)
xlNewSheet.Cells[x + 1, y + 1] = dt.Rows[x][y];
xlWorkBook.SaveAs((Stream)fs); // Exception is thrown here.
fs.Position = 0;
string myName = Server.UrlEncode(SearchTitle + ".xlsx");
Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment; filename=" + myName);
Response.ContentType = "application/vnd.ms-excel";
Response.BinaryWrite(fs.ToArray());
Response.End();
xlWorkBook.Close(true, Missing.Value, Missing.Value);
xlApp.Quit();
} catch (ThreadAbortException) {
// This exception is throw from Response.End by design. Gracefully ignore it.
} catch (Exception ex) {
// Log exception.
throw ex;
} finally {
fs.Close();
fs.Dispose();
}
}
我认为也许重新启动调试会话会起作用,但这也无法解决。
是什么导致COMException
该消息Cannot access 'System.IO.MemoryStream'
被抛出?
这里的API是一个谎言;它是Excel可以执行的操作的包装,并且Excel是可以与文件进行通讯的COM服务器。尽管它被描述为带有Stream
,但实际上它受到的限制更大。它应该可以使用FileStream
,但是:它不能使用MemoryStream
。所以...别那样 改为写入temp目录中的文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句