第一种:使用 Microsoft.Office.Interop.Excel.dll

首先需要安装 office 的 excel,然后再找到 Microsoft.Office.Interop.Excel.dll 组件,添加到引用。

public void ExportExcel(DataTable dt)
{
if (dt != null)
{
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); if (excel == null)
{
return;
} //设置为不可见,操作在后台执行,为 true 的话会打开 Excel
excel.Visible = false; //打开时设置为全屏显式
//excel.DisplayFullScreen = true; //初始化工作簿
Microsoft.Office.Interop.Excel.Workbooks workbooks = excel.Workbooks; //新增加一个工作簿,Add()方法也可以直接传入参数 true
Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
//同样是新增一个工作簿,但是会弹出保存对话框
//Microsoft.Office.Interop.Excel.Workbook workbook = excel.Application.Workbooks.Add(true); //新增加一个 Excel 表(sheet)
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[]; //设置表的名称
worksheet.Name = dt.TableName;
try
{
//创建一个单元格
Microsoft.Office.Interop.Excel.Range range; int rowIndex = ; //行的起始下标为 1
int colIndex = ; //列的起始下标为 1 //设置列名
for (int i = ; i < dt.Columns.Count; i++)
{
//设置第一行,即列名
worksheet.Cells[rowIndex, colIndex + i] = dt.Columns[i].ColumnName; //获取第一行的每个单元格
range = worksheet.Cells[rowIndex, colIndex + i]; //设置单元格的内部颜色
range.Interior.ColorIndex = ; //字体加粗
range.Font.Bold = true; //设置为黑色
range.Font.Color = ; //设置为宋体
range.Font.Name = "Arial"; //设置字体大小
range.Font.Size = ; //水平居中
range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter; //垂直居中
range.VerticalAlignment = Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;
} //跳过第一行,第一行写入了列名
rowIndex++; //写入数据
for (int i = ; i < dt.Rows.Count; i++)
{
for (int j = ; j < dt.Columns.Count; j++)
{
worksheet.Cells[rowIndex + i, colIndex + j] = dt.Rows[i][j].ToString();
}
} //设置所有列宽为自动列宽
//worksheet.Columns.AutoFit(); //设置所有单元格列宽为自动列宽
worksheet.Cells.Columns.AutoFit();
//worksheet.Cells.EntireColumn.AutoFit(); //是否提示,如果想删除某个sheet页,首先要将此项设为fasle。
excel.DisplayAlerts = false; //保存写入的数据,这里还没有保存到磁盘
workbook.Saved = true; //设置导出文件路径
string path = HttpContext.Current.Server.MapPath("Export/"); //设置新建文件路径及名称
string savePath = path + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xlsx"; //创建文件
FileStream file = new FileStream(savePath, FileMode.CreateNew); //关闭释放流,不然没办法写入数据
file.Close();
file.Dispose(); //保存到指定的路径
workbook.SaveCopyAs(savePath); //还可以加入以下方法输出到浏览器下载
FileInfo fileInfo = new FileInfo(savePath);
OutputClient(fileInfo);
}
catch(Exception ex)
{ }
finally
{
workbook.Close(false, Type.Missing, Type.Missing);
workbooks.Close(); //关闭退出
excel.Quit(); //释放 COM 对象
Marshal.ReleaseComObject(worksheet);
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(workbooks);
Marshal.ReleaseComObject(excel); worksheet = null;
workbook = null;
workbooks = null;
excel = null; GC.Collect();
}
}
}
public void OutputClient(FileInfo file)
{
HttpContext.Current.Response.Buffer = true; HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ClearContent(); HttpContext.Current.Response.ContentType = "application/vnd.ms-excel"; //导出到 .xlsx 格式不能用时,可以试试这个
//HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xlsx", DateTime.Now.ToString("yyyy-MM-dd-HH-mm"))); HttpContext.Current.Response.Charset = "GB2312";
HttpContext.Current.Response.ContentEncoding = Encoding.GetEncoding("GB2312"); HttpContext.Current.Response.AddHeader("Content-Length", file.Length.ToString()); HttpContext.Current.Response.WriteFile(file.FullName);
HttpContext.Current.Response.Flush(); HttpContext.Current.Response.Close();
}

第一种方法性能实在是不敢恭维,而且局限性太多。首先必须要安装 office(如果计算机上面没有的话),而且导出时需要指定文件保存的路径。也可以输出到浏览器下载,当然前提是已经保存写入数据。

第二种:使用 Aspose.Cells.dll

这个 Aspose.Cells 是 Aspose 公司推出的导出 Excel 的控件,不依赖 Office,商业软件,收费的。

可以参考:http://www.cnblogs.com/xiaofengfeng/archive/2012/09/27/2706211.html#top

public void ExportExcel(DataTable dt)
{
try
{
//获取指定虚拟路径的物理路径
string path = HttpContext.Current.Server.MapPath("DLL/") + "License.lic"; //读取 License 文件
Stream stream = (Stream)File.OpenRead(path); //注册 License
Aspose.Cells.License li = new Aspose.Cells.License();
li.SetLicense(stream); //创建一个工作簿
Aspose.Cells.Workbook workbook = new Aspose.Cells.Workbook(); //创建一个 sheet 表
Aspose.Cells.Worksheet worksheet = workbook.Worksheets[]; //设置 sheet 表名称
worksheet.Name = dt.TableName; Aspose.Cells.Cell cell; int rowIndex = ; //行的起始下标为 0
int colIndex = ; //列的起始下标为 0 //设置列名
for (int i = ; i < dt.Columns.Count; i++)
{
//获取第一行的每个单元格
cell = worksheet.Cells[rowIndex, colIndex + i]; //设置列名
cell.PutValue(dt.Columns[i].ColumnName); //设置字体
cell.Style.Font.Name = "Arial"; //设置字体加粗
cell.Style.Font.IsBold = true; //设置字体大小
cell.Style.Font.Size = ; //设置字体颜色
cell.Style.Font.Color = System.Drawing.Color.Black; //设置背景色
cell.Style.BackgroundColor = System.Drawing.Color.LightGreen;
} //跳过第一行,第一行写入了列名
rowIndex++; //写入数据
for (int i = ; i < dt.Rows.Count; i++)
{
for (int j = ; j < dt.Columns.Count; j++)
{
cell = worksheet.Cells[rowIndex + i, colIndex + j]; cell.PutValue(dt.Rows[i][j]);
}
} //自动列宽
worksheet.AutoFitColumns(); //设置导出文件路径
path = HttpContext.Current.Server.MapPath("Export/"); //设置新建文件路径及名称
string savePath = path + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xlsx"; //创建文件
FileStream file = new FileStream(savePath, FileMode.CreateNew); //关闭释放流,不然没办法写入数据
file.Close();
file.Dispose(); //保存至指定路径
workbook.Save(savePath); //或者使用下面的方法,输出到浏览器下载。
//byte[] bytes = workbook.SaveToStream().ToArray();
//OutputClient(bytes); worksheet = null;
workbook = null;
}
catch(Exception ex)
{ }
}
public void OutputClient(byte[] bytes)
{
HttpContext.Current.Response.Buffer = true; HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ClearContent(); HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls", DateTime.Now.ToString("yyyy-MM-dd-HH-mm"))); HttpContext.Current.Response.Charset = "GB2312";
HttpContext.Current.Response.ContentEncoding = Encoding.GetEncoding("GB2312"); HttpContext.Current.Response.BinaryWrite(bytes);
HttpContext.Current.Response.Flush(); HttpContext.Current.Response.Close();
}

设置单元格格式为文本方法:

cell = worksheet.Cells[rowIndex, colIndex + i];
cell.PutValue(colNames[i]);
style = cell.GetStyle();
style.Number = ; // 49(text|@) 表示为文本
cell.SetStyle(style);

第二种方法性能还不错,而且操作也不复杂,可以设置导出时文件保存的路径,还可以保存为流输出到浏览器下载。

第三种:Microsoft.Jet.OLEDB

这种方法操作 Excel 类似于操作数据库。下面先介绍一下连接字符串:

// Excel 2003 版本连接字符串
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/xxx.xls;Extended Properties='Excel 8.0;HDR=Yes;IMEX=2;'"; // Excel 2007 以上版本连接字符串
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/xxx.xlsx;Extended Properties='Excel 12.0;HDR=Yes;IMEX=2;'";

