今天先介绍一个关于导出数据的例子,以Excel为模板。直接进入正题了。
1.操作Excel的动态链接库
2.建立操作动态链接库的共通类,方便调用。(ExcelHelper)
具体如下:
View Code
1 using System; 2 using System.Data; 3 using System.Configuration; 4 using System.Linq; 5 using System.Web; 6 using System.Web.Security; 7 using System.Web.UI; 8 using System.Web.UI.HtmlControls; 9 using System.Web.UI.WebControls; 10 using System.Web.UI.WebControls.WebParts; 11 using System.Xml.Linq; 12 using System.IO; 13 using System.Reflection; 14 using System.Diagnostics; 15 using System.Collections; 16 17 /// <summary> 18 ///ExcelHelper 的摘要说明 19 /// </summary> 20 public class ExcelHelper 21 { 22 private string reportModelPath = null; 23 private string outPutFilePath = null; 24 private object missing = Missing.Value; 25 Excel.Application app; 26 Excel.Workbook workBook; 27 Excel.Worksheet workSheet; 28 Excel.Range range; 29 30 /// <summary> 31 /// 获取或设置报表模板路径 32 /// </summary> 33 public string ReportModelPath 34 { 35 get { return reportModelPath; } 36 set { reportModelPath = value; } 37 } 38 39 /// <summary> 40 /// 获取或设置输出路径 41 /// </summary> 42 public string OutPutFilePath 43 { 44 get { return outPutFilePath; } 45 set { outPutFilePath = value; } 46 } 47 48 49 public ExcelHelper() 50 { 51 // 52 //TODO: 在此处添加构造函数逻辑 53 // 54 } 55 56 /// <summary> 57 /// 带参ExcelHelper构造函数 58 /// </summary> 59 /// <param name="reportModelPath">报表模板路径</param> 60 /// <param name="outPutFilePath">输出路径</param> 61 public ExcelHelper(string reportModelPath, string outPutFilePath) 62 { 63 //路径验证 64 if (null == reportModelPath || ("").Equals(reportModelPath)) 65 throw new Exception("报表模板路径不能为空!"); 66 if (null == outPutFilePath || ("").Equals(outPutFilePath)) 67 throw new Exception("输出路径不能为空!"); 68 if (!File.Exists(reportModelPath)) 69 throw new Exception("报表模板路径不存在!"); 70 71 //设置路径值 72 this.ReportModelPath = reportModelPath; 73 this.OutPutFilePath = outPutFilePath; 74 75 //创建一个应用程序对象 76 app = new Excel.ApplicationClass(); 77 78 //打开模板文件,获取WorkBook对象 79 workBook = app.Workbooks.Open(reportModelPath, missing, missing, missing, missing, missing, missing, 80 missing, missing, missing, missing, missing, missing); 81 82 //得到WorkSheet对象 83 workSheet = workBook.Sheets.get_Item(1) as Excel.Worksheet; 84 } 85 86 /// <summary> 87 /// 给单元格设值 88 /// </summary> 89 /// <param name="rowIndex">行索引</param> 90 /// <param name="colIndex">列索引</param> 91 /// <param name="content">填充的内容</param> 92 public void SetCells(int rowIndex,int colIndex,object content) 93 { 94 if (null != content) 95 { 96 content = content.ToString(); 97 } 98 else 99 { 100 content = string.Empty; 101 } 102 103 try 104 { 105 workSheet.Cells[rowIndex, colIndex] = content; 106 } 107 catch 108 { 109 GC(); 110 throw new Exception("向单元格[" + rowIndex + "," + colIndex + "]写数据出错!"); 111 } 112 } 113 114 /// <summary> 115 /// 保存文件 116 /// </summary> 117 public void SaveFile() 118 { 119 try 120 { 121 workBook.SaveAs(outPutFilePath, missing, missing, missing, missing, missing, 122 Excel.XlSaveAsAccessMode.xlExclusive, missing, missing, missing, missing); 123 } 124 catch 125 { 126 throw new Exception("保存至文件失败!"); 127 } 128 finally 129 { 130 Dispose(); 131 } 132 } 133 134 /// <summary> 135 /// 垃圾回收处理 136 /// </summary> 137 protected void GC() 138 { 139 if (null != app) 140 { 141 int generation = 0; 142 System.Runtime.InteropServices.Marshal.ReleaseComObject(app); 143 144 generation = System.GC.GetGeneration(app); 145 System.GC.Collect(generation); 146 app = null; 147 missing = null; 148 } 149 } 150 151 /// <summary> 152 /// 释放资源 153 /// </summary> 154 protected void Dispose() 155 { 156 workBook.Close(null, null, null); 157 app.Workbooks.Close(); 158 app.Quit(); 159 160 if (null != workSheet) 161 { 162 System.Runtime.InteropServices.Marshal.ReleaseComObject(workSheet); 163 workSheet = null; 164 } 165 if (workBook != null) 166 { 167 System.Runtime.InteropServices.Marshal.ReleaseComObject(workBook); 168 workBook = null; 169 } 170 if (app != null) 171 { 172 int generation = 0; 173 System.Runtime.InteropServices.Marshal.ReleaseComObject(app); 174 generation = System.GC.GetGeneration(app); 175 System.GC.Collect(generation); 176 app = null; 177 missing = null; 178 } 179 } 180 }
通过ExcelHelper类提供的SetCells()和SaveFile()方法可以给Excel单元格赋值并保存到临时文件夹内。仅供参考。
3.调用
因为这里需要用到导出模板,所以需要先建立模板。具体如下:、
View Code
1 /// <summary> 2 /// 导出数据 3 /// </summary> 4 protected void Export_Data() 5 { 6 int ii = 0; 7 //取得报表模板文件路径 8 string reportModelPath = HttpContext.Current.Server.MapPath("ReportModel/导出订单模板.csv"); 9 //导出报表文件名 10 fileName = string.Format("{0}-{1}{2}.csv", "导出订单明细", DateTime.Now.ToString("yyyyMMdd"), GetRndNum(3)); 11 //导出文件路径 12 string outPutFilePath = HttpContext.Current.Server.MapPath("Temp_Down/" + fileName); 13 //创建Excel对象 14 ExcelHelper excel = new ExcelHelper(reportModelPath, outPutFilePath); 15 16 SqlDataReader sdr = Get_Data(); 17 while (sdr.Read()) 18 { 19 ii++; 20 excel.SetCells(1 + ii, 1, ii); 21 excel.SetCells(1 + ii, 2, sdr["C_Name"]); 22 excel.SetCells(1 + ii, 3, sdr["C_Mtel"]); 23 excel.SetCells(1 + ii, 4, sdr["C_Tel"]); 24 excel.SetCells(1 + ii, 5, sdr["C_Province"]); 25 excel.SetCells(1 + ii, 6, sdr["C_Address"]); 26 excel.SetCells(1 + ii, 7, sdr["C_Postcode"]); 27 } 28 sdr.Close(); 29 excel.SaveFile(); 30 }
关于导出就简单写到这,另外下一节讲介绍如何通过这个类库上传Excel文件。