c# - 是什么导致抛出带有消息 "Cannot access ' System.IO.MemoryStream'"的 COMException?

标签 c# excel exception comexception

我正在尝试将DataTable导出到Microsoft Excel 2016,并且我的代码“成功”运行了一次。当它运行时,我尝试打开 Excel 文件,它告诉我文件格式无效(尝试导出到 XLSX)。这完全是另一个问题,但我将其包括在内,以防万一它有任何帮助。

每次尝试导出时,代码都会抛出 COMException 并显示以下消息:

Cannot access 'System.IO.MemoryStream'.

堆栈跟踪显示:

at Microsoft.Office.Interop.Excel._Workbook.SaveAs(Object Filename, Object FileFormat, Object Password, Object WriteResPassword, Object ReadOnlyRecommended, Object CreateBackup, XlSaveAsAccessMode AccessMode, Object ConflictResolution, Object AddToMru, Object TextCodepage, Object TextVisualLayout, Object Local)

at MyNamespace.btnExportToExcel_Click(Object sender, EventArgs e) in C:\...\PageName.aspx.cs:line 279

这两者都对调试进程没有帮助。我遇到过这样的异常:Stream 对象在尝试重新打开它之前尚未关闭,这很容易解决,但这里存在大量与此相关的问题。

我在 using 语句中创建流,即使发生异常,该语句也应自动关闭并处置 Stream。尽管如此,我还尝试手动将 CloseDispose 添加到代码的 finally block 中,但仍然出现异常抛出。

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();
    }
}

我认为重新启动调试 session 也许会起作用,但这也没有解决问题。


什么原因导致抛出带有消息Cannot access 'System.IO.MemoryStream'COMException

最佳答案

这里的API是一个谎言;它是 Excel 功能的包装,而 Excel 是一个可以与文件通信的 COM 服务器。尽管它被描述为采用Stream,但实际上它的限制要大得多。它应该与FileStream一起工作,但是:它不能与MemoryStream一起工作。所以...不要这样做。改为写入临时目录中的文件。

关于c# - 是什么导致抛出带有消息 "Cannot access ' System.IO.MemoryStream'"的 COMException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58878778/

相关文章:

用于屏蔽文本框输入的 C# 十六进制掩码

excel - 如何在 VBA 中将时间作为变量?

python - Python 导演类中的 Swig 异常

service - 将业务验证错误从服务层传递到表示层

javascript - 如何将此 Javascript 函数返回到 HiddenField C# 对象中?

c# - TCP 套接字错误 : Only one usage of each socket address (protocol/network address/port) is normally permitted

c# - 生成指定数量的随机但独特的颜色

c# - 在 Windows 应用程序中导入 Excel 工作表后,DataGridView 显示额外的数字

c# - 无法将 excel 列值复制到另一个 excel 文件中的指定范围

.net - 我应该从哪些类派生自定义 DataAccessLayerException 和 DuplicateEntryException?