虽然发表了2篇关于NPOI导出EXCEL的文章,但是最近再次使用的时候,把以前的代码粘贴过来,居然报了一个错误:

服务器无法在发送 HTTP 标头之后追加标头”

后来也查询了很多其他同学的文章,都没有成功,可能问题不太一样吧,我的问题出在:获取httpResponse对象没有写在方法内部,是用的一个属性接受的,在方法调用导致的。

下面粘上完整代码,错误代码已注释,供其他同学参考:

/// <summary>
/// EXCEL帮助类
/// </summary>
/// <typeparam name="T">泛型类</typeparam>
/// <typeparam name="TCollection">泛型类集合</typeparam>
public class ExcelHelp<T, TCollection> where TCollection : List<T>
{
public static ExcelHelp<T, TCollection> instance = new ExcelHelp<T, TCollection>();
//获取httpResponse对象原位置,放在这里不知道会报错:服务器无法在发送 HTTP 标头之后追加标头
//可能是这里拿到的httpResponse对象不是最新请求的对象导致的,将其放到方法内部即可
//HttpResponse baseResponse = HttpContext.Current.Response; /// <summary>
/// 将数据导出EXCEL
/// </summary>
/// <param name="columnNameAndShowNameDic">键值对集合(键:列名,值:每列数据集合)</param>
public void ExportExcelData(Dictionary<string, List<string>> columnNameAndShowNameDic)
{
IWorkbook workbook = new HSSFWorkbook();
ISheet worksheet = workbook.CreateSheet("sheet1"); List<string> columnNameList = columnNameAndShowNameDic.Keys.ToList();
//设置首列显示
IRow row1 = worksheet.CreateRow();
ICell cell = null;
ICellStyle cellHeadStyle = workbook.CreateCellStyle();
//设置首行字体加粗
IFont font = workbook.CreateFont();
font.Boldweight = short.MaxValue;
cellHeadStyle.SetFont(font);
for (var i = ; i < columnNameList.Count; i++)
{
cell = row1.CreateCell(i);
cell.SetCellValue(columnNameList[i]);
cell.CellStyle = cellHeadStyle;
}
var raws = columnNameAndShowNameDic[columnNameList[]].Count;
for (int i = ; i < columnNameList.Count; i++)
{
for (int j = ; j < raws; j++)
{
if (i == )
{
row1 = worksheet.CreateRow(j + );
}
else
{
row1 = worksheet.GetRow(j + );
}
cell = row1.CreateCell(i);
cell.SetCellValue(columnNameAndShowNameDic[columnNameList[i]][j]);
}
//设置行宽度自适应
worksheet.AutoSizeColumn(i, true);
//worksheet.SetColumnWidth(i, columnWidth * 200);
}
//http请求Response对象-这里httpResponse对象要在方法内获取,否则可能会出现:无法再response发送表头后添加header的问题
HttpResponse baseResponse = HttpContext.Current.Response;
baseResponse.Clear();
baseResponse.Buffer = true;
baseResponse.ContentEncoding = System.Text.Encoding.UTF8;
baseResponse.ContentType = "application/vnd.ms-excel";
//设置导出文件名
baseResponse.AppendHeader("content-disposition", "attachment;filename=zhilian.xls");
MemoryStream ms = new MemoryStream();
workbook.Write(ms);
byte[] buffer = ms.ToArray();
baseResponse.AddHeader("Content-Length", buffer.Length.ToString());
baseResponse.BinaryWrite(buffer);
baseResponse.Flush();
baseResponse.End();
}
}
05-07 15:50