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

本文介绍了在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();

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3招seo技巧让你把关键词做进百度前三

这个技巧也没有什么&#xff0c;说白了就是个百度点击原理&#xff01;当然&#xff0c;这个标题也就是一个标题党&#xff0c;但是的确能让你的排名靠前&#xff0c;因为我之前测试过&#xff0c;我做过一个词&#xff0c;有10个人&#xff0c;点击一下&#xff0c;隔天就第一…

C#中采用OLEDB方式来读取EXCEL文件

使用OLEDB来读取EXCEL的原因很简单&#xff0c;只是因为我感觉代码量不多。代码已经本地测试通过。 public class OlEDBHelp {public DataSet ExcelToDataSet(string path,string tableName "table1"){DataSet ds new DataSet();string strConn string.Format($&q…

ASP.NET MVC 中删除无用视图引擎

默认情况下&#xff0c;ASP.NET MVC 同时支持 WebForm 和 Razor 引擎&#xff0c;而我们通常在同一个项目中只用到了一种视图引擎&#xff0c;如Razor&#xff0c;那么我们就移除没有使用的视图引擎&#xff0c;提高View视图的检索效率。在没有删除WebForm引擎之前&#xff0c;…

VRRP在生产环境中的应用

该案例是笔者做过的一个网络改造项目&#xff0c;同时为了保密只介绍VRRP方面的配置以及要注意的事项。 该方案时某医院核心网络&#xff0c;通过两台S8610走VRRP(和网关相连)。网络拓扑如下 S8610_1配置 en config hostname S8610_1 enable sec ******* line vty 0 4 pass ***…

隐藏ASP.NET MVC版本

默认情况下&#xff0c;ASP.NET MVC网站会把版本号提供给浏览器&#xff0c;如下图所示&#xff1a; 只需在Global.asax中添加一句代码即可&#xff1a; MvcHandler.DisableMvcResponseHeader true; 如下图所示&#xff1a; protected void Application_Start(){MvcHandler.…

使用纯索引子查询优化MySQL的分页查询速度

像这样的查询往往会耗费十几秒的时间 SELECT * FROM news WHERE cat_id 4 ORDER BY id DESC LIMIT150000, 10改进后 SELECT id, value, LENGTH(stuffing) AS len FROM t_limit ORDER BY id LIMIT 150000, 10仍然需要数秒, 但是, 如果将ID作为子查询 SELECT l.id, value, …

ASP.NET MVC 使用防伪造令牌来避免CSRF攻击

本文转自这篇文章 XSRF即在访问B站点的时候&#xff0c;执行了A站点的功能。 比如: A站点登录后&#xff0c;可以修改用户的邮箱&#xff08;接口&#xff1a;/Email/Modify?email123&#xff09;&#xff0c;修改邮箱时只验证用户有没有登录&#xff0c;而且登录信息是保存…

兼容所有浏览器的网页制作方法

其实一般浏览器就IE6、IE7、IE8、火狐、GOOGLE浏览器chrome等&#xff0c;大家最困扰的就是网页在各大浏览器的兼容问题&#xff0c;其实所有浏览器在不兼容方面只存在两点&#xff1a;浮动和外填充&#xff0c;只要把这两点熟悉精通了&#xff0c;那么网页在所有浏览器里显示也…

ASP.NET MVC 使用Log4Net记录系统运行中问题

log4net是.Net下一个非常优秀的开源日志记录组件。log4net记录日志的功能非常强大。它可以将日志分不同的等级&#xff0c;以不同的格式&#xff0c;输出到不同的媒介。 在NuGet程序包中下载log4Net组件&#xff0c;如下图所示&#xff1a; 打开Web.config文件&#xff0c;在&…

lzo的安装及在hadoop中的配置

一、前提1、gcc的安装&#xff1a;yum install lib* glibc* gcc* 如果lzo编译出错时可能需要安装2、ant的安装&#xff1a;安装略&#xff0c;最好1.8.2及以上版本&#xff0c;并设置好环境变量 在第三步需要用到ant二、lzo的安装wget http://www.oberhumer.com/opensource/lzo…

