如何将Excel文件下载到用户的下载文件夹?

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

一些背景:我正在尝试解决阻止Excel文件打开的Microsoft更改。 我们的Web应用程序使用Telerik网格,并使用ExportToExcel函数将该网格导出到Excel文件。 文件下载(进入用户的下载文件),但是当用户试图打开它,他们得到一个空白的Excel应用程序。 有解决方法,如卸载创build此问题的修补程序,closuresExcel安全选项,并单击文件属性中的解除阻止; 但是,我们的客户不想做任何这些。 所以我重写了40多个网格的出口。

我从radGrid中获取数据到数据表,并使用以下代码将其写入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(); 

我试图让用户下载文件时出现问题。 我试了下面的代码,但是我得到一个错误,说“进程无法访问文件'C:\ Temp \ MD20160802161458.xlsx',因为它正在被另一个进程使用。 任何人都可以解释如何在通过Excel创build文件之后取消阻止该文件,或者向我展示另一种将文件下载到用户的方式?

  string fileName = "C:\\Temp\\MD" + currentDateTime + ".xlsx", myStringWebResource = null; WebClient myWebClient = new WebClient(); myStringWebResource = fileName; myWebClient.DownloadFile(myStringWebResource, fileName); 

我也试过下面的代码打开Excel文件。 该文件在服务器上创build,但从不打开。 当我尝试打开服务器上的文件时,Excel崩溃。 我怀疑这是因为我在开发计算机上安装了Excel 2013,Excel 2007在服务器上。 这引发了另一个问题,因为我不能保证在最终的生产服务器上有什么版本的Excel。 任何build议,将不胜感激。

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

只是跟随DVK的答案,我没有任何东西,但使用Excel互操作的东西,但如果你不需要生成旧的.XLS文件,并与.XLSX文件罚款,我build议使用OpenXML SDK(免费)。 使用它可以在线生成Excel工作簿。 这里是一个:

http://www.codeproject.com/Articles/670141/Read-and-Write-Microsoft-Excel-with-Open-XML-SDK

首先要检查的是Excel进程是否仍在服务器上运行。 Microsoft强烈build议不要在生产服务器环境中使用Microsoft Interop组件,原因很多。 他们从来没有为此目的。 这是我可以(很快)发现的最新文章:

https://support.microsoft.com/en-us/kb/257757

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

我已经多次试过这条路线(由于客户的要求),都导致了问题。 其中最大的问题是,Excel互操作组件有一个非常讨厌的不终止Excel进程的习惯,这意味着当您尝试打开并将其发送到客户端时,Excel可能仍会打开文件。 解决方法是(逐字地)编写枚举机器上正在运行的进程并closures任何Excel实例的代码,但是当然,您正在冒着closures正在执行实际工作的实例的风险。

有许多可负担得起的组件可以更加可靠地工作(比如ComponentPro–与他们没有联系,但我已经多次使用他们的组件),并且可以用很less的努力来实现。

编辑 – 如果您必须使用interop并强制Excelclosures

这个StackOverflow文章有很多不同的机制。 根据你在做什么,你可能不得不尝试多个路线。 释放COM对象似乎是最清洁的。