.net core导出Excel文件

最新封装了一个导出Excel文件的方法,如下所示,只要传入文件参数和数据就能下载对应的Excel文件。

[HttpGet("ExportExcel")]
public IActionResult ExportExcel() {
    var settings = new ExportSettings() {
        FileName = "文件名"
    };
    var datas = new List<ExportData>()
    {
        new ExportData{
            Name = "张无忌",
            Sex = "男"
        },
        new ExportData{
            Name = "周芷若",
            Sex = "女"
        },
        new ExportData{
            Name = "赵敏"
        },
        new ExportData{
            Sex = "男"
        }
    };
    return ExportExcel(settings, datas);
}

 以上代码可以获得这样的文件(文件名.xlsx)

下面来讲讲封装的思路和教程。

1.在.net core的web项目中添加Nuget包  EPPlus.Core

2.在某个你喜欢的控制器中引用它 using OfficeOpenXml;

3.新建一个用来定义导出文件的文件名和Worksheet名的类,这个类的类名和属性需要和这里的一样,不可修改:

public class ExportSettings
{
    public string FileName { get; set; } = $"{Guid.NewGuid().ToString()}";
    public string WorksheetName { get; set; } = "Worksheet";
}

4.新建一个用来存数据的类,这个类的Description定义的值,就是未来excel文档表头的的名字。然后这个类的类名和属性都没有任何限制,可以根据你的实际需要,自行修改,只要在属性前面加上Description,就会有这个字段对应的head。如上图所示。


public class ExportData
{
    [Description("姓名")]
    public string Name { get; set; }
    [Description("性别")]
    public string Sex { get; set; }
}

5.然后把下面的这个方法复制进你的控制器的类里面,这是一个泛型的方法,主要是利用反射读取类的所有属性,再按顺序填进excel表里面,这也是为什么,第4步中没有限制类名和属性名的原因。其次还做了自动适配宽度的处理。

private IActionResult ExportExcel<T>(ExportSettings settings, List<T> datas) where T : class
{
    var stream = new MemoryStream();
    using (ExcelPackage package = new ExcelPackage(stream))
    {
        ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(settings.WorksheetName);
        var i = 0;
        var propertyInfos = typeof(T).GetProperties();
        foreach (PropertyInfo property in propertyInfos)
        {
            var objs = property.GetCustomAttributes(typeof(DescriptionAttribute), true);
            var headName = ((DescriptionAttribute)objs[0]).Description;
            worksheet.Cells[1, ++i].Value = headName;
            worksheet.Column(i).Width = headName.Length * 2.5;
        }
        var rowNum = 2;
        foreach (var data in datas)
        {
            i = 0;
            foreach (PropertyInfo property in propertyInfos)
            {
                worksheet.Cells[rowNum, ++i].Value = (property.GetValue(data, null) ?? "").ToString();
            }
            rowNum++;
        }
            package.Save();
        }
        stream.Position = 0;
        return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", settings.FileName + ".xlsx");
    }
}

6.构造自己的标题与数据,如下

​
[HttpGet("ExportExcel")]
public IActionResult ExportExcel() {
    var settings = new ExportSettings() {
        FileName = "文件名"
    };
    var datas = new List<ExportData>()
    {
        new ExportData{
            Name = "张无忌",
            Sex = "男"
        },
        new ExportData{
            Name = "周芷若",
            Sex = "女"
        },
        new ExportData{
            Name = "赵敏"
        },
        new ExportData{
            Sex = "男"
        }
    };
    return ExportExcel(settings, datas);
}

​

最后,访问链接,就可以成功下载excel文件了。

总结:文章参考https://www.cnblogs.com/shy-huang/p/9076062.html,经过优化而来,主要解决了原文中复用较差,使用较难的问题,无法拓展等问题。

但是对一个excel文件中只能有一个Worksheet,表头只能支持单行等问题,没有做优化和处理。如果这两个问题都不是你在乎的问题的话,强烈推荐使用!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值