首页 WinForm/WPF WPF之EXCEL导入导出的分享

WPF之EXCEL导入导出的分享

作者:胡同里的砖头 围观群众:323 更新于:2023-08-11

本项目基于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对象

方便后端进行处理。



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

  • 本文标题: WPF之EXCEL导入导出的分享
  • 文章分类:【WinForm/WPF】
  • 非特殊说明,本文版权归【胡同里的砖头】个人博客 所有,转载请注明出处.
留言评论
站点声明:
1、本站【胡同里的砖头】个人博客,借鉴网上一些博客模板,取其各优点模块自行拼装开发,本博客开发纯属个人爱好。
2、所有笔记提供给广大用户交流使用,可转载,可复制,纯个人开发所遇问题锦集记录使用
Copyright © huzlblog.com All Rights Reserved. 备案号:苏ICP备2021056683号-8