Provider:驱动程序名称

Data Source:指定 Excel 文件的路径

Extended Properties:Excel 8.0 针对 Excel 2000 及以上版本;Excel 12.0 针对 Excel 2007 及以上版本。

HDR:Yes 表示第一行包含列名,在计算行数时就不包含第一行。NO 则完全相反。

IMEX:0 写入模式;1 读取模式;2 读写模式。如果报错为“不能修改表 sheet1 的设计。它在只读数据库中”,那就去掉这个,问题解决。

public void ExportExcel(DataTable dt)
{
OleDbConnection conn = null;
OleDbCommand cmd = null; Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel.Workbooks workbooks = excel.Workbooks; Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(true); try
{
//设置区域为当前线程的区域
dt.Locale = System.Threading.Thread.CurrentThread.CurrentCulture; //设置导出文件路径
string path = HttpContext.Current.Server.MapPath("Export/"); //设置新建文件路径及名称
string savePath = path + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xlsx"; //创建文件
FileStream file = new FileStream(savePath, FileMode.CreateNew); //关闭释放流,不然没办法写入数据
file.Close();
file.Dispose(); //由于使用流创建的 excel 文件不能被正常识别,所以只能使用这种方式另存为一下。
workbook.SaveCopyAs(savePath); // Excel 2003 版本连接字符串
//string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + savePath + "';Extended Properties='Excel 8.0;HDR=Yes;'"; // Excel 2007 以上版本连接字符串
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='"+ savePath + "';Extended Properties='Excel 12.0;HDR=Yes;'"; //创建连接对象
conn = new OleDbConnection(strConn);
//打开连接
conn.Open(); //创建命令对象
cmd = conn.CreateCommand(); //获取 excel 所有的数据表。
//new object[] { null, null, null, "Table" }指定返回的架构信息:参数介绍
//第一个参数指定目录
//第二个参数指定所有者
//第三个参数指定表名
//第四个参数指定表类型
DataTable dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); //因为后面创建的表都会在最后面,所以本想删除掉前面的表,结果发现做不到,只能清空数据。
for (int i = ; i < dtSheetName.Rows.Count; i++)
{
cmd.CommandText = "drop table [" + dtSheetName.Rows[i]["TABLE_NAME"].ToString() + "]";
cmd.ExecuteNonQuery();
} //添加一个表,即 Excel 中 sheet 表
cmd.CommandText = "create table " + dt.TableName + " ([S_Id] INT,[S_StuNo] VarChar,[S_Name] VarChar,[S_Sex] VarChar,[S_Height] VarChar,[S_BirthDate] VarChar,[C_S_Id] INT)";
cmd.ExecuteNonQuery(); for (int i = ; i < dt.Rows.Count; i++)
{
string values = ""; for (int j = ; j < dt.Columns.Count; j++)
{
values += "'" + dt.Rows[i][j].ToString() + "',";
} //判断最后一个字符是否为逗号,如果是就截取掉
if (values.LastIndexOf(',') == values.Length - )
{
values = values.Substring(, values.Length - );
} //写入数据
cmd.CommandText = "insert into " + dt.TableName + " (S_Id,S_StuNo,S_Name,S_Sex,S_Height,S_BirthDate,C_S_Id) values (" + values + ")";
cmd.ExecuteNonQuery();
} conn.Close();
conn.Dispose();
cmd.Dispose(); //加入下面的方法,把保存的 Excel 文件输出到浏览器下载。需要先关闭连接。
FileInfo fileInfo = new FileInfo(savePath);
OutputClient(fileInfo);
}
catch (Exception ex)
{ }
finally
{
workbook.Close(false, Type.Missing, Type.Missing);
workbooks.Close();
excel.Quit(); Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(workbooks);
Marshal.ReleaseComObject(excel); workbook = null;
workbooks = null;
excel = null; GC.Collect();
}
}
public void OutputClient(FileInfo file)
{
HttpResponse response = HttpContext.Current.Response; response.Buffer = true; response.Clear();
response.ClearHeaders();
response.ClearContent(); response.ContentType = "application/vnd.ms-excel"; //导出到 .xlsx 格式不能用时,可以试试这个
//HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xlsx", DateTime.Now.ToString("yyyy-MM-dd-HH-mm"))); response.Charset = "GB2312";
response.ContentEncoding = Encoding.GetEncoding("GB2312"); response.AddHeader("Content-Length", file.Length.ToString()); response.WriteFile(file.FullName);
response.Flush(); response.Close();
}

