首先安装 nuget包 ClosedXML库
下面我们看代码
//定义一个泛型类 T 就是我们要传入的数据集,就是你要导出的数据。
public static class ExportHelp<T>
{
/// <summary>
/// 给表格特定的列出现特定的值时改变颜色
/// </summary>
private static XLColor IsFontColor { get; set; } = XLColor.Black;
/// <summary>
/// 标题是否粗体
/// </summary>
private static bool IsBold { get; set; } = true;
private static XLWorkbook workbook;
private static IXLWorksheet worksheets;
/// <summary>
///
/// </summary>
/// <param name="LogDataList">导出的数据集</param>
/// <param name="dicHeadline">更改表格的标题</param>
public static void ExportGrid(List<T> LogDataList, Dictionary<string, string> dicHeadline=null)
{
try
{
// 使用SaveFileDialog来允许用户选择保存地址
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Excel|*.xlsx";
// 设置默认打开的位置为桌面
saveFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
saveFileDialog.FilterIndex = 1;
saveFileDialog.RestoreDirectory = true;
saveFileDialog.Title = "选择您要保存的位置";
//这里是你要设置导出的文件名称
saveFileDialog.FileName = "";
// 创建Excel文件
if (saveFileDialog.ShowDialog() == true)
{
//选择保存的路径
string filePath = saveFileDialog.FileName;
// 使用ClosedXML库将表格数据写入Excel文件
using (workbook = new XLWorkbook())
{
//这里是给你导出的表格工作表命名,这里我就随便了
worksheets = workbook.Worksheets.Add("Sheet1");
//给表格写入数据
SetExportDate(LogDataList);
//给特定字段更改字体颜色(这里的意思是 第3列只要出现的字段中 有 Error 这个字段我就更改颜色为红色)
foreach (var item in worksheets.RowsUsed())
{
if (item.Cell(3).GetString() == "Error")
{
item.Style.Font.FontColor = XLColor.Red;
}
}
if (dicHeadline != null)
{
foreach (var item in dicHeadline)
{
worksheets.Row(1).CellsUsed().Where(o => o.Value.ToString() == item.Key).FirstOrDefault()!.Value = item.Value.ToString();
}
}
// 设置标题为粗体(IsBold)是我们在上面定义的属性,这样当我们调用类时可以自定义是否需要
worksheets.Row(1).Style.Font.Bold = IsBold;
//标题居中
worksheets.Row(1).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
//表格标题字体颜色
worksheets.Row(1).Style.Font.FontColor = IsFontColor;
// 调整列宽以适应内容
worksheets.Columns().AdjustToContents();
workbook.SaveAs(filePath);//保存表格
}
}
}
catch (Exception ex)
{
throw new Exception("数据导出失败,原因"+ex.Message);
}
}
/// <summary>
/// 给表格填入数据(这里也可以是有DataTable的方式填入数据)
/// </summary>
/// <param name="List">导出的数据集</param>
public static void SetExportDate(List<T> List)
{
//Type myClassType = List.GetType();
//PropertyInfo[] properties = myClassType.GetProperties();
PropertyInfo[] properties = typeof(T).GetProperties();
//获取字段属性用于做表头
int i = 0;
foreach (PropertyInfo property in properties)
{
i++;
worksheets.Cell(1, i).Value = property.Name;
}
// 添加数据
int cellNum =0;
for (int j = 0; j < List.Count; j++)
{
cellNum = 0;
foreach (var item in worksheets.Row(1).CellsUsed())
{
cellNum++;
worksheets.Cell(j + 2, cellNum).Value = List[j]?.GetType().GetProperties().Where(o=>o.Name==item.Value.ToString()).FirstOrDefault()?.GetValue(List[j])?.ToString();
}
}
}
这里我们来调用上面的类
private void Derive()
{
try
{
//这里你可以定义一个 Dictionary 来更改你需要的表格标题,key 就是你要更改的字段,比如你实体的字段是 “Name” 那你就设置为Name。value 就是你要设置的表格标题 例如:“Name”对应的就是“名称”
Dictionary<string, string> dicHeadline = new Dictionary<string, string>();
// 遍历表格的所有列并更改表格标题
foreach (PropertyInfo property in typeof(Logs).GetProperties())
{
string value = "";
switch (property.Name)
{
case "Id":
value = "编号";
break;
case "Timestamp":
value = "日期";
break;
case "Level":
value = "日志等级";
break;
case "Exception":
value = "错误信息";
break;
case "RenderedMessage":
value = "日志消息";
break;
case "Properties":
value = "属性";
break;
}
dicHeadline.Add(property.Name, value);
}
//这个就是我们设置的属性加粗字体
IsBold=true
//调用我们刚刚写的类,Lgos 就是你要导出的数据实体的类
ExportHelp<Logs>.ExportGrid(LogDataList!, dicHeadline);
MessageBox.Show("导出成功");
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
如果有什么地方你有什么更好的建议或写法,欢迎指教。
这个类还可以扩展扩展,我没有用到我就写的简单点。