方法1:微软推荐服务器需安装Excel型
依赖:
软件:Office Excel 2007-2013
引用:Microsoft Office 14.0 Object Library
1.1 数据准备
1 //Excel文件名称 2 string ExcelName = System.DateTime.Now.ToString("yyMMdd") + "退款结算单.xlsx"; 3 4 /// <summary> 5 /// 批量退款 6 /// </summary> 7 /// <param name="sender"></param> 8 /// <param name="e"></param> 9 protected void Button1_Click(object sender, EventArgs e) 10 { 11 DataSet ds = new DataSet(); 12 13 DataTable dt1 = new DataTable(); 14 dt1.Columns.Add("批次号"); 15 dt1.Columns.Add("总金额(元)"); 16 dt1.Columns.Add("总笔数"); 17 18 DataRow row1 = dt1.NewRow(); 19 20 row1 = dt1.NewRow(); 21 row1["批次号"] = "20150425001"; 22 row1["总金额(元)"] = "0.03"; 23 row1["总笔数"] = "1"; 24 dt1.Rows.Add(row1); 25 26 ds.Tables.Add(dt1); 27 28 DataTable dt2 = new DataTable(); 29 dt2.Columns.Add("商户订单号"); 30 dt2.Columns.Add("支付宝交易号"); 31 dt2.Columns.Add("退款金额"); 32 dt2.Columns.Add("退款备注"); 33 34 DataRow row2 = dt2.NewRow(); 35 36 row2 = dt2.NewRow(); 37 row2["商户订单号"] = "D150418092109-40"; 38 row2["支付宝交易号"] = "2015041800001000770049196543"; 39 row2["退款金额"] = "0.02"; 40 row2["退款备注"] = "导入excel测试"; 41 dt2.Rows.Add(row2); 42 43 ds.Tables.Add(dt2); 44 45 46 doExport(ds, Server.MapPath(ExcelName)); 47 }
1.2 数据写入
1 private Microsoft.Office.Interop.Excel.Application _Excel = null; 2 3 /// <summary> 4 /// 将 DataSet 数据写入 _Excel 5 /// </summary> 6 /// <param name="ds"></param> 7 /// <param name="strExcelFileName"></param> 8 private void doExport(DataSet ds, string strExcelFileName) 9 { 10 int rowIndex = 1;//当前行数 11 int colIndex = 0;//当前列数 12 13 14 _Excel = new Microsoft.Office.Interop.Excel.Application(); 15 _Excel.Application.Workbooks.Add(true); 16 17 18 for (int i = 0; i < ds.Tables.Count; i++) 19 { 20 DataTable table = ds.Tables[i]; 21 colIndex = 0;//列初始化 22 // 列标题 23 foreach (DataColumn col in table.Columns) 24 { 25 colIndex++; 26 _Excel.Cells[rowIndex, colIndex] = col.ColumnName; 27 } 28 29 // 内容 30 foreach (DataRow row in table.Rows) 31 { 32 rowIndex++; 33 colIndex = 0; 34 foreach (DataColumn col in table.Columns) 35 { 36 colIndex++; 37 _Excel.Cells[rowIndex, colIndex] = "'" + row[col.ColumnName].ToString(); 38 } 39 } 40 41 rowIndex++;//行+1 防止table又多个情况 42 } 43 44 _Excel.Visible = false; 45 // 保存文件 46 SaveToDisk(strExcelFileName); 47 48 _Excel.Quit(); 49 _Excel = null; 50 }
1.3 数据导出
1 /// <summary> 2 /// 导出方法 3 /// </summary> 4 /// <param name="path">路径</param> 5 private void SaveToDisk(string path) 6 { 7 if (!string.IsNullOrEmpty(path)) 8 { 9 System.IO.FileInfo info = new FileInfo(path); 10 if (!info.Exists) 11 { 12 _Excel.ActiveWorkbook.SaveCopyAs(path); 13 14 /* 15 微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite 16 下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。 17 代码如下: 18 */ 19 Response.ContentType = "text/xml"; 20 Response.AddHeader("Content-Disposition", "attachment;filename=" + ExcelName); 21 string filename = Server.MapPath(ExcelName); 22 Response.TransmitFile(filename); 23 } 24 else 25 { 26 info.Delete(); 27 _Excel.DisplayAlerts = false; 28 _Excel.AlertBeforeOverwriting = false; 29 _Excel.ActiveWorkbook.SaveCopyAs(path); 30 } 31 } 32 }
方法2:第三方组件NPOI(2.0版本后受到微软支持)
依赖:
NPOI.dll
NPOI.OOXML.dll
NPOI.OpenXml4Net.dll
NPOI.OpenXmlFormats.dll
NPOI下载地址 - http://npoi.codeplex.com/releases
2.1 简单例子:
1 using NPOI.XSSF.UserModel; 2 using NPOI.SS.UserModel; 3 4 //创建全新的Workbook 5 IWorkbook workbook = new XSSFWorkbook(); 6 7 //创建Sheet 8 workbook.CreateSheet("Sheet1"); 9 10 //写入一个简单日期 并设置格式 11 ISheet sheet = hssfworkbook.CreateSheet("Sheet1"); 12 ICell cell = sheet.CreateRow(0).CreateCell(0); 13 cell.SetCellValue(new DateTime(2008,5,5)); 14 //set date format 15 ICellStyle cellStyle = hssfworkbook.CreateCellStyle(); 16 IDataFormat format = hssfworkbook.CreateDataFormat(); 17 cellStyle.DataFormat = format.GetFormat("yyyy年m月d日"); 18 cell.CellStyle=cellStyle; 19 20 //保存Workbook 21 FileStream sw = File.Create("test.xlsx"); 22 workbook.Write(sw); 23 sw.Close();
这样就好了。
2.2 复杂例子(包含下载功能)
/// <summary> /// 导出Excel /// </summary> /// <param name="ExcelName">文件名称</param> public void NPOIExcel(DataSet ds, string ExcelName) { int row_index = 0; //创建全新的Workbook IWorkbook workbook = new XSSFWorkbook(); //创建Sheet workbook.CreateSheet("Sheet1"); //根据Sheet名字获得Sheet对象 ISheet sheet = workbook.GetSheet("Sheet1"); IRow row; row = sheet.CreateRow(row_index); for (int i = 0; i < ds.Tables.Count; i++) { //写入标题 for (int j = 0; j < ds.Tables[i].Columns.Count; j++) { row.CreateCell(j).SetCellValue(ds.Tables[i].Columns[j].Caption.ToString()); } row = sheet.CreateRow(++row_index); //写入数据 foreach (DataRow r in ds.Tables[i].Select()) { for (int j = 0; j < ds.Tables[i].Columns.Count; j++) { row.CreateCell(j).SetCellValue(r[j].ToString()); } row = sheet.CreateRow(++row_index); } } //保存Workbook方式一: 以文件形式保存到服务器中(每次导出都会生成一个文件,慎重使用) FileStream sw = File.Create(Server.MapPath("file/" +ExcelName)); workbook.Write(sw); sw.Close(); //保存Workbook方式二: 保存到内存流中 var stream = new MemoryStream(); workbook.Write(stream); //文件下载 Response.Clear(); Response.Charset = "utf-8"; Response.Buffer = true; this.EnableViewState = false; Response.ContentEncoding = System.Text.Encoding.UTF8; Response.ContentType = "application/vnd.ms-excel"; Response.AddHeader("Content-Disposition", "attachment;filename="+ExcelName); string filename =Server.MapPath("file/" + ExcelName);//通过服务器文件下载 Response.WriteFile(filename); Response.BinaryWrite(StreamToBytes(stream));//通过内存流下载,StreamToBytes为Stream转byte[] 方法 可查看我其他随笔有 Response.Flush(); Response.Close(); Response.End(); }