近来在做项目和学习的过程都遇到了导出并下载excel和txt文档的需求,故在网上搜索累死的功能,我发现通过将DataTable中的数据导出成excel,让后将excel文件用记事本打开你会发现其实导出的excel是这样的
<div>
<table>
<tr>
<th>(DataTable中的列名依次在th标签中)</th>
</tr>
<tr>
<td(DataTable中的数据)></td>
</tr>
<tr>
<td(DataTable中的数据)></td>
</tr>
</table>
</div>
既然这样导出的excel类似于html中的DIV中嵌入了一个Table,那么结合导出txt的方式,我能不能把数据拼成这样的格式当成txt导出然后导出的时候将后缀名改成.xls呢?答案是肯定的——可以的,我发现这样导出的方式还有一个好处不管你要用什么样样式的表头(多行啥的都不是问题),这也让我联想到曾经有客户提出过能不能导出的excel中已经帮我做好了合计啊,已经有一些excel的聚合函数的调用统计和计算了啊,那时我的第一反应是难道要做excel编程还是office编程?看来当时的我还真是年幼无知啊,现在为大家贴上我近日尝试过的导出个性化样式的excel的方法与大家分享,不对之处还望大家指正(顺便再插一句,这样的到处方式能够给td标签添加各种样式以达到美观而更加直观的效果,样式和html中的一样)。以下下是一个生成的函数(将后缀.xls改成txt既可导出txt):
/// <summary>
/// add by pld 20140117
/// </summary>
/// <param name="sb">excel内容字符串</param>
/// <paramname="FileName">文件名</param>
private void Exportxls(string sb, StringFileName)
{
System.Web.UI.WebControls.GridViewdgExport = null;
//当前对话
System.Web.HttpContext curContext =System.Web.HttpContext.Current;
//IO用于导出并返回excel文件
System.IO.StringWriter strWriter = null;
System.Web.UI.HtmlTextWriter htmlWriter =null;
if (sb != null)
{
//设置编码和附件格式
//System.Web.HttpUtility.UrlEncode(FileName,System.Text.Encoding.UTF8)作用是方式中文文件名乱码
curContext.Response.AddHeader("content-disposition","attachment;filename=" + System.Web.HttpUtility.UrlEncode(FileName,System.Text.Encoding.UTF8) + ".xls");
curContext.Response.ContentType ="application/vnd.ms-word";
curContext.Response.ContentEncoding =System.Text.Encoding.UTF8;
curContext.Response.Charset ="UTF-8";
//导出Excel文件
strWriter = newSystem.IO.StringWriter();
htmlWriter = newSystem.Web.UI.HtmlTextWriter(strWriter);
curContext.Response.Write(sb);
curContext.Response.End();
}
}
protected voidbtnExcel_Click(object sender, System.EventArgs e)
{
string strTitle ="个性化标题";
string strExcel ="<div><table cellspacing=\"0\" rules=\"all\"border=\"1\" style=\"border-collapse:collapse;\">"+ CreateExcelHeadBuild(strTitle) + ExcelBuild +"</table></div>";
Exportxls(strExcel, strTitle);
}
一下是导出某个excel是编辑的表头(具体表中的数据也可以这样拼接出来或者将前台的表的innerhtml传到后台稍作修改即可)
protectedStringBuilder CreateExcelHeadBuild(string strTitle)
{
StringBuilder xlsHeadBuilder = newStringBuilder();
xlsHeadBuilder.Append("<trborder=\"1\">");
xlsHeadBuilder.Append("<thcolspan=\"10\" style=\"font-size: 18;\">" +strTitle + "</th>");
xlsHeadBuilder.Append("</tr>");
xlsHeadBuilder.Append("<trborder=\"1\">");
xlsHeadBuilder.Append("<thwidth=\"3%\" rowspan=\"2\" style=\"font-size:12;\">序号</th>");
xlsHeadBuilder.Append("<thwidth=\"6%\" rowspan=\"2\" style=\"font-size:12;\">列名</th>");
xlsHeadBuilder.Append("<thwidth=\"4%\" rowspan=\"2\" style=\"font-size:12;\">列名</th>");
xlsHeadBuilder.Append("<thwidth=\"4%\" rowspan=\"2\" style=\"font-size:12;\">列名</th>");
xlsHeadBuilder.Append("<thwidth=\"12%\" colspan=\"2\" style=\"font-size: 12;\">列名</th>");
xlsHeadBuilder.Append("<thwidth=\"12%\" colspan=\"2\" style=\"font-size:12;\">列名</th>");
xlsHeadBuilder.Append("<thwidth=\"6%\" rowspan=\"2\" style=\"font-size: 12;\">列名</th>");
xlsHeadBuilder.Append("<thwidth=\"4%\" rowspan=\"2\" style=\"font-size: 12;\">列名</th>");
xlsHeadBuilder.Append("<thwidth=\"6%\" rowspan=\"2\" style=\"font-size: 12;\">列名</th>");
xlsHeadBuilder.Append("<thwidth=\"8%\" rowspan=\"2\" style=\"font-size: 12;\">列名</th>");
xlsHeadBuilder.Append("</tr>");
xlsHeadBuilder.Append("<tr>");
xlsHeadBuilder.Append("<thwidth=\"8%\" style=\"font-size: 12;\">列名</th>");
xlsHeadBuilder.Append("<thwidth=\"6%\" style=\"font-size: 12;\">列名</th>");
xlsHeadBuilder.Append("<thwidth=\"8%\" style=\"font-size: 12;\">列名</th>");
xlsHeadBuilder.Append("<thwidth=\"6%\" style=\"font-size: 12;\">列名</th>");
xlsHeadBuilder.Append("</tr>");
return xlsHeadBuilder;
}
导出样式如下图:
但是是否有很多人在导出的时候发现会有错误弹窗出现无法导出,那是因为如果调用Response.Write()方法的服务器控件在使用UpdatePanel的页面,则需要在UpdatePanel下增加一个<Triggers>节点,通过PostBackTrigger注册一下改控件就可以了,例:
<asp:UpdatePanelID="UpdatePanel1" runat="server">
<Triggers>
<asp:PostBackTriggerControlID="btnExcel"/>
</Triggers>
<ContentTemplate>
(注:小弟才疏学浅,希望大家勿喷!不对之处,请多多指点哦!)