这种方法需要指定一个已经存在的 Excel 文件作为写入数据的模板,不然的话就得使用流创建一个新的 Excel 文件,但是这样是没法识别的,那就需要用到 Microsoft.Office.Interop.Excel.dll 里面的 Microsoft.Office.Interop.Excel.Workbook.SaveCopyAs() 方法另存为一下,这样性能也就更差了。

使用操作命令创建的表都是在最后面的,前面的也没法删除(我是没有找到方法),当然也可以不再创建,直接写入数据也可以。

第四种:NPOI

NPOI 是 POI 项目的.NET版本,它不使用 Office COM 组件,不需要安装 Microsoft Office,目前支持 Office 2003 和 2007 版本。

NPOI 是免费开源的,操作也比较方便,下载地址:http://npoi.codeplex.com/

public void ExportExcel(DataTable dt)
{
try
{
//创建一个工作簿
IWorkbook workbook = new HSSFWorkbook(); //创建一个 sheet 表
ISheet sheet = workbook.CreateSheet(dt.TableName); //创建一行
IRow rowH = sheet.CreateRow(); //创建一个单元格
ICell cell = null; //创建单元格样式
ICellStyle cellStyle = workbook.CreateCellStyle(); //创建格式
IDataFormat dataFormat = workbook.CreateDataFormat(); //设置为文本格式,也可以为 text,即 dataFormat.GetFormat("text");
cellStyle.DataFormat = dataFormat.GetFormat("@"); //设置列名
foreach (DataColumn col in dt.Columns)
{
//创建单元格并设置单元格内容
rowH.CreateCell(col.Ordinal).SetCellValue(col.Caption); //设置单元格格式
rowH.Cells[col.Ordinal].CellStyle = cellStyle;
} //写入数据
for (int i = ; i < dt.Rows.Count; i++)
{
//跳过第一行,第一行为列名
IRow row = sheet.CreateRow(i + ); for (int j = ; j < dt.Columns.Count; j++)
{
cell = row.CreateCell(j);
cell.SetCellValue(dt.Rows[i][j].ToString());
cell.CellStyle = cellStyle;
}
} //设置导出文件路径
string path = HttpContext.Current.Server.MapPath("Export/"); //设置新建文件路径及名称
string savePath = path + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xls"; //创建文件
FileStream file = new FileStream(savePath, FileMode.CreateNew,FileAccess.Write); //创建一个 IO 流
MemoryStream ms = new MemoryStream(); //写入到流
workbook.Write(ms); //转换为字节数组
byte[] bytes = ms.ToArray(); file.Write(bytes, , bytes.Length);
file.Flush(); //还可以调用下面的方法,把流输出到浏览器下载
OutputClient(bytes); //释放资源
bytes = null; ms.Close();
ms.Dispose(); file.Close();
file.Dispose(); workbook.Close();
sheet = null;
workbook = null;
}
catch(Exception ex)
{ }
}
public void OutputClient(byte[] bytes)
{
HttpResponse response = HttpContext.Current.Response; response.Buffer = true; response.Clear();
response.ClearHeaders();
response.ClearContent(); response.ContentType = "application/vnd.ms-excel";
response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls", DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss"))); response.Charset = "GB2312";
response.ContentEncoding = Encoding.GetEncoding("GB2312"); response.BinaryWrite(bytes);
response.Flush(); response.Close();
}
// 2007 版本创建一个工作簿
IWorkbook workbook = new XSSFWorkbook(); // 2003 版本创建一个工作簿
IWorkbook workbook = new HSSFWorkbook();

PS:操作 2003 版本需要添加 NPOI.dll 的引用,操作 2007 版本需要添加 NPOI.OOXML.dll 的引用。

第五种:GridView

直接使用 GridView 把 DataTable 的数据转换为字符串流,然后输出到浏览器下载。

public void ExportExcel(DataTable dt)
{
HttpResponse response = HttpContext.Current.Response; response.Buffer = true; response.Clear();
response.ClearHeaders();
response.ClearContent(); response.ContentType = "application/vnd.ms-excel";
response.AddHeader("content-disposition", string.Format("attachment; filename={0}.xls", DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss"))); response.Charset = "GB2312";
response.ContentEncoding = Encoding.GetEncoding("GB2312"); //实例化一个流
StringWriter stringWrite = new StringWriter(); //指定文本输出到流
HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); GridView gv = new GridView();
gv.DataSource = dt;
gv.DataBind(); for (int i = ; i < dt.Rows.Count; i++)
{
for (int j = ; j < dt.Columns.Count; j++)
{
//设置每个单元格的格式
gv.Rows[i].Cells[j].Attributes.Add("style", "vnd.ms-excel.numberformat:@");
}
} //把 GridView 的内容输出到 HtmlTextWriter
gv.RenderControl(htmlWrite); response.Write(stringWrite.ToString());
response.Flush(); response.Close();
}

这种方式导出 .xlsx 格式的 Excel 文件时,没办法打开。导出 .xls 格式的,会提示文件格式和扩展名不匹配,但是可以打开的。

第六种:DataGrid

其实这一种方法和上面的那一种方法几乎是一样的。

public void ExportExcel(DataTable dt)
{
HttpResponse response = HttpContext.Current.Response; response.Buffer = true; response.Clear();
response.ClearHeaders();
response.ClearContent(); response.ContentType = "application/vnd.ms-excel";
response.AddHeader("content-disposition", string.Format("attachment; filename={0}.xls", DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss"))); response.Charset = "GB2312";
response.ContentEncoding = Encoding.GetEncoding("GB2312"); //实例化一个流
StringWriter stringWrite = new StringWriter(); //指定文本输出到流
HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); DataGrid dg = new DataGrid();
dg.DataSource = dt;
dg.DataBind(); dg.Attributes.Add("style", "vnd.ms-excel.numberformat:@"); //把 DataGrid 的内容输出到 HtmlTextWriter
dg.RenderControl(htmlWrite); response.Write(stringWrite.ToString());
response.Flush(); response.Close();
}

第七种:直接使用 IO 流

第一种方式,使用文件流在磁盘创建一个 Excel 文件,然后使用流写入数据。

public void ExportExcel(DataTable dt)
{
//设置导出文件路径
string path = HttpContext.Current.Server.MapPath("Export/"); //设置新建文件路径及名称
string savePath = path + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xls"; //创建文件
FileStream file = new FileStream(savePath, FileMode.CreateNew, FileAccess.Write); //以指定的字符编码向指定的流写入字符
StreamWriter sw = new StreamWriter(file, Encoding.GetEncoding("GB2312")); StringBuilder strbu = new StringBuilder(); //写入标题
for (int i = ; i < dt.Columns.Count; i++)
{
strbu.Append(dt.Columns[i].ColumnName.ToString() + "\t");
}
//加入换行字符串
strbu.Append(Environment.NewLine); //写入内容
for (int i = ; i < dt.Rows.Count; i++)
{
for (int j = ; j < dt.Columns.Count; j++)
{
strbu.Append(dt.Rows[i][j].ToString() + "\t");
}
strbu.Append(Environment.NewLine);
} sw.Write(strbu.ToString());
sw.Flush();
file.Flush(); sw.Close();
sw.Dispose(); file.Close();
file.Dispose();
}

第二种方式,这种方式就不需要在本地磁盘创建文件了,首先创建一个内存流写入数据,然后输出到浏览器下载。

public void ExportExcel(DataTable dt)
{
//创建一个内存流
MemoryStream ms = new MemoryStream(); //以指定的字符编码向指定的流写入字符
StreamWriter sw = new StreamWriter(ms, Encoding.GetEncoding("GB2312")); StringBuilder strbu = new StringBuilder(); //写入标题
for (int i = ; i < dt.Columns.Count; i++)
{
strbu.Append(dt.Columns[i].ColumnName.ToString() + "\t");
}
//加入换行字符串
strbu.Append(Environment.NewLine); //写入内容
for (int i = ; i < dt.Rows.Count; i++)
{
for (int j = ; j < dt.Columns.Count; j++)
{
strbu.Append(dt.Rows[i][j].ToString() + "\t");
}
strbu.Append(Environment.NewLine);
} sw.Write(strbu.ToString());
sw.Flush(); sw.Close();
sw.Dispose(); //转换为字节数组
byte[] bytes = ms.ToArray(); ms.Close();
ms.Dispose(); OutputClient(bytes);
}
public void OutputClient(byte[] bytes)
{
HttpResponse response = HttpContext.Current.Response; response.Buffer = true; response.Clear();
response.ClearHeaders();
response.ClearContent(); response.ContentType = "application/vnd.ms-excel";
response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls", DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss"))); response.Charset = "GB2312";
response.ContentEncoding = Encoding.GetEncoding("GB2312"); response.BinaryWrite(bytes);
response.Flush(); response.Close();
}

这种方法有一个弊端,就是不能设置单元格的格式(至少我是没有找到,是在下输了)。

第八种:EPPlus

EPPlus 是一个使用 Open Office Xml 格式(xlsx)读取和写入 Excel 2007/2010 文件的 .net 库,并且免费开源。

下载地址:http://epplus.codeplex.com/

第一种方式,先使用文件流在磁盘创建一个 Excel 文件,然后打开这个文件写入数据并保存。

public void ExportExcel(DataTable dt)
{
//新建一个 Excel 文件
string path = HttpContext.Current.Server.MapPath("Export/");
string filePath = path + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xlsx";
FileStream fileStream = new FileStream(filePath, FileMode.Create); //加载这个 Excel 文件
ExcelPackage package = new ExcelPackage(fileStream); // 添加一个 sheet 表
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(dt.TableName); int rowIndex = ; // 起始行为 1
int colIndex = ; // 起始列为 1 //设置列名
for (int i = ; i < dt.Columns.Count; i++)
{
worksheet.Cells[rowIndex, colIndex + i].Value = dt.Columns[i].ColumnName; //自动调整列宽,也可以指定最小宽度和最大宽度
worksheet.Column(colIndex + i).AutoFit();
} // 跳过第一列列名
rowIndex++; //写入数据
for (int i = ; i < dt.Rows.Count; i++)
{
for (int j = ; j < dt.Columns.Count; j++)
{
worksheet.Cells[rowIndex + i, colIndex + j].Value = dt.Rows[i][j].ToString();
} //自动调整行高
worksheet.Row(rowIndex + i).CustomHeight = true;
} //设置字体,也可以是中文,比如:宋体
worksheet.Cells.Style.Font.Name = "Arial"; //字体加粗
worksheet.Cells.Style.Font.Bold = true; //字体大小
worksheet.Cells.Style.Font.Size = ; //字体颜色
worksheet.Cells.Style.Font.Color.SetColor(System.Drawing.Color.Black); //单元格背景样式,要设置背景颜色必须先设置背景样式
worksheet.Cells.Style.Fill.PatternType = ExcelFillStyle.Solid;
//单元格背景颜色
worksheet.Cells.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.DimGray); //设置单元格所有边框样式和颜色
worksheet.Cells.Style.Border.BorderAround(ExcelBorderStyle.Thin, System.Drawing.ColorTranslator.FromHtml("#0097DD")); //单独设置单元格四边框 Top、Bottom、Left、Right 的样式和颜色
//worksheet.Cells.Style.Border.Top.Style = ExcelBorderStyle.Thin;
//worksheet.Cells.Style.Border.Top.Color.SetColor(System.Drawing.Color.Black); //垂直居中
worksheet.Cells.Style.VerticalAlignment = ExcelVerticalAlignment.Center; //水平居中
worksheet.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; //单元格是否自动换行
worksheet.Cells.Style.WrapText = false; //设置单元格格式为文本
worksheet.Cells.Style.Numberformat.Format = "@"; //单元格自动适应大小
worksheet.Cells.Style.ShrinkToFit = true; package.Save(); fileStream.Close();
fileStream.Dispose(); worksheet.Dispose();
package.Dispose();
}

第二种方式,不指定文件,先创建一个 Excel 工作簿写入数据之后,可以选择保存至指定文件(新建文件)、保存为流、获取字节数组输出到浏览器下载。

