NETCORE 服务端EXCEL导入导出的分享

项目支持的环境:
.NETCORE Standard 2.0

 

本项目基于NPOI组件,实现对常规格式的excel导入导出封装。

导出的excel格式,符合office格式,并非html格式的。

很多朋友应该都接触过NPOI,但是写一个导入导出,还是很繁琐的,基于此,我们封装了一个组件

请从nuget上搜索 KYSharpCore.NPOI 

 

 

利用该组件,我们可以实现以下功能
数据导出:

支持DataTable的数据

支持匿名数组的数据

支持实体列表的数据

再导出时,本组件也支持一些单元格合并的处理,但是相对繁琐,本文不做介绍。

数据导入:

支持从excel导入到DataTable

excel支持.xls和.xlsx 的格式

下面就介绍下如何使用

一、数据导出

首先,我们利用组件,将数据转成符合的MemoryStream流,再处理流导出到文件。

对于控制台程序和web项目来说,流导出的文件的处理方式有些不一样。

1、DataTable数据源

直接看代码,只要一行代码,我们就可以将datatable数据源转成符合excel格式的流

 var sm = KYSharpCore.NPOI.Excel.Export(dt, true);

 其中第二个参数为 是否为 xls格式,默认是true,false将导出.xlsx格式的文档

public MemoryStream GetStream1()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("姓名");
            for(int i=0;i<10;i++)
            {
                DataRow dr = dt.NewRow();
                dr[0] = "" + i;
           dt.Rows.Add(dr); }
var sm = KYSharpCore.NPOI.Excel.Export(dt, true); return sm; }

 2、匿名对象的数据源

      public MemoryStream GetStream2()
        {
            var query = new[] { 
            new { 姓名="张三"},
             new { 姓名="李四"},
            };

            var sm = KYSharpCore.NPOI.Excel.Export(query, true);
            return sm;
        }

也是非常简单,直接将数据源替换即可。

匿名对象一般用户我们从数据库获取数据后,通过linq,将需要导出的字段重新组合为一个数组。


 

 

 3、实体对象数组

与匿名对象使用方式一样,直接将实体的List对象作为数据传进去即可。

public MemoryStream GetStream3()
        {
            List<Student> list = new List<Student>() {
            new Student(){ Name="张三" },
            new Student(){ Name="李四"}
            };

            var sm = KYSharpCore.NPOI.Excel.Export(list, true);
            return sm;
        }

 

最后,我们分别看下在控制台环境和web环境下如何导出文件

1、控制台下,我们采用文件写入的方式

      public void GetFile(MemoryStream sm)
        {
            var buffer = sm.ToArray();

            string outfile = @"e:\k8008\huangminghui\桌面\aa.xlsx"; //指定文件存储路径
            using (FileStream fileStream = new FileStream(outfile, FileMode.OpenOrCreate, FileAccess.Write))
            {
                fileStream.Write(buffer, 0, buffer.Length);
            }
        }

控制台的方式,只能将文件写入服务器上指定的目录。

 2、在web下,我们可以使用 FileResult 类型的输出

     public FileResult Export()
        {
            var sm = GetStream();
            return File(sm.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "项目.xlsx");
        }

web下,可利用这种方式直接导出到客户端。

如果是写入服务器上,采用控制台的写法即可。

 

 

 上图是利用GetStream1构造的数据导出的样子

 

二、数据导入

数据导入是指读取常规的excel文件,转成DataTable对象,方便服务端对数据进行处理。

常规格式只不出现有合并列的情况,如果有合并,读取的Datatable要特别处理方可。

我们提供了两种处理方式,分别对应指定文件路径和web端上传的postfile对象

  public static DataTable ExcelToDataTable(Stream sm, string p_tableName, int p_sheetIndex, bool isExcel2003 = true)


 public static DataTable ExcelToDataTable(string filepath, string p_tableName, int p_sheetIndex, bool isExcel2003 = true)

参数说明
sm:用于web端上传的,通过postfile对象,获取到的文件流

filepath:指定的文件路径,此时文件需要在服务器上,不支持远程下载

p_tableName:是指转换后,设置的DataTable的Name属性。可为空

p_sheetIndex:指excel中的第几个sheet,默认是0,第一个

isExcel2003:指定文件格式,如果是.xls格式,则为true,否则为false,默认为true。

 

通过调用以上两个方法,可以很快速的将常规的文档转成DataTable对象

方便后端进行处理。

 

该组件介绍就到这些了,谢谢阅读。

 

更多分享,请大家关注我的个人公众号:

 

 

 

 

 

 

posted @ 2022-10-26 16:34  黄明辉  阅读(1125)  评论(0编辑  收藏  举报