using System.Reflection;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.XSSF.UserModel;
namespace Infrastructure.Utilities.Excel;
public class ExcelExporter
{
///
///
///
///
///
///
public static Response ExportToExcel(IEnumerable data, string headerTitle) where T : class
{
var workbook = new XSSFWorkbook();
var sheet = workbook.CreateSheet("Sheet1");
// 获取实体类的属性信息,并筛选出标记了ExcelColumnAttribute的特性
PropertyInfo[] properties = typeof(T).GetProperties()
.Where(p => p.GetCustomAttribute() != null)
.ToArray();
var rowIndex = 0;
if (!string.IsNullOrEmpty(headerTitle))
{
var headerTitleRow = sheet.CreateRow(rowIndex++);
sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, properties.Length - 1));
var cell = headerTitleRow.CreateCell(0);
cell.SetCellValue(headerTitle);
var style = workbook.CreateCellStyle();
var font = workbook.CreateFont();
font.FontName = "方正小标宋简体";
font.FontHeightInPoints = 36;
font.IsBold = true;
style.SetFont(font);
style.BorderBottom = BorderStyle.Thin;
style.BorderLeft = BorderStyle.Thin;
style.BorderRight = BorderStyle.Thin;
style.BorderTop = BorderStyle.Thin;
style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
style.VerticalAlignment = VerticalAlignment.Center;
style.WrapText = true;
cell.CellStyle = style;
}
// 写入表头
var headerRow = sheet.CreateRow(rowIndex++);
for (var i = 0; i < properties.Length; i++)
{
// 自动调节列宽
sheet.AutoSizeColumn(i);
var cell = headerRow.CreateCell(i);
cell.SetCellValue(properties[i].GetCustomAttribute()?.HeaderName);
// 应用表头样式
var headerStyleAttr = properties[i].GetCustomAttribute();
var style = workbook.CreateCellStyle();
if (headerStyleAttr != null)
{
var font = workbook.CreateFont();
font.FontName = headerStyleAttr.FontName;
font.FontHeightInPoints = (short)headerStyleAttr.FontSize;
font.IsBold = true;
style.SetFont(font);
// 填充模式
style.FillPattern = FillPattern.SolidForeground;
style.WrapText = true;
// 设置边框样式
style.BorderBottom = BorderStyle.Thin;
style.BorderLeft = BorderStyle.Thin;
style.BorderRight = BorderStyle.Thin;
style.BorderTop = BorderStyle.Thin;
style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
style.VerticalAlignment = VerticalAlignment.Center;
}
else
{
var font = workbook.CreateFont();
font.FontName = "Microsoft YaHei";
font.FontHeightInPoints = 12f;
font.IsBold = true;
style.SetFont(font);
// 填充模式
style.FillPattern = FillPattern.SolidForeground;
style.WrapText = true;
// 设置边框样式
style.BorderBottom = BorderStyle.Thin;
style.BorderLeft = BorderStyle.Thin;
style.BorderRight = BorderStyle.Thin;
style.BorderTop = BorderStyle.Thin;
style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
style.VerticalAlignment = VerticalAlignment.Center;
}
cell.CellStyle = style;
}
foreach (var item in data)
{
var row = sheet.CreateRow(rowIndex++);
for (var i = 0; i < properties.Length; i++)
{
var cell = row.CreateCell(i);
cell.SetCellValue(properties[i].GetValue(item)?.ToString());
}
}
var response = new Response
{
Result = new MemoryStream()
};
// MemoryStream中写入数据
workbook.Write(response.Result);
workbook.Close();
response.Result.Close();
response.Result.Dispose();
response.Code = 200;
response.Message = "获取成功";
return response;
}
}