最近在做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());