WPF 使用ClosedXML库实现数据导出!

该篇文章详细介绍了如何在C#中使用ClosedXML库,创建一个泛型类来处理数据导出,包括设置表格标题、颜色、字体样式以及自定义保存路径。作者提供了一个示例,展示了如何根据数据集导出Excel表格并根据特定条件更改样式。
摘要由CSDN通过智能技术生成

首先安装 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);
    }
}

如果有什么地方你有什么更好的建议或写法,欢迎指教。

这个类还可以扩展扩展,我没有用到我就写的简单点。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值