『QQ:1353814576』

C# 引用NPOI组件实现泛型实体集合导出excel表文件通用方法


最近在做iis日志分析小工具统计功能的时候涉及了excel表格文件的导出相关功能,需要根据不同的实体集合类属性自动生成字段列生成相应的表格(属性名作为字段名,属性值作为列值),最早这块开发的的时候用的是微软的Microsoft.Office.Interop.Excel组件居多,但这个组件使用期间有诸多问题,最后选择了NPOI这个三方库来实现基本满足了我的需求。

下面是一个泛型实体集合自动生成excel的通用方法类 可以自动将实体集合转换成表格

 public async Task<bool> SaveLogExcel<T>(string fileName, List<T> dataList) where T : class
        {
            return await Task.Run(async () =>
             {
                 using (FileStream file = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
                 {
                     IWorkbook workBook;
                     //【1】基于NPOI创建工作簿和工作表对象
                     if (fileName.EndsWith(".xlsx", StringComparison.InvariantCultureIgnoreCase)) {
                         //2007以上版本
                         workBook = new XSSFWorkbook();
                     }
                     else
                     {   //2007以下版本
                         workBook = new HSSFWorkbook(file);
                     }

                     ISheet sheet = workBook.CreateSheet("IIS日志记录");

                     Type type = typeof(T);
                     var demo = dataList.FirstOrDefault();
                     PropertyInfo[] propertyArry = type.GetProperties().Where(e =>
                     {
                         var val = e.GetValue(demo);
                         bool success = val is String || val is Int32 || val is Boolean;//筛选特定类型过滤掉不需要的属性
                         return success;

                     }).ToArray();//获取类型的公共属性


                     //创建字段
                     var topRow = sheet.CreateRow(0);
                     for (int i = 0; i < propertyArry.Length; i++)
                     {
                         var p = propertyArry[i];
                         ICell cell = topRow.CreateCell(i);

                         cell.SetCellValue(p.Name);
                     }

                     for (int i = 0; i < dataList.Count; i++)
                     {
                         var lineNo = i + 1;
                         IRow row = sheet.CreateRow(lineNo);

                         T model = dataList[i];    //根据泛型找到具体化的实体对象
                         for (int col = 0; col < propertyArry.Length; col++)
                         {
                             var p = propertyArry[col];
                             var value = p.GetValue(model);//获取属性值

                             var cell = row.CreateCell(col);

                             string valueStr = "";
                             if (value is null)
                             {

                             }
                             else
                             {
                                 valueStr = value.ToString();
                             }
                             cell.SetCellValue(valueStr);  //赋值
                         }
                     }
                     workBook.Write(file);
                     return true;
                 }
             });
        }

调用例子:

bool success = await this.SaveLogExcel<LogModel>(saveFileDialog.FileName, this.LogAnalysisViewData.DataSource.ToList());