最近遇到一个问题,就是导出数据的时候需要自定义的表头,如图
如果自己用代码写表头的话,可能会有点复杂,而且代码量很多,所以我就想了一个办法,直接在Excel里面把表头定义好,然后把数据写入Excel模板里面,按模板格式导出。
需要引入的文件
NPOI组件:
还有就是这个,应该是用来压缩的,而且需要注意的一点就是,版本一定要和配置里面的一致,不然会报错
下面开始代码实现:
首先创建一个Excelhelper类,里面实现了将Datatable数据写入模板的逻辑代码
1 public class ExcelHelper : IDisposable 2 { 3 4 private string fileName = null; //文件名 5 private IWorkbook workbook = null; 6 private FileStream fs = null; 7 private bool disposed; 8 public ExcelHelper(string fileName) 9 { 10 this.fileName = fileName; 11 disposed = false; 12 } 13 14 /// <summary> 15 /// 将DataTable数据导入到excel中 16 /// </summary> 17 /// <param name="data">要导入的数据</param> 18 /// <param name="count">excel表中对应第一行数据的索引</param> 19 /// <param name="sheetName">要导入的excel的sheet的名称</param> 20 /// <returns>导入数据行数(包含列名那一行)</returns> 21 public Stream DataTableToExcel(DataTable data, string sheetName, int count) 22 { 23 24 ISheet sheet = null;
//导出的Excel存放路径 25 string filePath = "C:\" + DateTime.Now.Ticks + ".xlsx"; 26 fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); 27 if (fileName.IndexOf(".xlsx") > 0) // 2007版本 28 workbook = new XSSFWorkbook(fs); 29 else if (fileName.IndexOf(".xls") > 0) // 2003版本 30 workbook = new HSSFWorkbook(fs); 31 32 sheet = workbook.GetSheet(sheetName); 33 if (sheet == null) 34 sheet = workbook.GetSheetAt(0); 35 for (int k = 0; k < data.Rows.Count; k++) 36 { 37 IRow row = sheet.CreateRow(count + k); 38 for (int i = 0; i < data.Columns.Count; i++) 39 { 40 41 row.CreateCell(i).SetCellValue(data.Rows[k][i].ToString()); 42 } 43 44 } 45 46 using (Stream fswrite = new FileStream(filePath, FileMode.Create)) 47 { 48 49 workbook.Write(fswrite); 50 51 return fswrite; 52 } 53 54 } 55 56 57 58 public void Dispose() 59 { 60 Dispose(true); 61 GC.SuppressFinalize(this); 62 } 63 64 protected virtual void Dispose(bool disposing) 65 { 66 if (!this.disposed) 67 { 68 if (disposing) 69 { 70 if (fs != null) 71 fs.Close(); 72 } 73 74 fs = null; 75 disposed = true; 76 } 77 } 78 }
然后就可以直接用了
ExcelHelper excelHepler = new ExcelHelper(System.AppDomain.CurrentDomain.BaseDirectory.Replace(@"binDebug", @"Templateexcel模板.xlsx")); excelHepler.DataTableToExcel(dt, "Sheet1", 3);
用的时候需要注意以下几点,
1,实例化Excelheper类的时候需要传入模板所在路径
System.AppDomain.CurrentDomain.BaseDirectory.Replace(@"binDebug", @"Templateexcel模板.xlsx") 这句代码就是为了获得Excel模板所在路径
2,然后再调用里面的DataTableToExcel方法时需要传入需要导出的Datatable和第一行数据所在行的索引
比如你的Excel模板中,前三行都是Title,那么你需要在第四行开始写入数据,所以就应该传入下标“3”
到此,就实现了导出数据到Excel模板功能,是不是非常简单呢~O(∩_∩)O
本文内容为原创,转载请注明出处!