最近遇到一個問題,就是導出數據的時候需要自定義的表頭,如圖
如果自己用代碼寫表頭的話,可能會有點復雜,而且代碼量很多,所以我就想了一個辦法,直接在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(@"bin\Debug\", @"Template\excel模板.xlsx")); excelHepler.DataTableToExcel(dt, "Sheet1", 3);
用的時候需要注意以下幾點,
1,實例化Excelheper類的時候需要傳入模板所在路徑
System.AppDomain.CurrentDomain.BaseDirectory.Replace(@"bin\Debug\", @"Template\excel模板.xlsx") 這句代碼就是為了獲得Excel模板所在路徑
2,然后再調用里面的DataTableToExcel方法時需要傳入需要導出的Datatable和第一行數據所在行的索引
比如你的Excel模板中,前三行都是Title,那么你需要在第四行開始寫入數據,所以就應該傳入下標“3”
到此,就實現了導出數據到Excel模板功能,是不是非常簡單呢~O(∩_∩)O
本文內容為原創,轉載請注明出處!