第一种:使用 Microsoft.Office.Interop.Excel.dll
    首先需要安装 office 的 excel,然后再找到 Microsoft.Office.Interop.Excel.dll 组件,添加到引用。
    C# 导出 Excel 的各种方法总结 - 图1
    C# 导出 Excel 的各种方法总结 - 图2

    1. public void ExportExcel(DataTable dt)
    2. {
    3. if (dt != null)
    4. {
    5. Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
    6. if (excel == null)
    7. {
    8. return;
    9. }
    10. //设置为不可见,操作在后台执行,为 true 的话会打开 Excel
    11. excel.Visible = false;
    12. //打开时设置为全屏显式
    13. //excel.DisplayFullScreen = true;
    14. //初始化工作簿
    15. Microsoft.Office.Interop.Excel.Workbooks workbooks = excel.Workbooks;
    16. //新增加一个工作簿,Add()方法也可以直接传入参数 true
    17. Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
    18. //同样是新增一个工作簿,但是会弹出保存对话框
    19. //Microsoft.Office.Interop.Excel.Workbook workbook = excel.Application.Workbooks.Add(true);
    20. //新增加一个 Excel 表(sheet)
    21. Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];
    22. //设置表的名称
    23. worksheet.Name = dt.TableName;
    24. try
    25. {
    26. //创建一个单元格
    27. Microsoft.Office.Interop.Excel.Range range;
    28. int rowIndex = 1; //行的起始下标为 1
    29. int colIndex = 1; //列的起始下标为 1
    30. //设置列名
    31. for (int i = 0; i < dt.Columns.Count; i++)
    32. {
    33. //设置第一行,即列名
    34. worksheet.Cells[rowIndex, colIndex + i] = dt.Columns[i].ColumnName;
    35. //获取第一行的每个单元格
    36. range = worksheet.Cells[rowIndex, colIndex + i];
    37. //设置单元格的内部颜色
    38. range.Interior.ColorIndex = 33;
    39. //字体加粗
    40. range.Font.Bold = true;
    41. //设置为黑色
    42. range.Font.Color = 0;
    43. //设置为宋体
    44. range.Font.Name = "Arial";
    45. //设置字体大小
    46. range.Font.Size = 12;
    47. //水平居中
    48. range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
    49. //垂直居中
    50. range.VerticalAlignment = Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;
    51. }
    52. //跳过第一行,第一行写入了列名
    53. rowIndex++;
    54. //写入数据
    55. for (int i = 0; i < dt.Rows.Count; i++)
    56. {
    57. for (int j = 0; j < dt.Columns.Count; j++)
    58. {
    59. worksheet.Cells[rowIndex + i, colIndex + j] = dt.Rows[i][j].ToString();
    60. }
    61. }
    62. //设置所有列宽为自动列宽
    63. //worksheet.Columns.AutoFit();
    64. //设置所有单元格列宽为自动列宽
    65. worksheet.Cells.Columns.AutoFit();
    66. //worksheet.Cells.EntireColumn.AutoFit();
    67. //是否提示,如果想删除某个sheet页,首先要将此项设为fasle。
    68. excel.DisplayAlerts = false;
    69. //保存写入的数据,这里还没有保存到磁盘
    70. workbook.Saved = true;
    71. //设置导出文件路径
    72. string path = HttpContext.Current.Server.MapPath("Export/");
    73. //设置新建文件路径及名称
    74. string savePath = path + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xlsx";
    75. //创建文件
    76. FileStream file = new FileStream(savePath, FileMode.CreateNew);
    77. //关闭释放流,不然没办法写入数据
    78. file.Close();
    79. file.Dispose();
    80. //保存到指定的路径
    81. workbook.SaveCopyAs(savePath);
    82. //还可以加入以下方法输出到浏览器下载
    83. FileInfo fileInfo = new FileInfo(savePath);
    84. OutputClient(fileInfo);
    85. }
    86. catch(Exception ex)
    87. {
    88. }
    89. finally
    90. {
    91. workbook.Close(false, Type.Missing, Type.Missing);
    92. workbooks.Close();
    93. //关闭退出
    94. excel.Quit();
    95. //释放 COM 对象
    96. Marshal.ReleaseComObject(worksheet);
    97. Marshal.ReleaseComObject(workbook);
    98. Marshal.ReleaseComObject(workbooks);
    99. Marshal.ReleaseComObject(excel);
    100. worksheet = null;
    101. workbook = null;
    102. workbooks = null;
    103. excel = null;
    104. GC.Collect();
    105. }
    106. }
    107. }
    1. public void OutputClient(FileInfo file)
    2. {
    3. HttpContext.Current.Response.Buffer = true;
    4. HttpContext.Current.Response.Clear();
    5. HttpContext.Current.Response.ClearHeaders();
    6. HttpContext.Current.Response.ClearContent();
    7. HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
    8. //导出到 .xlsx 格式不能用时,可以试试这个
    9. //HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    10. HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xlsx", DateTime.Now.ToString("yyyy-MM-dd-HH-mm")));
    11. HttpContext.Current.Response.Charset = "GB2312";
    12. HttpContext.Current.Response.ContentEncoding = Encoding.GetEncoding("GB2312");
    13. HttpContext.Current.Response.AddHeader("Content-Length", file.Length.ToString());
    14. HttpContext.Current.Response.WriteFile(file.FullName);
    15. HttpContext.Current.Response.Flush();
    16. HttpContext.Current.Response.Close();
    17. }

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

    第二种:使用 Aspose.Cells.dll
    这个 Aspose.Cells 是 Aspose 公司推出的导出 Excel 的控件,不依赖 Office,商业软件,收费的。
    可以参考:http://www.cnblogs.com/xiaofengfeng/archive/2012/09/27/2706211.html#top
    C# 导出 Excel 的各种方法总结 - 图3
    C# 导出 Excel 的各种方法总结 - 图4

    1. public void ExportExcel(DataTable dt)
    2. {
    3. try
    4. {
    5. //获取指定虚拟路径的物理路径
    6. string path = HttpContext.Current.Server.MapPath("DLL/") + "License.lic";
    7. //读取 License 文件
    8. Stream stream = (Stream)File.OpenRead(path);
    9. //注册 License
    10. Aspose.Cells.License li = new Aspose.Cells.License();
    11. li.SetLicense(stream);
    12. //创建一个工作簿
    13. Aspose.Cells.Workbook workbook = new Aspose.Cells.Workbook();
    14. //创建一个 sheet 表
    15. Aspose.Cells.Worksheet worksheet = workbook.Worksheets[0];
    16. //设置 sheet 表名称
    17. worksheet.Name = dt.TableName;
    18. Aspose.Cells.Cell cell;
    19. int rowIndex = 0; //行的起始下标为 0
    20. int colIndex = 0; //列的起始下标为 0
    21. //设置列名
    22. for (int i = 0; i < dt.Columns.Count; i++)
    23. {
    24. //获取第一行的每个单元格
    25. cell = worksheet.Cells[rowIndex, colIndex + i];
    26. //设置列名
    27. cell.PutValue(dt.Columns[i].ColumnName);
    28. //设置字体
    29. cell.Style.Font.Name = "Arial";
    30. //设置字体加粗
    31. cell.Style.Font.IsBold = true;
    32. //设置字体大小
    33. cell.Style.Font.Size = 12;
    34. //设置字体颜色
    35. cell.Style.Font.Color = System.Drawing.Color.Black;
    36. //设置背景色
    37. cell.Style.BackgroundColor = System.Drawing.Color.LightGreen;
    38. }
    39. //跳过第一行,第一行写入了列名
    40. rowIndex++;
    41. //写入数据
    42. for (int i = 0; i < dt.Rows.Count; i++)
    43. {
    44. for (int j = 0; j < dt.Columns.Count; j++)
    45. {
    46. cell = worksheet.Cells[rowIndex + i, colIndex + j];
    47. cell.PutValue(dt.Rows[i][j]);
    48. }
    49. }
    50. //自动列宽
    51. worksheet.AutoFitColumns();
    52. //设置导出文件路径
    53. path = HttpContext.Current.Server.MapPath("Export/");
    54. //设置新建文件路径及名称
    55. string savePath = path + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xlsx";
    56. //创建文件
    57. FileStream file = new FileStream(savePath, FileMode.CreateNew);
    58. //关闭释放流,不然没办法写入数据
    59. file.Close();
    60. file.Dispose();
    61. //保存至指定路径
    62. workbook.Save(savePath);
    63. //或者使用下面的方法,输出到浏览器下载。
    64. //byte[] bytes = workbook.SaveToStream().ToArray();
    65. //OutputClient(bytes);
    66. worksheet = null;
    67. workbook = null;
    68. }
    69. catch(Exception ex)
    70. {
    71. }
    72. }
    1. public void OutputClient(byte[] bytes)
    2. {
    3. HttpContext.Current.Response.Buffer = true;
    4. HttpContext.Current.Response.Clear();
    5. HttpContext.Current.Response.ClearHeaders();
    6. HttpContext.Current.Response.ClearContent();
    7. HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
    8. HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls", DateTime.Now.ToString("yyyy-MM-dd-HH-mm")));
    9. HttpContext.Current.Response.Charset = "GB2312";
    10. HttpContext.Current.Response.ContentEncoding = Encoding.GetEncoding("GB2312");
    11. HttpContext.Current.Response.BinaryWrite(bytes);
    12. HttpContext.Current.Response.Flush();
    13. HttpContext.Current.Response.Close();
    14. }

    C# 导出 Excel 的各种方法总结 - 图5
    设置单元格格式为文本方法:

    1. cell = worksheet.Cells[rowIndex, colIndex + i];
    2. cell.PutValue(colNames[i]);
    3. style = cell.GetStyle();
    4. style.Number = 49; // 49(text|@) 表示为文本
    5. 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 的设计。它在只读数据库中”,那就去掉这个,问题解决。
    C# 导出 Excel 的各种方法总结 - 图6

    1. public void ExportExcel(DataTable dt)
    2. {
    3. OleDbConnection conn = null;
    4. OleDbCommand cmd = null;
    5. Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
    6. Microsoft.Office.Interop.Excel.Workbooks workbooks = excel.Workbooks;
    7. Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(true);
    8. try
    9. {
    10. //设置区域为当前线程的区域
    11. dt.Locale = System.Threading.Thread.CurrentThread.CurrentCulture;
    12. //设置导出文件路径
    13. string path = HttpContext.Current.Server.MapPath("Export/");
    14. //设置新建文件路径及名称
    15. string savePath = path + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xlsx";
    16. //创建文件
    17. FileStream file = new FileStream(savePath, FileMode.CreateNew);
    18. //关闭释放流,不然没办法写入数据
    19. file.Close();
    20. file.Dispose();
    21. //由于使用流创建的 excel 文件不能被正常识别,所以只能使用这种方式另存为一下。
    22. workbook.SaveCopyAs(savePath);
    23. // Excel 2003 版本连接字符串
    24. //string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + savePath + "';Extended Properties='Excel 8.0;HDR=Yes;'";
    25. // Excel 2007 以上版本连接字符串
    26. string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='"+ savePath + "';Extended Properties='Excel 12.0;HDR=Yes;'";
    27. //创建连接对象
    28. conn = new OleDbConnection(strConn);
    29. //打开连接
    30. conn.Open();
    31. //创建命令对象
    32. cmd = conn.CreateCommand();
    33. //获取 excel 所有的数据表。
    34. //new object[] { null, null, null, "Table" }指定返回的架构信息:参数介绍
    35. //第一个参数指定目录
    36. //第二个参数指定所有者
    37. //第三个参数指定表名
    38. //第四个参数指定表类型
    39. DataTable dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });
    40. //因为后面创建的表都会在最后面,所以本想删除掉前面的表,结果发现做不到,只能清空数据。
    41. for (int i = 0; i < dtSheetName.Rows.Count; i++)
    42. {
    43. cmd.CommandText = "drop table [" + dtSheetName.Rows[i]["TABLE_NAME"].ToString() + "]";
    44. cmd.ExecuteNonQuery();
    45. }
    46. //添加一个表,即 Excel 中 sheet 表
    47. 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)";
    48. cmd.ExecuteNonQuery();
    49. for (int i = 0; i < dt.Rows.Count; i++)
    50. {
    51. string values = "";
    52. for (int j = 0; j < dt.Columns.Count; j++)
    53. {
    54. values += "'" + dt.Rows[i][j].ToString() + "',";
    55. }
    56. //判断最后一个字符是否为逗号,如果是就截取掉
    57. if (values.LastIndexOf(',') == values.Length - 1)
    58. {
    59. values = values.Substring(0, values.Length - 1);
    60. }
    61. //写入数据
    62. cmd.CommandText = "insert into " + dt.TableName + " (S_Id,S_StuNo,S_Name,S_Sex,S_Height,S_BirthDate,C_S_Id) values (" + values + ")";
    63. cmd.ExecuteNonQuery();
    64. }
    65. conn.Close();
    66. conn.Dispose();
    67. cmd.Dispose();
    68. //加入下面的方法,把保存的 Excel 文件输出到浏览器下载。需要先关闭连接。
    69. FileInfo fileInfo = new FileInfo(savePath);
    70. OutputClient(fileInfo);
    71. }
    72. catch (Exception ex)
    73. {
    74. }
    75. finally
    76. {
    77. workbook.Close(false, Type.Missing, Type.Missing);
    78. workbooks.Close();
    79. excel.Quit();
    80. Marshal.ReleaseComObject(workbook);
    81. Marshal.ReleaseComObject(workbooks);
    82. Marshal.ReleaseComObject(excel);
    83. workbook = null;
    84. workbooks = null;
    85. excel = null;
    86. GC.Collect();
    87. }
    88. }

    C# 导出 Excel 的各种方法总结 - 图7

    1. public void OutputClient(FileInfo file)
    2. {
    3. HttpResponse response = HttpContext.Current.Response;
    4. response.Buffer = true;
    5. response.Clear();
    6. response.ClearHeaders();
    7. response.ClearContent();
    8. response.ContentType = "application/vnd.ms-excel";
    9. //导出到 .xlsx 格式不能用时,可以试试这个
    10. //HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    11. response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xlsx", DateTime.Now.ToString("yyyy-MM-dd-HH-mm")));
    12. response.Charset = "GB2312";
    13. response.ContentEncoding = Encoding.GetEncoding("GB2312");
    14. response.AddHeader("Content-Length", file.Length.ToString());
    15. response.WriteFile(file.FullName);
    16. response.Flush();
    17. response.Close();
    18. }

    这种方法需要指定一个已经存在的 Excel 文件作为写入数据的模板,不然的话就得使用流创建一个新的 Excel 文件,但是这样是没法识别的,那就需要用到 Microsoft.Office.Interop.Excel.dll 里面的 Microsoft.Office.Interop.Excel.Workbook.SaveCopyAs() 方法另存为一下,这样性能也就更差了。
    使用操作命令创建的表都是在最后面的,前面的也没法删除(我是没有找到方法),当然也可以不再创建,直接写入数据也可以。

    第四种:NPOI
    NPOIPOI 项目的.NET版本,它不使用 Office COM 组件,不需要安装 Microsoft Office,目前支持 Office 2003 和 2007 版本。
    NPOI 是免费开源的,操作也比较方便,下载地址:http://npoi.codeplex.com/
    C# 导出 Excel 的各种方法总结 - 图8

    1. public void ExportExcel(DataTable dt)
    2. {
    3. try
    4. {
    5. //创建一个工作簿
    6. IWorkbook workbook = new HSSFWorkbook();
    7. //创建一个 sheet 表
    8. ISheet sheet = workbook.CreateSheet(dt.TableName);
    9. //创建一行
    10. IRow rowH = sheet.CreateRow(0);
    11. //创建一个单元格
    12. ICell cell = null;
    13. //创建单元格样式
    14. ICellStyle cellStyle = workbook.CreateCellStyle();
    15. //创建格式
    16. IDataFormat dataFormat = workbook.CreateDataFormat();
    17. //设置为文本格式,也可以为 text,即 dataFormat.GetFormat("text");
    18. cellStyle.DataFormat = dataFormat.GetFormat("@");
    19. //设置列名
    20. foreach (DataColumn col in dt.Columns)
    21. {
    22. //创建单元格并设置单元格内容
    23. rowH.CreateCell(col.Ordinal).SetCellValue(col.Caption);
    24. //设置单元格格式
    25. rowH.Cells[col.Ordinal].CellStyle = cellStyle;
    26. }
    27. //写入数据
    28. for (int i = 0; i < dt.Rows.Count; i++)
    29. {
    30. //跳过第一行,第一行为列名
    31. IRow row = sheet.CreateRow(i + 1);
    32. for (int j = 0; j < dt.Columns.Count; j++)
    33. {
    34. cell = row.CreateCell(j);
    35. cell.SetCellValue(dt.Rows[i][j].ToString());
    36. cell.CellStyle = cellStyle;
    37. }
    38. }
    39. //设置导出文件路径
    40. string path = HttpContext.Current.Server.MapPath("Export/");
    41. //设置新建文件路径及名称
    42. string savePath = path + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xls";
    43. //创建文件
    44. FileStream file = new FileStream(savePath, FileMode.CreateNew,FileAccess.Write);
    45. //创建一个 IO 流
    46. MemoryStream ms = new MemoryStream();
    47. //写入到流
    48. workbook.Write(ms);
    49. //转换为字节数组
    50. byte[] bytes = ms.ToArray();
    51. file.Write(bytes, 0, bytes.Length);
    52. file.Flush();
    53. //还可以调用下面的方法,把流输出到浏览器下载
    54. OutputClient(bytes);
    55. //释放资源
    56. bytes = null;
    57. ms.Close();
    58. ms.Dispose();
    59. file.Close();
    60. file.Dispose();
    61. workbook.Close();
    62. sheet = null;
    63. workbook = null;
    64. }
    65. catch(Exception ex)
    66. {
    67. }
    68. }

    C# 导出 Excel 的各种方法总结 - 图9

    1. public void OutputClient(byte[] bytes)
    2. {
    3. HttpResponse response = HttpContext.Current.Response;
    4. response.Buffer = true;
    5. response.Clear();
    6. response.ClearHeaders();
    7. response.ClearContent();
    8. response.ContentType = "application/vnd.ms-excel";
    9. response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls", DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")));
    10. response.Charset = "GB2312";
    11. response.ContentEncoding = Encoding.GetEncoding("GB2312");
    12. response.BinaryWrite(bytes);
    13. response.Flush();
    14. response.Close();
    15. }
    16. // 2007 版本创建一个工作簿
    17. IWorkbook workbook = new XSSFWorkbook();
    18. // 2003 版本创建一个工作簿
    19. IWorkbook workbook = new HSSFWorkbook();

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

    第五种:GridView
    直接使用 GridView 把 DataTable 的数据转换为字符串流,然后输出到浏览器下载。
    C# 导出 Excel 的各种方法总结 - 图10

    1. public void ExportExcel(DataTable dt)
    2. {
    3. HttpResponse response = HttpContext.Current.Response;
    4. response.Buffer = true;
    5. response.Clear();
    6. response.ClearHeaders();
    7. response.ClearContent();
    8. response.ContentType = "application/vnd.ms-excel";
    9. response.AddHeader("content-disposition", string.Format("attachment; filename={0}.xls", DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")));
    10. response.Charset = "GB2312";
    11. response.ContentEncoding = Encoding.GetEncoding("GB2312");
    12. //实例化一个流
    13. StringWriter stringWrite = new StringWriter();
    14. //指定文本输出到流
    15. HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
    16. GridView gv = new GridView();
    17. gv.DataSource = dt;
    18. gv.DataBind();
    19. for (int i = 0; i < dt.Rows.Count; i++)
    20. {
    21. for (int j = 0; j < dt.Columns.Count; j++)
    22. {
    23. //设置每个单元格的格式
    24. gv.Rows[i].Cells[j].Attributes.Add("style", "vnd.ms-excel.numberformat:@");
    25. }
    26. }
    27. //把 GridView 的内容输出到 HtmlTextWriter
    28. gv.RenderControl(htmlWrite);
    29. response.Write(stringWrite.ToString());
    30. response.Flush();
    31. response.Close();
    32. }

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

    第六种:DataGrid
    其实这一种方法和上面的那一种方法几乎是一样的。
    C# 导出 Excel 的各种方法总结 - 图11

    1. public void ExportExcel(DataTable dt)
    2. {
    3. HttpResponse response = HttpContext.Current.Response;
    4. response.Buffer = true;
    5. response.Clear();
    6. response.ClearHeaders();
    7. response.ClearContent();
    8. response.ContentType = "application/vnd.ms-excel";
    9. response.AddHeader("content-disposition", string.Format("attachment; filename={0}.xls", DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")));
    10. response.Charset = "GB2312";
    11. response.ContentEncoding = Encoding.GetEncoding("GB2312");
    12. //实例化一个流
    13. StringWriter stringWrite = new StringWriter();
    14. //指定文本输出到流
    15. HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
    16. DataGrid dg = new DataGrid();
    17. dg.DataSource = dt;
    18. dg.DataBind();
    19. dg.Attributes.Add("style", "vnd.ms-excel.numberformat:@");
    20. //把 DataGrid 的内容输出到 HtmlTextWriter
    21. dg.RenderControl(htmlWrite);
    22. response.Write(stringWrite.ToString());
    23. response.Flush();
    24. response.Close();
    25. }


    第七种:直接使用 IO 流
    第一种方式,使用文件流在磁盘创建一个 Excel 文件,然后使用流写入数据。
    C# 导出 Excel 的各种方法总结 - 图12

    1. public void ExportExcel(DataTable dt)
    2. {
    3. //设置导出文件路径
    4. string path = HttpContext.Current.Server.MapPath("Export/");
    5. //设置新建文件路径及名称
    6. string savePath = path + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xls";
    7. //创建文件
    8. FileStream file = new FileStream(savePath, FileMode.CreateNew, FileAccess.Write);
    9. //以指定的字符编码向指定的流写入字符
    10. StreamWriter sw = new StreamWriter(file, Encoding.GetEncoding("GB2312"));
    11. StringBuilder strbu = new StringBuilder();
    12. //写入标题
    13. for (int i = 0; i < dt.Columns.Count; i++)
    14. {
    15. strbu.Append(dt.Columns[i].ColumnName.ToString() + "\t");
    16. }
    17. //加入换行字符串
    18. strbu.Append(Environment.NewLine);
    19. //写入内容
    20. for (int i = 0; i < dt.Rows.Count; i++)
    21. {
    22. for (int j = 0; j < dt.Columns.Count; j++)
    23. {
    24. strbu.Append(dt.Rows[i][j].ToString() + "\t");
    25. }
    26. strbu.Append(Environment.NewLine);
    27. }
    28. sw.Write(strbu.ToString());
    29. sw.Flush();
    30. file.Flush();
    31. sw.Close();
    32. sw.Dispose();
    33. file.Close();
    34. file.Dispose();
    35. }

    第二种方式,这种方式就不需要在本地磁盘创建文件了,首先创建一个内存流写入数据,然后输出到浏览器下载。
    C# 导出 Excel 的各种方法总结 - 图13

    1. public void ExportExcel(DataTable dt)
    2. {
    3. //创建一个内存流
    4. MemoryStream ms = new MemoryStream();
    5. //以指定的字符编码向指定的流写入字符
    6. StreamWriter sw = new StreamWriter(ms, Encoding.GetEncoding("GB2312"));
    7. StringBuilder strbu = new StringBuilder();
    8. //写入标题
    9. for (int i = 0; i < dt.Columns.Count; i++)
    10. {
    11. strbu.Append(dt.Columns[i].ColumnName.ToString() + "\t");
    12. }
    13. //加入换行字符串
    14. strbu.Append(Environment.NewLine);
    15. //写入内容
    16. for (int i = 0; i < dt.Rows.Count; i++)
    17. {
    18. for (int j = 0; j < dt.Columns.Count; j++)
    19. {
    20. strbu.Append(dt.Rows[i][j].ToString() + "\t");
    21. }
    22. strbu.Append(Environment.NewLine);
    23. }
    24. sw.Write(strbu.ToString());
    25. sw.Flush();
    26. sw.Close();
    27. sw.Dispose();
    28. //转换为字节数组
    29. byte[] bytes = ms.ToArray();
    30. ms.Close();
    31. ms.Dispose();
    32. OutputClient(bytes);
    33. }

    C# 导出 Excel 的各种方法总结 - 图14

    1. public void OutputClient(byte[] bytes)
    2. {
    3. HttpResponse response = HttpContext.Current.Response;
    4. response.Buffer = true;
    5. response.Clear();
    6. response.ClearHeaders();
    7. response.ClearContent();
    8. response.ContentType = "application/vnd.ms-excel";
    9. response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls", DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")));
    10. response.Charset = "GB2312";
    11. response.ContentEncoding = Encoding.GetEncoding("GB2312");
    12. response.BinaryWrite(bytes);
    13. response.Flush();
    14. response.Close();
    15. }

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

    第八种:EPPlus
    EPPlus 是一个使用 Open Office Xml 格式(xlsx)读取和写入 Excel 2007/2010 文件的 .net 库,并且免费开源。
    下载地址:http://epplus.codeplex.com/
    第一种方式,先使用文件流在磁盘创建一个 Excel 文件,然后打开这个文件写入数据并保存。
    C# 导出 Excel 的各种方法总结 - 图15

    1. public void ExportExcel(DataTable dt)
    2. {
    3. //新建一个 Excel 文件
    4. string path = HttpContext.Current.Server.MapPath("Export/");
    5. string filePath = path + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xlsx";
    6. FileStream fileStream = new FileStream(filePath, FileMode.Create);
    7. //加载这个 Excel 文件
    8. ExcelPackage package = new ExcelPackage(fileStream);
    9. // 添加一个 sheet 表
    10. ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(dt.TableName);
    11. int rowIndex = 1; // 起始行为 1
    12. int colIndex = 1; // 起始列为 1
    13. //设置列名
    14. for (int i = 0; i < dt.Columns.Count; i++)
    15. {
    16. worksheet.Cells[rowIndex, colIndex + i].Value = dt.Columns[i].ColumnName;
    17. //自动调整列宽,也可以指定最小宽度和最大宽度
    18. worksheet.Column(colIndex + i).AutoFit();
    19. }
    20. // 跳过第一列列名
    21. rowIndex++;
    22. //写入数据
    23. for (int i = 0; i < dt.Rows.Count; i++)
    24. {
    25. for (int j = 0; j < dt.Columns.Count; j++)
    26. {
    27. worksheet.Cells[rowIndex + i, colIndex + j].Value = dt.Rows[i][j].ToString();
    28. }
    29. //自动调整行高
    30. worksheet.Row(rowIndex + i).CustomHeight = true;
    31. }
    32. //设置字体,也可以是中文,比如:宋体
    33. worksheet.Cells.Style.Font.Name = "Arial";
    34. //字体加粗
    35. worksheet.Cells.Style.Font.Bold = true;
    36. //字体大小
    37. worksheet.Cells.Style.Font.Size = 12;
    38. //字体颜色
    39. worksheet.Cells.Style.Font.Color.SetColor(System.Drawing.Color.Black);
    40. //单元格背景样式,要设置背景颜色必须先设置背景样式
    41. worksheet.Cells.Style.Fill.PatternType = ExcelFillStyle.Solid;
    42. //单元格背景颜色
    43. worksheet.Cells.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.DimGray);
    44. //设置单元格所有边框样式和颜色
    45. worksheet.Cells.Style.Border.BorderAround(ExcelBorderStyle.Thin, System.Drawing.ColorTranslator.FromHtml("#0097DD"));
    46. //单独设置单元格四边框 Top、Bottom、Left、Right 的样式和颜色
    47. //worksheet.Cells.Style.Border.Top.Style = ExcelBorderStyle.Thin;
    48. //worksheet.Cells.Style.Border.Top.Color.SetColor(System.Drawing.Color.Black);
    49. //垂直居中
    50. worksheet.Cells.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
    51. //水平居中
    52. worksheet.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
    53. //单元格是否自动换行
    54. worksheet.Cells.Style.WrapText = false;
    55. //设置单元格格式为文本
    56. worksheet.Cells.Style.Numberformat.Format = "@";
    57. //单元格自动适应大小
    58. worksheet.Cells.Style.ShrinkToFit = true;
    59. package.Save();
    60. fileStream.Close();
    61. fileStream.Dispose();
    62. worksheet.Dispose();
    63. package.Dispose();
    64. }

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

    1. public void ExportExcel(DataTable dt)
    2. {
    3. //新建一个 Excel 工作簿
    4. ExcelPackage package = new ExcelPackage();
    5. // 添加一个 sheet 表
    6. ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(dt.TableName);
    7. int rowIndex = 1; // 起始行为 1
    8. int colIndex = 1; // 起始列为 1
    9. //设置列名
    10. for (int i = 0; i < dt.Columns.Count; i++)
    11. {
    12. worksheet.Cells[rowIndex, colIndex + i].Value = dt.Columns[i].ColumnName;
    13. //自动调整列宽,也可以指定最小宽度和最大宽度
    14. worksheet.Column(colIndex + i).AutoFit();
    15. }
    16. // 跳过第一列列名
    17. rowIndex++;
    18. //写入数据
    19. for (int i = 0; i < dt.Rows.Count; i++)
    20. {
    21. for (int j = 0; j < dt.Columns.Count; j++)
    22. {
    23. worksheet.Cells[rowIndex + i, colIndex + j].Value = dt.Rows[i][j].ToString();
    24. }
    25. //自动调整行高
    26. worksheet.Row(rowIndex + i).CustomHeight = true;
    27. }
    28. //设置字体,也可以是中文,比如:宋体
    29. worksheet.Cells.Style.Font.Name = "Arial";
    30. //字体加粗
    31. worksheet.Cells.Style.Font.Bold = true;
    32. //字体大小
    33. worksheet.Cells.Style.Font.Size = 12;
    34. //字体颜色
    35. worksheet.Cells.Style.Font.Color.SetColor(System.Drawing.Color.Black);
    36. //单元格背景样式,要设置背景颜色必须先设置背景样式
    37. worksheet.Cells.Style.Fill.PatternType = ExcelFillStyle.Solid;
    38. //单元格背景颜色
    39. worksheet.Cells.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.DimGray);
    40. //设置单元格所有边框样式和颜色
    41. worksheet.Cells.Style.Border.BorderAround(ExcelBorderStyle.Thin, System.Drawing.ColorTranslator.FromHtml("#0097DD"));
    42. //单独设置单元格四边框 Top、Bottom、Left、Right 的样式和颜色
    43. //worksheet.Cells.Style.Border.Top.Style = ExcelBorderStyle.Thin;
    44. //worksheet.Cells.Style.Border.Top.Color.SetColor(System.Drawing.Color.Black);
    45. //垂直居中
    46. worksheet.Cells.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
    47. //水平居中
    48. worksheet.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
    49. //单元格是否自动换行
    50. worksheet.Cells.Style.WrapText = false;
    51. //设置单元格格式为文本
    52. worksheet.Cells.Style.Numberformat.Format = "@";
    53. //单元格自动适应大小
    54. worksheet.Cells.Style.ShrinkToFit = true;
    55. ////第一种保存方式
    56. //string path1 = HttpContext.Current.Server.MapPath("Export/");
    57. //string filePath1 = path1 + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xlsx";
    58. //FileStream fileStream1 = new FileStream(filePath1, FileMode.Create);
    59. ////保存至指定文件
    60. //FileInfo fileInfo = new FileInfo(filePath1);
    61. //package.SaveAs(fileInfo);
    62. ////第二种保存方式
    63. //string path2 = HttpContext.Current.Server.MapPath("Export/");
    64. //string filePath2 = path2 + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xlsx";
    65. //FileStream fileStream2 = new FileStream(filePath2, FileMode.Create);
    66. ////写入文件流
    67. //package.SaveAs(fileStream2);
    68. //创建一个内存流,然后转换为字节数组,输出到浏览器下载
    69. //MemoryStream ms = new MemoryStream();
    70. //package.SaveAs(ms);
    71. //byte[] bytes = ms.ToArray();
    72. //也可以直接获取流
    73. //Stream stream = package.Stream;
    74. //也可以直接获取字节数组
    75. byte[] bytes = package.GetAsByteArray();
    76. //调用下面的方法输出到浏览器下载
    77. OutputClient(bytes);
    78. worksheet.Dispose();
    79. package.Dispose();
    80. }

    C# 导出 Excel 的各种方法总结 - 图17

    1. public void OutputClient(byte[] bytes)
    2. {
    3. HttpResponse response = HttpContext.Current.Response;
    4. response.Buffer = true;
    5. response.Clear();
    6. response.ClearHeaders();
    7. response.ClearContent();
    8. //response.ContentType = "application/ms-excel";
    9. response.ContentType = "application/vnd.openxmlformats - officedocument.spreadsheetml.sheet";
    10. response.AppendHeader("Content-Type", "text/html; charset=GB2312");
    11. response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xlsx", DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")));
    12. response.Charset = "GB2312";
    13. response.ContentEncoding = Encoding.GetEncoding("GB2312");
    14. response.BinaryWrite(bytes);
    15. response.Flush();
    16. response.End();
    17. }

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