【发布时间】:2011-05-10 05:35:30
【问题描述】:
我有一些代码可以生成一个包含多个 CSV 文件的 zip 文件并将其流式传输给用户(没有文件保存在服务器上)。但是,我想创建一个 Excel 工作簿(可以是传统的 xls 或 Office Open XML xlsx 格式),每个 CSV“文件”都是电子表格。
如何在不借助服务器上的 Office 自动化或商业 3rd 方组件的情况下做到这一点?
【问题讨论】:
我有一些代码可以生成一个包含多个 CSV 文件的 zip 文件并将其流式传输给用户(没有文件保存在服务器上)。但是,我想创建一个 Excel 工作簿(可以是传统的 xls 或 Office Open XML xlsx 格式),每个 CSV“文件”都是电子表格。
如何在不借助服务器上的 Office 自动化或商业 3rd 方组件的情况下做到这一点?
【问题讨论】:
您可以使用 OleDB 在 Excel 文件中生成简单的表格。
请注意,您需要在服务器上生成一个临时文件。
注意他们的例子是不正确的,需要使用OleDbConnectionStringBuilder,像这样:
OleDbConnectionStringBuilder builder = new OleDbConnectionStringBuilder();
if (isOpenXML)
builder.Provider = "Microsoft.ACE.OLEDB.12.0";
else
builder.Provider = "Microsoft.Jet.OLEDB.4.0";
builder.DataSource = fileName;
builder["Extended Properties"] = "Extended Properties=\"Excel 8.0;HDR=YES;\""
using (var con = new OleDbConnection(builder.ToString())) {
...
}
【讨论】:
你可以自己写excel xml。这是一个很好的任务库,也许它适合你。
// 编辑 链接:http://www.carlosag.net/Tools/ExcelXmlWriter/Generator.aspx
【讨论】:
Excel 的 XML 格式非常简单,完全不需要进行任何自动化操作。 完整的参考资料在 MSDN 上:http://msdn.microsoft.com/en-us/library/aa140066(office.10).aspx
【讨论】:
Response.ContentType = "application/vnd.ms-excel";
ContentType 属性指定响应的 HTTP 内容类型。如果未指定 ContentType,则默认为 text/HTML。
在DataGrid 中获取所有数据,然后从中获取它可以通过以下方式完成:
DataGrid.RenderControl
将服务器控件内容输出到提供的HtmlTextWriter 对象并存储有关控件的跟踪信息(如果启用了跟踪)。
SqlConnection cn = new SqlConnection("yourconnectionstring");
cn.Open();
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Users", cn);
DataTable dt = new DataTable();
da.Fill(dt);
DataGrid dg = new DataGrid();
dg.DataSource = dt;
dg.DataBind();
System.IO.StringWriter tw = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
dg.RenderControl(hw);
cn.Close();
Response.Clear();
Response.ContentType = "application/vnd.ms-excel";
this.EnableViewState = false;
Response.Write(tw.ToString());
Response.End();
【讨论】: