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对象
方便后端进行处理。
该组件介绍就到这些了,谢谢阅读。
更多分享,请大家关注我的个人公众号: