(原创)将Datatable数据按照Excel模板格式导出

最近遇到一个问题,就是导出数据的时候需要自定义的表头,如图

 

如果自己用代码写表头的话,可能会有点复杂,而且代码量很多,所以我就想了一个办法,直接在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

 

本文内容为原创,转载请注明出处!

 

posted @ 2017-03-31 15:53  IT_吴彦祖  阅读(1797)  评论(0编辑  收藏  举报