在ASP.NET中保存Excel文档

问题:

我在ASP.NET应用程序中使用Microsoft.Office.Interop.Excel库,并在工作簿中填充了工作表。 我希望提示用户将文档保存到他们的机器,但我找不到一个方法来执行它( myWorkbook.SaveAs(...)不起作用)。

题:

如何将工作簿保存到用户的机器? 我已经使用Response.Write(...)提示用户保存基于文本的文件(CSV)之前,但我不知道如何为.xls文件做到这一点。

奖金:

如果这是不可能使用Microsoft.Office.Interop.Excel库,是否有一个我可以使用的免费(较小的GPL-ish)库?

我会假设微软将有一个工具,但我们都知道什么假设…

就像@Jason Meckley所说的,为了使用interop在服务器上创buildExcel文件,需要在机器上安装Office。 解决方法是使用Open XML:

从MSDN页面 :

为Microsoft Office打开XML SDK 2.0

这个SDK是Open XML SDK 1.0的超集。 除了Open XML SDK 1.0提供的function之外,它还利用了.NET语言集成查询(LINQ),并提供了构build和查询包内部件内容的类。 您可以使用函数式构造来编写文档,使用LINQ查询来从文档中提取信息。

以下是一些我觉得有用的“入门”教程:

使用SDK 2.0和.NET格式化的Excel

OpenXML SDK 2.0:将DataTable导出到Excel

如果您引用了excel interops,那么您将需要在服务器上安装excel来创buildexcel文件。

你不能直接提示用户保存excel文件。 该文件在服务器上生成。 您需要将文件保存在服务器上,然后将文件加载到内存中,删除文件并将内存stream发送到客户端。 客户端可以select保存文件。

相反,我会使用第三方库,可以生成excel文件没有excel。 通常他们会生成一个xml-excel文档。 工作原理相同,只需创build文件而不是二进制文件。

多年来,我一直使用http://www.carlosag.net/tools/excelxmlwriter/取得巨大成功。 我相信还有其他的select。 同样的规则适用于这种方法。 构build工作簿。 然后保存到一个stream(不是文件),并将stream发送到客户端。 客户端可以select如何处理文件。

尝试这个…

 loConectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pFullFilePath + ";Extended Properties=\"Excel 12.0;HDR=No;IMEX=2\""; fillSourceFromExcel(loConectionString); private DataTable _loDtArchivoOrigen = null; private void fillSourceFromExcel(string pConectionString) { var loColumnasSelect = new StringBuilder(); using (OleDbConnection oleDbConnection = new OleDbConnection(pConectionString)) { if (oleDbConnection.State == ConnectionState.Closed) oleDbConnection.Open(); DataTable dbSchema = oleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables_Info, null); DataTable dbColumns = oleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, dbSchema.Rows[0]["TABLE_NAME"], null }); foreach (DataRow loRow in dbColumns.Rows) { loColumnasSelect.Append(" " + loRow["COLUMN_NAME"].ToString() + " as " + loRow["COLUMN_NAME"].ToString().Replace("F", "a") + ","); } using (OleDbCommand oleDbCommand = new OleDbCommand()) { oleDbCommand.Connection = oleDbConnection; oleDbCommand.CommandText = string.Format( "SELECT " + loColumnasSelect.Remove(loColumnasSelect.Length - 1, 1) + " FROM [{0}]", dbSchema.Rows[0]["TABLE_NAME"].ToString()); using (OleDbDataAdapter oleDbDataAdapter = new OleDbDataAdapter()) { oleDbDataAdapter.SelectCommand = oleDbCommand; oleDbDataAdapter.Fill(_loDtArchivoOrigen); } } oleDbConnection.Close(); } } 

我喜欢在这种情况下使用EPPlus。 它使用简单,几乎与Excel结构相同。

为了保存文档,您必须使用通用处理程序:

 Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest Using pck As New ExcelPackage() Dim ws As ExcelWorksheet = pck.Workbook.Worksheets.Add("MySheet") 'Put your code here context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" context.Response.AddHeader("content-disposition", "attachment; filename=" & filename.text & ".xlsx") context.Response.BinaryWrite(pck.GetAsByteArray()) End Using End Sub