C# 如何将Excel文件下载到用户';下载文件夹?

C# 如何将Excel文件下载到用户';下载文件夹?,c#,asp.net,excel,telerik,office-interop,C#,Asp.net,Excel,Telerik,Office Interop,在C#,asp.net 4.0项目中,我使用Microsoft.Office.Interop.Excel创建了一个Excel文件。正确创建文件并将其放置在服务器上的文件夹中。但是,我一直无法想出一种向客户端显示文件的方法。有人能帮我吗 一些背景信息:我正在尝试解决Microsoft更改阻止Excel文件打开的问题。我们的web应用程序使用Telerik网格,该网格使用ExportToExcel函数导出为Excel文件。文件下载(转到用户的下载文件),但当用户试图打开它时,会得到一个空白的Exce

在C#,asp.net 4.0项目中,我使用Microsoft.Office.Interop.Excel创建了一个Excel文件。正确创建文件并将其放置在服务器上的文件夹中。但是,我一直无法想出一种向客户端显示文件的方法。有人能帮我吗

一些背景信息:我正在尝试解决Microsoft更改阻止Excel文件打开的问题。我们的web应用程序使用Telerik网格,该网格使用ExportToExcel函数导出为Excel文件。文件下载(转到用户的下载文件),但当用户试图打开它时,会得到一个空白的Excel应用程序。有一些解决方法,例如卸载导致此问题的修补程序、关闭Excel安全选项以及单击文件属性中的“取消阻止”;然而,我们的客户不想做这些事情。所以我正在重写40多个网格的导出

我从radGrid中获取数据到datatable,并使用以下代码将其写入Excel:

            Microsoft.Office.Interop.Excel.Application m_objExcel = null;
            Microsoft.Office.Interop.Excel.Workbooks m_objBooks = null;
            Microsoft.Office.Interop.Excel._Workbook m_objBook = null;
            Microsoft.Office.Interop.Excel.Sheets m_objSheets = null;
            Microsoft.Office.Interop.Excel._Worksheet m_objSheet = null;
            object m_objOpt = System.Reflection.Missing.Value;

            m_objExcel = new Microsoft.Office.Interop.Excel.Application();
            m_objBooks = (Microsoft.Office.Interop.Excel.Workbooks)m_objExcel.Workbooks;
            m_objBook = (Microsoft.Office.Interop.Excel._Workbook)(m_objBooks.Add(m_objOpt));

            m_objSheets = (Microsoft.Office.Interop.Excel.Sheets)m_objBook.Worksheets;
            m_objSheet = (Microsoft.Office.Interop.Excel._Worksheet)(m_objSheets.get_Item(1));

            int colcount = 1;
            foreach (DataColumn col in dt.Columns)
            {
                m_objSheet.Cells[1, colcount] = col.ColumnName;
                colcount++;
            }

            int rowcount = 2;
            foreach (DataRow row in dt.Rows)
            {
                for (int i = 1; i < dt.Columns.Count; i++)
                {
                    m_objSheet.Cells[rowcount, i] = row[i - 1].ToString();
                }
                rowcount++;
            }

            string currentDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");

            m_objBook.SaveAs("C:\\Temp\\MD" + currentDateTime + ".xlsx");
            m_objBook.Close();

            m_objExcel.DisplayAlerts = false;
            m_objExcel.Quit();
我还尝试了下面的代码来打开Excel文件。该文件是在服务器上创建的,但从未打开。当我试图在服务器上打开文件时,Excel崩溃。我怀疑这是因为我的开发机器上有Excel 2013,而服务器上有Excel 2007。这引发了另一个问题,因为我不能保证最终的生产服务器上会有什么版本的Excel。如有任何建议,将不胜感激

            var excelApp = new Microsoft.Office.Interop.Excel.Application();
            excelApp.Visible = true;
            excelApp.Workbooks.Open("C:\\Temp\\MD" + currentDateTime + ".xlsx");
            m_objExcel.Quit();

