注释 async true
1,当在asp:updatepanel中使用asp:button导出excel时不能下载下来的原因:
asp:updatepanel里的所有控件都是async postback,及不是同步的。
解决方案:使用updatepanel的triggers属性,使其成为普通的postback。同步的。【只有同步的时候才可以识别response.write()中的表头信息】
<Triggers>
<asp:PostBackTrigger ControlID="btn导出" />
</Triggers>
2,导出excel方法
protected void ExportExcelEx(string fileName,
IEnumerable<object> data,
bool hasSeq = false,
ExcelCellsBuilder titleCells = null,
ExcelCellsBuilder footerCells = null)
{
if (data != null && data.Any())
{
ProcessExcelExport(fileName, GetExcelString(data, hasSeq, titleCells, footerCells));
}
}
protected void ExportExcelEx(string fileName,
DataTable data,
bool hasSeq = false,
ExcelCellsBuilder titleCells = null,
ExcelCellsBuilder footerCells = null)
{
if (data != null && data.Rows.Count > 0)
{
ProcessExcelExport(fileName, GetExcelString(data, hasSeq, titleCells, footerCells));
}
}
/// <summary>
/// 将DataTable导出为Excel CJ
/// </summary>
/// <param name="fileName">文件名</param>
/// <param name="res">数据源</param>
/// <param name="hasSeq">是否导出序号</param>
/// <param name="titleCells">表头内容</param>
/// <param name="footerCells">表尾内容</param>
protected string GetExcelString(object data,
bool hasSeq = false,
ExcelCellsBuilder titleCells = null,
ExcelCellsBuilder footerCells = null)
{
string tableBody = string.Empty;
int addNum = 0;
string tableFormat = "<table style='border-collapse: collapse;'>{0}{1}{2}{3}</table>";
string thFormat = "<th style='border:.5pt solid black;background-color: rgb(217,217,217);'>{0}</th>";
string trFormat = "<tr>{0}</tr>";
string tdFormat = "<td style='border:.5pt black solid'>{0}</td>";
StringBuilder header = new StringBuilder();
StringBuilder trs = new StringBuilder();
if (data is DataTable)
{
var dt = data as DataTable;
//拼接表头
header.Append("<tr>");
if (hasSeq)
{
addNum++;
header.AppendFormat(thFormat, "序号");
}
foreach (DataColumn item in dt.Columns)
{
header.AppendFormat(thFormat, item.ColumnName);
}
header.Append("</tr>");
for (int i = 0; i < dt.Rows.Count; i++)
{
StringBuilder tds = new StringBuilder();
if (hasSeq)
tds.AppendFormat(tdFormat, i + 1);
for (int j = 0; j < dt.Columns.Count; j++)
{
tds.AppendFormat(tdFormat, dt.Rows[i][j]);
}
trs.AppendFormat(trFormat, tds);
}
}
else if (data is IEnumerable<object>)
{
var objType = data.GetType().GetGenericArguments()[0];
//获取列
IEnumerable<PropertyInfo> columns = objType.GetProperties();
IEnumerable<object> exData = data as IEnumerable<object>;
//拼接表头
header.Append("<tr>");
if (hasSeq)
{
addNum++;
header.AppendFormat(thFormat, "序号");
}
foreach (var item in columns)
{
header.AppendFormat(thFormat, item.Name);
}
header.Append("</tr>");
int rowIndex = 1;
var res = exData.GetEnumerator();
while (res.MoveNext())
{
StringBuilder tds = new StringBuilder();
//序号
if (hasSeq)
tds.AppendFormat(tdFormat, rowIndex);
foreach (var column in columns)
{
var item = res.GetType().GetProperty("Current").GetValue(res, null);
tds.AppendFormat(tdFormat, item.GetType().GetProperty(column.Name).GetValue(item, null));
}
trs.AppendFormat(trFormat, tds);
rowIndex++;
}
}
string titleCellsStr = string.Empty, footerCellsStr = string.Empty;
if (titleCells != null)
{
titleCells.AddExcelColNum(addNum);
titleCellsStr = titleCells.ToString();
}
if (footerCells != null)
{
footerCells.AddExcelColNum(addNum);
footerCellsStr = footerCells.ToString();
}
tableBody = string.Format(tableFormat, titleCellsStr, header, trs, footerCellsStr);
return tableBody;
}
protected void ProcessExcelExport(string fileName, string excelString)
{
System.Web.HttpContext curContext = System.Web.HttpContext.Current;
curContext.Response.Clear();
curContext.Response.Buffer = true;
curContext.Response.ContentType = "application/vnd.ms-excel";
curContext.Response.ContentEncoding = System.Text.Encoding.UTF8;
curContext.Response.Charset = "";
curContext.Response.AppendHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) + ".xls");
//解决编码问题终极办法的关键代码
string seiya = excelString + "<meta http-equiv="content-type" content="application/ms-excel; charset=UTF-8"/>";
curContext.Response.Output.Write(seiya);
curContext.Response.End();
}