ASP.NET MVC 使用Log4Net在不同目录中记录不同类型的日志

在上一篇文章中&#xff0c;实现了利用Log4Net记录系统中出现的问题。如果同时还需要记录用户操作的监控日志&#xff0c;就需要一些修改 修改Web.Cofig配置文件 ,增加一个logger节点和appender节点&#xff0c;用于监控操作日志配置&#xff0c;并且设置不同的日志文件路径&am…

简明python教程 --C++程序员的视角(七):异常

当你的程序中出现某些 异常的 状况的时候&#xff0c;异常就发生了。例如&#xff0c;当你想要读某个文件的时候&#xff0c;而那个文件不存在。或者在程序运行的时候&#xff0c;你不小心把它删除了。上述这些情况可以使用异常来处理。 假如你的程序中有一些无效的语句&#x…

C#中@符号的作用

一、忽略转义字符 string fileName "D:\\文本文件\\text.txt"; string fileName "D:\文本文件\text.txt"; 二、让字符串跨行 string strSQL "SELECT * FROM HumanResources.Employee AS e" " INNER JOIN Person.Contact AS c" &qu…

医疗信息化、医学、医院管理、医疗器械资料下载

1. 电子病历无纸化存储条件已经成熟&#xff08;251医院王景明&#xff09; http://share.hc3i.cn/data/115 2. 基于JCI标准管理医院药品库房的探讨 http://share.hc3i.cn/data/34902 3. 民营医院管理模式与特点的探讨 http://share.hc3i.cn/data/29181 4. 数据仓库技术架构及方…

【流媒體】Android 实时视频采集—Camera预览采集

【流媒體】Android 实时视频采集—Cameara预览采集 SkySeraph Mar 26th 2012 SZ Email&#xff1a;skyseraph00163.com 更多精彩请直接访问SkySeraph个人站点&#xff1a;www.skyseraph.com 流媒体系列&#xff1a; http://skyseraph.com/2012/04/11/Media/流媒体专题/ 1 概…

C#中使用SqlBulk百万级数据秒级插入

本文转自这篇文章&#xff0c;提供了一种较快的数据插入的思路&#xff0c;转过来做个记录。 #region static void Insert() {Console.WriteLine("使用Bulk插入的实现方式");Stopwatch sw new Stopwatch();DataTable dt GetTableSchema(); using (SqlConnection …

利用JQuery插件CleverTabs实现多页签打开效果

在VS中&#xff0c;我们能打开多页签&#xff0c;并在不同的页签之间进行浏览和操作&#xff0c;这一功能通过JQuery插件CleverTabs也能实现此效果。CleverTabs下载请点击这里&#xff1a;JQuery CleverTabs 本文采用ASP.NET MVC技术实现效果&#xff1a;要在布局页中点击不同的…

指针的一个简单应用

#include "stdafx.h" int main(int argc, char* argv[]){ //string s("hello world"); string s "hello world"; string *p &s; *p "goodbye";//此时字符串s的值也变化了 string *sp &s; sp p; *sp "new another w…

精通ASP.NET MVC ——路由

本文章将关注定义路由&#xff0c;并使用它们去处理URL&#xff0c;使用户能够到达控制器和动作。 文章非常长&#xff0c;可以对路由机制有较初步的了解。首先创建示例项目&#xff0c;项目名为UrlAndRoutes&#xff0c;如下图所示&#xff1a; 然后是创建示例控制器和示例视图…

建立丰富多彩的toast的简单实例

为toast中的view显示建立一个layout的xml文件&#xff0c;放到res的layout目录下 下面是对xml的调用 //先通过LayoutInflater来将xml文件中的 Layout变成一个view。这个类可以将XML实例化&#xff0c;形成一个View。以文本为例&#xff0c;要从一个XML文档生成一个可供使用的Vi…