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());