//dic表示excel中的sheet表名,可以导出多个sheet
private void Export1(Dictionary<string, DataTable> dic, string filePath, string fileName)
{
#region 加载模板文件到工作簿对象中
//创建工作簿对象
XSSFWorkbook hssfworkbook;
//打开模板文件到文件流中
using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
//将文件流中模板加载到工作簿对象中
hssfworkbook = new XSSFWorkbook(file);
}
#endregion
#region 根据模板设置工作表的内容
foreach (string key in dic.Keys)
{
//建立一个名为Sheet1的工作表
ISheet ws = hssfworkbook.GetSheet(key);
ICellStyle style1 = hssfworkbook.CreateCellStyle();
style1.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
style1.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
style1.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
style1.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
//style1.FillPattern =FillPattern.SolidForeground;
DataTable dt = (DataTable)dic[key];
//将数据添加到表中对应的单元格中,因为行已经创建,不需要重新创建行
for (int i = 0; i < dt.Rows.Count; i++)
{
IRow row = ws.CreateRow(i + 4);
for (int j = 0; j < dt.Columns.Count; j++)
{
ICell cell = row.CreateCell(j, CellType.String);
cell.CellStyle = style1;
cell.SetCellValue(dt.Rows[i][dt.Columns[j].ColumnName].ToString());
}
}
//强制Excel重新计算表中所有的公式
ws.ForceFormulaRecalculation = true;
}
#endregion
#region 设置响应头(文件名和文件格式)
//设置响应的类型为Excel
Response.ContentType = "application/vnd.ms-excel";
//设置下载的Excel文件名
Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", fileName));
//Clear方法删除所有缓存中的HTML输出。但此方法只删除Response显示输入信息,不删除Response头信息。以免影响导出数据的完整性。
Response.Clear();
#endregion
#region 写入到客户端
using (MemoryStream ms = new MemoryStream())
{
//将工作簿的内容放到内存流中
hssfworkbook.Write(ms);
Response.AddHeader("Content-Length", ms.ToArray().Length.ToString());
//将内存流转换成字节数组发送到客户端
Response.BinaryWrite(ms.GetBuffer());
Response.End();
}
#endregion
}