public void ExportExcel(DataTable dt)
{
//新建一个 Excel 工作簿
ExcelPackage package = new ExcelPackage(); // 添加一个 sheet 表
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(dt.TableName); int rowIndex = ; // 起始行为 1
int colIndex = ; // 起始列为 1 //设置列名
for (int i = ; i < dt.Columns.Count; i++)
{
worksheet.Cells[rowIndex, colIndex + i].Value = dt.Columns[i].ColumnName; //自动调整列宽,也可以指定最小宽度和最大宽度
worksheet.Column(colIndex + i).AutoFit();
} // 跳过第一列列名
rowIndex++; //写入数据
for (int i = ; i < dt.Rows.Count; i++)
{
for (int j = ; j < dt.Columns.Count; j++)
{
worksheet.Cells[rowIndex + i, colIndex + j].Value = dt.Rows[i][j].ToString();
} //自动调整行高
worksheet.Row(rowIndex + i).CustomHeight = true;
} //设置字体,也可以是中文,比如:宋体
worksheet.Cells.Style.Font.Name = "Arial"; //字体加粗
worksheet.Cells.Style.Font.Bold = true; //字体大小
worksheet.Cells.Style.Font.Size = ; //字体颜色
worksheet.Cells.Style.Font.Color.SetColor(System.Drawing.Color.Black); //单元格背景样式,要设置背景颜色必须先设置背景样式
worksheet.Cells.Style.Fill.PatternType = ExcelFillStyle.Solid;
//单元格背景颜色
worksheet.Cells.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.DimGray); //设置单元格所有边框样式和颜色
worksheet.Cells.Style.Border.BorderAround(ExcelBorderStyle.Thin, System.Drawing.ColorTranslator.FromHtml("#0097DD")); //单独设置单元格四边框 Top、Bottom、Left、Right 的样式和颜色
//worksheet.Cells.Style.Border.Top.Style = ExcelBorderStyle.Thin;
//worksheet.Cells.Style.Border.Top.Color.SetColor(System.Drawing.Color.Black); //垂直居中
worksheet.Cells.Style.VerticalAlignment = ExcelVerticalAlignment.Center; //水平居中
worksheet.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; //单元格是否自动换行
worksheet.Cells.Style.WrapText = false; //设置单元格格式为文本
worksheet.Cells.Style.Numberformat.Format = "@"; //单元格自动适应大小
worksheet.Cells.Style.ShrinkToFit = true; ////第一种保存方式
//string path1 = HttpContext.Current.Server.MapPath("Export/");
//string filePath1 = path1 + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xlsx";
//FileStream fileStream1 = new FileStream(filePath1, FileMode.Create);
////保存至指定文件
//FileInfo fileInfo = new FileInfo(filePath1);
//package.SaveAs(fileInfo); ////第二种保存方式
//string path2 = HttpContext.Current.Server.MapPath("Export/");
//string filePath2 = path2 + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xlsx";
//FileStream fileStream2 = new FileStream(filePath2, FileMode.Create);
////写入文件流
//package.SaveAs(fileStream2); //创建一个内存流,然后转换为字节数组,输出到浏览器下载
//MemoryStream ms = new MemoryStream();
//package.SaveAs(ms);
//byte[] bytes = ms.ToArray(); //也可以直接获取流
//Stream stream = package.Stream; //也可以直接获取字节数组
byte[] bytes = package.GetAsByteArray(); //调用下面的方法输出到浏览器下载
OutputClient(bytes); worksheet.Dispose();
package.Dispose();
}
public void OutputClient(byte[] bytes)
{
HttpResponse response = HttpContext.Current.Response; response.Buffer = true; response.Clear();
response.ClearHeaders();
response.ClearContent(); //response.ContentType = "application/ms-excel";
response.ContentType = "application/vnd.openxmlformats - officedocument.spreadsheetml.sheet";
response.AppendHeader("Content-Type", "text/html; charset=GB2312");
response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xlsx", DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss"))); response.Charset = "GB2312";
response.ContentEncoding = Encoding.GetEncoding("GB2312"); response.BinaryWrite(bytes);
response.Flush(); response.End();
}