首先要检查的是Excel进程是否仍在服务器上运行。由于多种原因,Microsoft强烈建议不要在生产服务器环境中使用Microsoft互操作组件。他们从来就不是为了这个目的。这是我(很快)能找到的最新文章:

Microsoft目前不建议也不支持从任何无人参与、非交互式客户端应用程序或组件(包括ASP、ASP.NET、DCOM和NT服务)自动化Microsoft Office应用程序,因为在该环境中运行Office时,Office可能会表现出不稳定的行为和/或死锁

由于客户的要求,我多次尝试过这种方法,结果都出现了问题。其中最大的一个问题是Excel互操作组件有一个非常讨厌的习惯,即不终止Excel进程,这意味着当您尝试打开文件并将其发送给客户端时,Excel可能仍会打开您的文件。一种解决方法是(字面上)编写代码,枚举计算机上正在运行的进程并关闭Excel的任何实例,但这样做当然会有关闭正在执行实际工作的实例的风险

有许多价格合理的组件,工作更可靠,只需很少的努力就可以实现

编辑-如果必须使用互操作并强制Excel关闭


有很多不同的机制来实现这一点。根据您的具体操作,您可能需要尝试多条路线。释放COM对象对我来说似乎是最干净的。

首先要检查的是Excel进程是否仍在服务器上运行。由于多种原因,Microsoft强烈建议不要在生产服务器环境中使用Microsoft互操作组件。他们从来就不是为了这个目的。这是我(很快)能找到的最新文章:

Microsoft目前不建议也不支持从任何无人参与、非交互式客户端应用程序或组件(包括ASP、ASP.NET、DCOM和NT服务)自动化Microsoft Office应用程序,因为在该环境中运行Office时,Office可能会表现出不稳定的行为和/或死锁

由于客户的要求,我多次尝试过这种方法,结果都出现了问题。其中最大的一个问题是Excel互操作组件有一个非常讨厌的习惯,即不终止Excel进程,这意味着当您尝试打开文件并将其发送给客户端时,Excel可能仍会打开您的文件。一种解决方法是(字面上)编写代码,枚举计算机上正在运行的进程并关闭Excel的任何实例,但这样做当然会有关闭正在执行实际工作的实例的风险

有许多价格合理的组件,工作更可靠,只需很少的努力就可以实现

编辑-如果必须使用互操作并强制Excel关闭


有很多不同的机制来实现这一点。根据您的具体操作,您可能需要尝试多条路线。释放COM对象对我来说似乎是最干净的。

只是跟进DVKs答案,我在使用Excel互操作工具时遇到了问题,但是如果您不需要生成较旧的.XLS文件并且可以使用.XLSX文件,我建议使用OpenXML SDK(免费)。网上有许多使用它制作Excel工作簿的例子。这里有一个:


在DVKs回答之后,我在使用Excel互操作工具时遇到了问题,但是如果您不需要生成较旧的.XLS文件并且可以使用.XLSX文件,我建议使用OpenXML SDK(免费)。网上有许多使用它制作Excel工作簿的例子。这里有一个:


谢谢您的回复。如何检查服务器上是否正在运行Excel进程?我们通常不会以这种方式处理Excel文件,但由于Microsoft所做的更改,我们的旧方法不起作用,我被告知要尽快找到解决方案。我担心我的老板不会购买任何软件,但谢谢你的推荐。@boilers222添加了一个链接,指向确保关闭Excel的一些不同技术。@DVK FWIW,请参阅checked.by.safabyte.net,其中显示Component Pro可能代表了s的最新版本
            var excelApp = new Microsoft.Office.Interop.Excel.Application();
            excelApp.Visible = true;
            excelApp.Workbooks.Open("C:\\Temp\\MD" + currentDateTime + ".xlsx");
            m_objExcel.Quit();