问题:
我在ASP.NET应用程序中使用Microsoft.Office.Interop.Excel
库,并且我在工作簿中填充了一个工作表。我希望系统提示用户将文档保存到他们的计算机,但我找不到办法(myWorkbook.SaveAs(...)
不起作用)。
问题:
如何将工作簿保存到用户的计算机上?我之前使用Response.Write(...)
提示用户保存基于文本的文件(CSV),但我无法弄清楚如何为.xls文件执行此操作。
加成:
如果使用Microsoft.Office.Interop.Excel
库无法做到这一点,我可以使用免费的(次级GPL-ish)库吗?
我认为微软会有一个这样的工具,但我们都知道假设是什么......
答案 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查询 来自文件的信息。
以下是一些我认为有用的“入门”教程:
答案 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