本文介绍了在Winform中使用NPOI(PIO项目下的.Net组件)来操作Excel文件,而无需安装Office。

要实现的效果是这样的:

1、导出Excel:根据指定datatable,弹出导出窗口,用户自定义路径、导出名,然后导出。

2、导入Excel:弹出导入窗口,用户自定义导入Excel文件,导入到datatable中。

首先,需要在NuGet程序包中搜索并下载NPOI组件,如下图所示:

再添加一个ExcelHelper操作类,网上很多例子,我简化了很多样式相关的代码,只留下主要功能,并且自测没问题,附上ExcelHelper操作类:

public class ExcelHelp{/// <summary>///将datatable流文件导出到指定路径的Excel中/// </summary>/// <param name="sourceTable"></param>public virtual void DataTableExportExcel(DataTable sourceTable){MemoryStream ms = DataTableToExcel(sourceTable);string saveFileName = "";bool fileSaved = false;SaveFileDialog saveDialog = new SaveFileDialog();//打开选择保存窗口saveDialog.DefaultExt = "xls";saveDialog.Filter = "Excel文件|*.xls";//保存窗口的文件筛选saveDialog.FileName = "MyExcel";//默认文件名称saveDialog.ShowDialog();saveFileName = saveDialog.FileName;if (saveFileName.IndexOf(":") < 0) return; //用户点了取消if (saveFileName != ""){try{FileStream fs = new FileStream(saveDialog.FileName, FileMode.Create);fs.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);ms.Close();ms.Dispose();fs.Close();fileSaved = true;}catch (Exception ex){fileSaved = false;MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);}}else{fileSaved = false;}GC.Collect();//强行销毁if (fileSaved && File.Exists(saveFileName)){MessageBox.Show("导出成功!", "通知");}else{MessageBox.Show("导出失败!", "通知");}}/// <summary>/// 根据指定流文件将Excel导入到datatable中/// </summary>public virtual void ExcelExportDataTable(){OpenFileDialog fileDialog = new OpenFileDialog();fileDialog.Filter = "Excel文件|*.xls";fileDialog.InitialDirectory = "E:\\";//设置默认打开路径if (fileDialog.ShowDialog() == DialogResult.OK){string fileName = fileDialog.FileName;//得到文件所在位置FileStream fs = new FileStream(fileDialog.FileName, FileMode.Open,FileAccess.Read);DataTable dt = ExcelToDataTable(fs,0,0);}}/// <summary>/// 将datatable中的数据放入内存流中/// </summary>/// <param name="souruceTable">来源datatable</param>/// <returns></returns>private MemoryStream DataTableToExcel(DataTable souruceTable){int rowCount = souruceTable.Rows.Count;int colCount = souruceTable.Columns.Count;HSSFWorkbook workbook = new HSSFWorkbook();//新建一个工作簿ISheet sheet = workbook.CreateSheet("mysheet");//新建一个sheet页IRow headerRow = sheet.CreateRow(0);MemoryStream ms = new MemoryStream();//构建标题行foreach (DataColumn col in souruceTable.Columns){headerRow.CreateCell(col.Ordinal,CellType.String).SetCellValue(col.Caption);}//构建数据行for (int i = 0; i < rowCount; i++){IRow dataRow = sheet.CreateRow(i + 1);for (int j = 0; j < colCount; j++){DataRow row = souruceTable.Rows[i];DataColumn col = souruceTable.Columns[j];dataRow.CreateCell(j).SetCellValue(row[col].ToString());          }}workbook.Write(ms);ms.Flush();ms.Position = 0;sheet = null;headerRow = null;workbook = null;return ms;}/// <summary>/// 将excel数据流中的数据转化为datatable/// </summary>/// <param name="ExcelFileStream">指定流文件</param>/// <param name="SheetIndex">导入sheet页页号</param>/// <param name="HeaderRowIndex">行标题行号</param>/// <returns></returns>private DataTable ExcelToDataTable(Stream ExcelFileStream, int SheetIndex, int HeaderRowIndex){HSSFWorkbook workbook = new HSSFWorkbook(ExcelFileStream);ISheet sheet = workbook.GetSheetAt(SheetIndex);DataTable table = new DataTable();/*根据标题行索引构建datatable列名*/IRow headerRow = sheet.GetRow(HeaderRowIndex);int cellCount = headerRow.LastCellNum;for (int i = headerRow.FirstCellNum; i < cellCount; i++){DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);table.Columns.Add(column);}/*构建datatable表体*/int rowCount = sheet.LastRowNum;for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++){IRow row = sheet.GetRow(i);DataRow dataRow = table.NewRow();for (int j = row.FirstCellNum; j < cellCount; j++){if (row.GetCell(j) != null){dataRow[j] = row.GetCell(j).ToString();}}table.Rows.Add(dataRow);}ExcelFileStream.Close();workbook = null;sheet = null;return table;}}

使用方法如下所示,导出Excel:

DataTable dt = InintTable();
ExcelHelp eh = new ExcelHelp();
eh.DataTableExportExcel(dt);//测试数据
public DataTable InintTable()
{DataTable dt = new DataTable("TestTable");dt.Columns.Add("Code", typeof(string));dt.Columns.Add("Name", typeof(string));dt.Columns.Add("Age", typeof(int));dt.Columns.Add("Time", typeof(DateTime));for (int i = 0; i < 30; i++){DataRow dr = dt.NewRow();dr["Code"] = (i + 100).ToString();dr["Name"] = "人员" + i.ToString();dr["Age"] = 20;dr["Time"] = DateTime.Now.AddDays(i);dt.Rows.Add(dr);}return dt;
}

导入Excel:

ExcelHelp eh = new ExcelHelp();
eh.ExcelExportDataTable();

C#中使用NPIO实现导入导出Excel简单操作相关推荐

