CloudGamingAdmin/admin-server/CloudGaming.Core/Excel/ExcelUtil.cs
2024-11-15 02:58:48 +08:00

96 lines
2.8 KiB
C#

namespace CloudGaming.Core.Excel;
/// <summary>
/// excel 工具类
/// </summary>
public static class ExcelUtil
{
#region Excel
/// <summary>
/// 获取字典集合
/// </summary>
/// <returns></returns>
public static byte[] GetExcelByDict<TEntity>(List<TEntity> data)
where TEntity : class, new()
{
if (data.Count == 0)
{
return [];
}
var dynamicExcelColumnList = new List<DynamicExcelColumn>();
var excelData = new List<Dictionary<string, object?>>();
var index = 0;
// 将 data 组装为 excelData
foreach (var item in data)
{
index++;
var type = item.GetType();
var dict = new Dictionary<string, object?>();
foreach (var property in type.GetProperties())
{
// 只有打了 excel 标记的字段才能导出
var excelAttribute = property.GetCustomAttribute<ExcelColumnAttribute>();
if (excelAttribute is null)
{
continue;
}
var key = excelAttribute.Name;
// 特殊处理一下如果 同时存在 Dict 和 Excel 标记,那么数据的值只能去读取 ToField 的值
var dictAttribute = property.GetCustomAttribute<DictAttribute>();
if (dictAttribute is not null)
{
var keyName = dictAttribute.ToField;
if (string.IsNullOrWhiteSpace(keyName))
{
throw new Exception("请设置 ToField 字段");
}
else
{
var value = type.GetProperty(keyName)?.GetValue(item);
dict[key] = value;
}
}
else
{
var value = property.GetValue(item);
dict[key] = value;
}
if (index == 1)
{
// 添加动态咧 配置
dynamicExcelColumnList.Add(new DynamicExcelColumn(key)
{
Name = excelAttribute.Name,
// Index = excelAttribute.Index,
Width = excelAttribute.Width,
Format = excelAttribute.Format
});
}
}
excelData.Add(dict);
}
// excel 配置
var config = new OpenXmlConfiguration
{
DynamicColumns = dynamicExcelColumnList.ToArray()
};
using var stream = new MemoryStream();
stream.SaveAs(excelData, configuration: config);
// 将 stream 转为 byte[]
return stream.ToArray();
}
#endregion
}