C# 引用NPOI组件实现泛型实体集合转换成表格Excel

NPOI
163
NPOI
C#
泛型实体
导出excel表

C# 引用NPOI组件实现泛型实体集合转换成表格Excel

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

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

 public async Task<bool> SaveLogExcel(string fileName, List 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(saveFileDialog.FileName, this.LogAnalysisViewData.DataSource.ToList());
CefSharp 运行缓存数据量过大占完系统磁盘空间
微信公众平台C#开发系列(十五): 模板消息-删除消息模板
C# MailKit+MimeKit+QQ邮箱 实现发送邮件的简单例子
HTTP 错误 403.14 - Forbidden的解决办法
.NET开发Bitmap GetPixel,SetPixel处理太慢的替代解决办法
C# 局域网通过Ip获取远程电脑的计算机名称和别名
C#如何利用(Windows Script Host)COM组件来创建快捷方式
.NET5 webApi项目接收HttpPost文本流数据
C# 判断端口是否正在被其他程序使用着
WPF 异步线程操作界面控件
C# .NET中 使用GDI+ 添加图形水印
html5手机端禁止用户浏览器缩放页面的代码
暂无相关内容...
基于Wpf+MVVM实现的完整截图软件的框选区域效果源码
 远程控制软件Radmin3.4 中文完整版(控制端和被控端)
C#基于ffmpeg.exe实现视频添加字幕转GIF表情包的源码
基于WPF实现系统桌面录制gif+批量添加水印工具源码
[人脸检测]基于C#OpenCvSharp+haarcascade人脸、人眼模型实现人脸检测源码
基于.NET4.0实现的目录文件新增监视并自动化上传至ftp完整流程工具源码
暂无章节内容...
免责声明 部分转载分享内容若侵犯您的权益,还请 邮件联系 侵删