  1. php excel 导入2ge,风之涯技术博客 - 使用PhpSpreadsheet导入导出Excel简单描述

    最近做项目,遇到一个需要excel.word导出的功能案例,所以找到了PhpSpreadsheet进行导出,不要问我为什么不用PHPExcel,因为PHPExcel已经不更新了,对后面的扩展不太好.今 ...

  2. csv和excel php 解析_PHP 高效导入导出Excel(csv)方法之fgetcsv()和fputcsv()函数

    CSV,是Comma Separated Value(逗号分隔值)的英文缩写,通常都是纯文本文件. 一.CSV数据导入函数fgetcsv() fgetcsv() 函数从文件指针中读入一行并解析 CSV ...

  3. SXSSFWorkbook导入/导出Excel文档简单操作

    在Java-web项目开发过程中经常会遇到导入/导出Excel表格的业务场景.SXSSFWorkbook是apache基金会提供的Excel导出工具类,它允许导出大批量数量而不会导致内存溢出,因为在导 ...

  4. mvc npoi导出excel ajax,ASP.Net MVC利用NPOI导入导出Excel

    因近期项目遇到所以记录一下: 首先导出Excel: 首先引用NPOI包 http://pan.baidu.com/s/1i3Fosux (Action一定要用FileResult) /// /// 批 ...

  5. EOS中如何实现导入导出excel文件

    阅读原文 导入导出excel文件 场景描述 将数据库表中的数据按照定义的EXCEL模板进行导出,下载到本地: 将EXCEL中的数据导入数据库相应的表中. 场景目标 通过本场景,解决EXCEL的导入导出 ...

  6. C#窗体将DGV控件中数据导入导出Excel表

    目录 界面图: 效果视频: 一:将DGV数据导出到Excel表中 二:将Excel表数据导入到DGV中 三:界面全部代码 界面图: 效果视频: DGV数据导入导出Excel 一:将DGV数据导出到Ex ...

  7. npoi的mvc怎么ajax导出,asp.net mvc利用NPOI导入导出Excel解决方法

    asp.net mvc利用NPOI导入导出Excel 导出Excel 2003没有问题,导出Excel2007老是出现无法访问已关闭的流,请帮忙解决,或是哪位有mvc导入导出excel的工具类能提供, ...

  8. java excel data 导入数据_java实现导入导出excel数据

    项目需要,要实现一个导入导出excel的功能,于是,任务驱动着我学习到了POI和JXL这2个java操作Excel的插件. 一.POI和JXL介绍 1.POI:是对所有office资源进行读写的一套工 ...

  9. ASP.NET Core 导入导出Excel xlsx 文件

    ASP.NET Core 使用EPPlus.Core导入导出Excel xlsx 文件,EPPlus.Core支持Excel 2007/2010 xlsx文件导入导出,可以运行在Windows, Li ...

最新文章

  1. 外媒:华为有望最早于2021年推出自动驾驶汽车
  2. 英特尔推出颠覆性架构:3D堆叠芯片,10nm制程明年上市
  3. mysql用户权限管理和增删改查操作
  4. VTK:帧率用法实战
  5. PHP路径realpath __FILE__ __DIR__ dirname
  6. [C++STL]C++实现unordermap容器和unorderset容器
  7. [html] 如何阻止屏幕旋转时自动调整字体的大小?
  8. geth 转账_eth客户端安装 geth使用 批量转账(一)
  9. JAVA怎么实现网页退出系统_java后台实现js关闭本页面,父页面指定跳转或刷新操作...
  10. Rabbit发送消息,消费者消费异常
  11. R学习笔记-安装R和RStudio,注意RStudio的版本需要与操作系统版本匹配
  12. Layui的管理系统的模板
  13. VS2015中更改项目名称
  14. 凡拓数字通过注册:年营收7亿 伍穗颖夫妇控制43%股权
  15. c语言printf函数中的格式控制字符串,C++_C语言格式化输入输出函数详解,一:格式输出函数printf() 1 - phpStudy...
  16. 匈牙利法的Matlab代码及测试
  17. 小升初 择校简历标准
  18. jsd 多线程与socket网络通信
  19. 2022年全球与中国PLC光分路器市场现状及未来发展趋势
  20. 牟家和:没有无耻的创业者,只有无耻的投机者

热门文章

  1. [性能测试] LoadRunner结果分析 – TPS
  2. jQuery 倒计时
  3. MFC中的几个常用类——CFileDialog
  4. (转)关于X64位系统IIS7下支持32位asp.net程序
  5. C# 分割字符串方法
  6. 推荐系统相关资源汇总
  7. select2控件动态更新option
  8. Oracle自定义函数(不断更新)
  9. python使用ssh 中文_Python3制作简易SSH登录工具
  10. Java语言所有异常类均继承自_Java将运行错误分为两类:(__)和(__), 其对应的类均派生自(__)类;...