这种方法创建文件和输出到浏览器下载都是可以支持 Excel .xlsx 格式的。更多相关属性设置,请参考:

http://www.cnblogs.com/rumeng/p/3785775.html

C# 导出 Excel 的各种方法总结的更多相关文章

  1. 从SQL Server中导入/导出Excel的基本方法(转)

    从sql server中导入/导出 excel 的基本方法 /*=========== 导入/导出 excel 的基本方法 ===========*/ 从excel文档中,导入数据到sql数据库中,很 ...

  2. ASP.net中导出Excel的简单方法介绍

    下面介绍一种ASP.net中导出Excel的简单方法 先上代码:前台代码如下(这是自己项目里面写的一点代码先贴出来吧) <div id="export" runat=&quo ...

  3. <转>.php导出excel(多种方法)

    基本上导出的文件分为两种:1:类Excel格式,这个其实不是传统意义上的Excel文件,只是因为Excel的兼容能力强,能够正确打开而已.修改这种文件后再保存,通常会提示你是否要转换成Excel文件. ...

  4. asp.net中导出excel数据的方法汇总

    1.由dataset生成 代码如下 复制代码 public void CreateExcel(DataSet ds,string typeid,string FileName)    {    Htt ...

  5. 导出excel的简单方法

    excel的操作,最常用的就是导出和导入,废话不多说上代码. 本例使用NPOI实现的,不喜勿喷哈.... /// <summary> /// 导出Excel /// </summar ...

  6. ext.net 2.5 导出excel的使用方法

    前台页面的导入,导出 <ext:FileUploadField ID="FileUploadField_Import" runat="server" Bu ...

  7. 写一个通用的List集合导出excel的通用方法

    前几天要做一个数据导出Excel 我就打算写一个通用的. 这样一来用的时候也方便,数据主要是通过Orm取的List.这样写一个通用的刚好. public static void ListToExcel ...

  8. MVC 导出Excel 的其中一方法(View导出excel)

    场景:mvc下导出excel 思路:使用View导出excel 步骤: 1.导出标签添加事件 $("#export_A").click(function(){ //省略代码.... ...

  9. asp.net导出EXCEL的好方法!(好用,导出全部数据)

    1.调用方法: ExportExcel("application/ms-excel", "EXCEL名称.xls", GridView1, this.Page) ...

随机推荐

  1. 【BZOJ】1044: [HAOI2008]木棍分割(二分+dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1044 如果只求最大的最小,,直接二分就行了...可是要求方案.. 好神! 我竟然想不到! 因为我们得 ...

  2. python+selenium之自定义封装一个简单的Log类

    python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...

  3. [Wc2007]剪刀石头布[补集转化+拆边]

    2597: [Wc2007]剪刀石头布 Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1157  Solved:  ...

  4. Objective-C代码学习大纲(3)

    Objective-C代码学习大纲(3) 2011-05-11 14:06 佚名 otierney 字号:T | T 本文为台湾出版的<Objective-C学习大纲>的翻译文档,系统介绍 ...

  5. Android 全局异常处理(一)

    from:http://onewayonelife.iteye.com/blog/1147533 from:http://blog.csdn.net/liuhe688/article/details/ ...

  6. js 函数递归优化,arguments.callee 优化

    函数递归是个经典的问题,平常用的时候,小练习可以通过函数名来反复调用,比如: function factorial(num) { if (num <= 1) { return 1; } else ...

  7. Struts2的简单的文件上传

    1文件上传的流程: 第一步:首先得用表单标签的<s:file>在客户端接收上传的文件例如: <%@ page language="java" import=&qu ...

  8. Strut2中的标签

    Struts2的标签用法和示例 1)s:property标签:property 标签用来输出一个值栈属性的值 示例: 输出 Action 属性 customerId 的值: <s:propert ...

  9. If the parts of an organization (e.g., teams, departments, or subdivisions) do not closely reflect the essential parts of the product, or if the relationship between organizations do not reflect the r

    https://en.wikipedia.org/wiki/Conway%27s_law

  10. 介绍importlib

    Python将importlib作为标准库提供.它旨在提供Pythonimport语法和(__import__()函数)的实现.另外,importlib提供了开发者可以创建自己的对象(即importe ...