在ASP.NET中保存Excel文档

时间:2012-01-31 18:47:40

标签: c# asp.net vb.net excel save

问题:

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

问题:

如何将工作簿保存到用户的计算机上?我之前使用Response.Write(...)提示用户保存基于文本的文件(CSV),但我无法弄清楚如何为.xls文件执行此操作。

加成:

如果使用Microsoft.Office.Interop.Excel库无法做到这一点,我可以使用免费的(次级GPL-ish)库吗?

我认为微软会有一个这样的工具,但我们都知道假设是什么......

4 个答案:

答案 0 :(得分:2)

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

您无法直接提示用户保存Excel文件。该文件是在服务器上生成的。您需要将文件保存在服务器上,然后将文件加载到内存中,删除文件并将内存流发送到客户端。然后客户端可以选择保存文件。

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

我使用http://www.carlosag.net/tools/excelxmlwriter/多年来取得了巨大的成功。我相信还有其他选择。 使用此方法适用相同的规则。构建工作簿。然后保存到流(不是文件)并将流发送到客户端。然后客户端可以选择如何处理文件。

答案 1 :(得分:2)

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

来自MSDN page

  

打开适用于Microsoft Office的XML SDK 2.0

     

此SDK是Open XML SDK 1.0的超集。除了Open XML SDK 1.0提供的功能外,它还有exploits.NET   语言集成查询(LINQ)并提供构造和类的类   查询包中零件的内容。你可以使用功能   构造文档的构造,以及用于提取的LINQ查询   来自文件的信息。

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

Formatted Excel using SDK 2.0 and .NET

OpenXML SDK 2.0: Export a DataTable to Excel

答案 2 :(得分:0)

试试这个......

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

答案 3 :(得分:0)

我喜欢在这个例子中使用EPPlus。它使用简单,结构与Excel几乎相同。

要保存文档,您必须使用Generic Handler:

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