首先列举一下几种操作Excel的方法

Open XML SDK

微软官方的组件,偏向底层,仅支持.xlsx,开源组件。

Microsoft.Office.Interop.Excel(com)

需要安装office软件才可以使用(不推荐使用)。

NPOI

老牌组件,功能强大,就是相对来说慢一点,大数据量可能导致内存溢出,需要第三方依赖,全格式支持,开源组件。

Epplus

相对于NPOI而言有个更强的处理能力,(NPOI:4-5万行内存溢出,epplus:20-23万行内存溢出),但是不支持.xls格式的Excel表,只能处理.xlsx格式,开源组件。

Spire

商业化组件,没啥好说的全部拉满。

Aspose

商业化组件,没啥好说的全部拉满。

MiniExcel

简介

目前大多数流行的框架需要将所有数据加载到内存中以方便操作,但这会导致内存消耗问题。MiniExcel尝试使用stream中的算法将原来的1000 MB占用减少到几MB,以避免OOM(内存不足),全格式支持,开源组件。

特征

  • 低内存消耗,避免 OOM(内存不足)和完整 GC
  • 支持每行数据的操作real-time
  • 支持LINQ延时执行,可以做低消耗、快分页等复杂查询
  • 轻量级,未安装Microsoft Office,无COM+,DLL大小小于150KB
  • 简单的 API 样式来读/写/填充 excel

官网

首先挂一下官网链接GitHub - mini-software/MiniExcel: Fast, Low-Memory, Easy Excel .NET helper to import/export/template spreadsheet

技术

MiniExcel、C#、Dapper、SqlServer

官网实现

注1:使用同一列的第一个IEnumerable作为填写列表的基础

模板:

MiniExcel,模板导入数据进Excel,多sheet页(C#)(.Net)_IT

结果:

MiniExcel,模板导入数据进Excel,多sheet页(C#)(.Net)_开源组件_02

法典:

//1. By POCO
var value = new
{
    employees = new[] {
        new {name="Jack",department="HR"},
        new {name="Lisa",department="HR"},
        new {name="John",department="HR"},
        new {name="Mike",department="IT"},
        new {name="Neo",department="IT"},
        new {name="Loan",department="IT"}
    }
};
MiniExcel.SaveAsByTemplate(path, templatePath, value);

//2. By Dictionary
var value = new Dictionary<string, object>()
{
    ["employees"] = new[] {
        new {name="Jack",department="HR"},
        new {name="Lisa",department="HR"},
        new {name="John",department="HR"},
        new {name="Mike",department="IT"},
        new {name="Neo",department="IT"},
        new {name="Loan",department="IT"}
    }
};
MiniExcel.SaveAsByTemplate(path, templatePath, value);

个人实例

模板

MiniExcel,模板导入数据进Excel,多sheet页(C#)(.Net)_开源组件_03

MiniExcel,模板导入数据进Excel,多sheet页(C#)(.Net)_sql_04

实体类(model)
	public class people
    {
        public string name{ get; set; }
        public string sex { get; set; }
        public string age { get; set; }
    }
    public class subject
    {
        public string name{ get; set; }
        public string grade { get; set; }
        public string gpa { get; set; }
    }
查询数据,并插入数据
								using (var dbConnection = new SqlConnection(dbConnectionStr))
                {
                    dbConnection.Open();
                    string sql1 = $@" select * from people ";
                    string sql2 = $@" select * from subject ";
                    var people = dbConnection.Query<people>(sql1).ToList();
                    var subject = dbConnection.Query<subject>(sql2).ToList();
                    var value = new
                    {
                        people = people,
                        subject = subject
                    };

                    MiniExcel.SaveAsByTemplate("保存路径", "模板路径", value);
                }