• (原创)将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(@"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

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

  • 相关阅读:
    程序员应该看的书
    linux下grep命令详解
    apache基本配置
    shell脚本从windows下发送到linux下运行失败的问题
    nginx服务器的安装和配置基础
    linux下ps命令用法
    apache的python部署
    《我刀刻我心——关羽往事》新书发布会在京举行
    C++图书中的王者
    C++应用程序性能优化
  • 原文地址:https://www.cnblogs.com/AlexZha/p/6651787.html
Copyright © 2020-2023  润新知