Excel操作--使用NPOI导入导出Excel为DataTable
1.ExcelHelper封装
namespace NPOI操作Excel
{
public class ExcelHelper
{
/// <summary>
/// DataTable转成Excel,返回一个文件流
/// </summary>
/// <param name="dataTable"></param>
/// <returns></returns>
public static Stream DatatableToExcel(DataTable dataTable)
{
IWorkbook wk = new HSSFWorkbook();
MemoryStream ms = new MemoryStream();
ISheet sheet = wk.CreateSheet();
IRow headerRow = sheet.CreateRow(); //处理标题部分
foreach (DataColumn column in dataTable.Columns)
{
headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
}
//处理table中的数据
int rowIndex = ;
foreach (DataRow row in dataTable.Rows)
{
IRow dataRow = sheet.CreateRow(rowIndex);
foreach (DataColumn column in dataTable.Columns)
{
//column.Ordinal得到从0开始的列的位置,column.ColumnName的到列的名称
dataRow.CreateCell(column.Ordinal).SetCellValue(row[column.ColumnName].ToString());
}
rowIndex++;
}
wk.Write(ms);
ms.Flush();
ms.Position = ; sheet = null;
headerRow = null;
return ms;
} /// <summary>
/// 读取Excel文件,转换成DataTable
/// </summary>
/// <param name="ExcelFileStream">读取到Excel的文件流</param>
/// <param name="SheetIndex">表的索引</param>
/// <param name="HeaderRowIndex">标题行的索引</param>
/// <returns></returns>
public static DataTable DataTableFromExcel(Stream ExcelFileStream, int SheetIndex, int HeaderRowIndex)
{
IWorkbook wk = new HSSFWorkbook(ExcelFileStream);
ISheet sheet = wk.GetSheetAt(SheetIndex); DataTable table = new 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);
}
//循环遍历sheet中的每一行,读取每一单元格的数据,同时创建table中的每一行,填充数据
int rowCount = sheet.LastRowNum;
for (int i = (sheet.FirstRowNum + ); 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();
}
}
//dataRow的数据填充好后把行加到表中
table.Rows.Add(dataRow);
}
ExcelFileStream.Close();
wk = null;
sheet = null;
return table;
}
}
}
2.SqlHelper封装
namespace NPOI操作Excel
{
public static class SqlHelper
{
//从配置文件中读取连接字符串
private static readonly string conStr = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;
//执行命令的方法 insert update delete
public static int ExecuteNonquey(string sql, params SqlParameter[] ps)
{
using (SqlConnection con = new SqlConnection(conStr))
{
using (SqlCommand cmd = new SqlCommand(sql, con))
{
con.Open();
cmd.Parameters.AddRange(ps);
return cmd.ExecuteNonQuery();
}
}
}
//获取首行首列
public static object ExecuteScalar(string sql, params SqlParameter[] ps)
{
using (SqlConnection con = new SqlConnection(conStr))
{
using (SqlCommand cmd = new SqlCommand(sql, con))
{
con.Open();
cmd.Parameters.AddRange(ps);
return cmd.ExecuteScalar();
}
}
} //获取读取数据库的对象
public static SqlDataReader ExecuteDataReader(string sql, params SqlParameter[] ps)
{
SqlConnection con = new SqlConnection(conStr);
using (SqlCommand cmd = new SqlCommand(sql, con))
{
try
{
con.Open();
cmd.Parameters.AddRange(ps);
return cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
}
catch (Exception ex)
{
con.Close();
con.Dispose();
throw ex;
}
}
}
//获取结果集
public static DataTable GetDataTable(string sql, params SqlParameter[] ps)
{
//构造数据表,用于接收查询结果
DataTable dt = new DataTable();
//构造适配器对象
using (SqlDataAdapter sda = new SqlDataAdapter(sql, conStr))
{
//添加参数
sda.SelectCommand.Parameters.AddRange(ps);
//执行
sda.Fill(dt);
return dt;
}
} }
}
3.winform中操作
3.1从数据库读取数据导入到Excel中
private void button1_Click(object sender, EventArgs e)
{
DataTable dt = SqlHelper.GetDataTable("select * from t_persons");
MemoryStream ms = ExcelHelper.DatatableToExcel(dt) as MemoryStream; string saveFileNme = "";
bool fileSaved = false;
//保存文件对话框
SaveFileDialog saveDialog = new SaveFileDialog();
//设置默认的文件类型
saveDialog.DefaultExt = "xls";
saveDialog.Filter = "Excel文件|*.xls";
//设置文件名
saveDialog.FileName = "保存";
saveDialog.ShowDialog();
//获得文件全路径
saveFileNme = saveDialog.FileName;
if (saveFileNme.IndexOf(":") < ) return;
if (saveFileNme != "")
{
try
{
FileStream fs = new FileStream(saveDialog.FileName, FileMode.Create);
fs.Write(ms.GetBuffer(), , 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(saveFileNme))
{
MessageBox.Show("导出成功", "通知");
}
else
{
MessageBox.Show("导出失败", "通知");
}
}

3.2读取Excel文件,转换成DataTable绑定到DataGridView上
private void button2_Click(object sender, EventArgs e)
{
//打开文件对话框
OpenFileDialog fileDialog=new OpenFileDialog();
//指定要打开文件的格式
fileDialog.Filter = "Excel文件|*.xls";
//设置默认打开路径
fileDialog.InitialDirectory = @"C:\Users\LWP1398\Desktop";
if (fileDialog.ShowDialog()==DialogResult.OK)
{
string fileName = fileDialog.FileName;//得到文件全路径
using (FileStream fsRead=new FileStream(fileName,FileMode.Open,FileAccess.Read))
{
DataTable dt = ExcelHelper.DataTableFromExcel(fsRead, , );
dgv.DataSource = dt;
}
}
MessageBox.Show("ok");
}
}

NPOI目前主要还是操作xls文件,对操作xlsx文件支持得不是很好
Excel操作--使用NPOI导入导出Excel为DataTable的更多相关文章
- NPOI导入导出Excel
.net mvc利用NPOI导入导出excel 注意:如何导出的提交方式ajax导出是失效的! 解决方案是:js处理l两个表单的提交 代码: 第一步. 在页面里面加入2个隐藏的iframe, 如下 ...
- .Net core NPOI导入导出Excel
最近在想.net core NPOI 导入导出Excel,一开始感觉挺简单的,后来真的遇到很多坑.所以还是写一篇博客让其他人少走一些弯路,也方便忘记了再重温一遍.好了,多的不说,直接开始吧. 在.Ne ...
- NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中
以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...
- Npoi导入导出Excel操作
之前公司的一个物流商系统需要实现对订单的批量导入和导出,翻阅了一些资料,最后考虑使用NPOI实现这个需求. 在winform上面实现excel操作:http://www.cnblogs.com/Cal ...
- <转>Npoi导入导出Excel操作<载>
//Datatable导出Excel private static void GridToExcelByNPOI(DataTable dt, string strExcelFileName) { tr ...
- .net mvc利用NPOI导入导出excel
1.导出Excel :首先引用NPOI包(Action一定要用FileResult) /// <summary> /// 批量导出需要导出的列表 /// </summary> ...
- ASP.Net MVC利用NPOI导入导出Excel
因近期项目遇到所以记录一下: 首先导出Excel: 首先引用NPOI包 http://pan.baidu.com/s/1i3Fosux (Action一定要用FileResult) /// <s ...
- net mvc 利用NPOI导入导出excel
1.导出Excel : 首先引用NPOI包(Action一定要用FileResult) /// <summary> /// 批量导出需要导出的列表 /// </summary> ...
- NPOI 导入导出excel 支持 03 07
因为微软的office成本太高了,所以开发项目的时候电脑上没安装office,而是安装了wps.但开发语言用的是C#,所以直接调用微软的office组件是很方便的,但一方面慢,一方面成本高,所以从网上 ...
随机推荐
- backbone前端基础框架搭建
前端站点名为:site: 前端框架分为:css.js和img,框架的核心在js文件夹下: js中包括collections.models.views.lib和一个app入口js
- Daject初探 - 从Table模型得到Record模型
前言: 如果你还不知道Daject是什么,如何使用,可以浏览 http://www.cnblogs.com/kason/p/3577359.html github地址:https://github.c ...
- 分类图 Class Diagram
类图(Class Diagram)是描述类.接口.协作以及它们之间关系的图. 类图是系统中静态视图的一部分,静态视图可以包括许多的类图. 静态视图用于为软件系统进行结构建模,它构造系统的词汇和关系,而 ...
- How to: Add SharePoint 2010 Search Web Parts to Web Part Gallery for Upgraded Site Collections
When you upgrade to Microsoft SharePoint Server 2010, some of the new SharePoint Enterprise Search W ...
- 10.31Daily Scrum
人员 任务分配完成情况 明天任务分配 王皓南 主网页的框架搭建,任务编号752 研究代码,学习相应语言,讨论设计思路 申开亮 学习数据库的操作,任务编号753 研究代码,学习相应语言,讨论设计思路 王 ...
- DB天气app冲刺二阶段第十一天(完结)
今天最后一天冲刺了,明天就不再冲刺了..已经把所有的技术的问题还有设计的问题都弄好了吧应该说 至少目前来说是的.因为有的实现不了的或者需要耗费时间的已经果断舍弃了,然后需要完善的也都基本完善了. 现在 ...
- Careercup - Google面试题 - 5205167846719488
2014-05-03 23:35 题目链接 原题: For a given node in binary search tree find a next largest number in searc ...
- windows 2012 服务器打开ping端口,开通远程连接
windows 2012 服务器打开ping端口,开通远程桌面连接 控制面板->系统与安全->高级防火墙->入站规则 找到:windows 远程桌面 (http in ) 右键启用 ...
- 从OGRE,GAMEPLAY3D,COCOS2D-X看开源
OGRE,大家都很熟悉咯. 说到这一点真的有点好笑,我见过很多人说认识OGRE,但是却不知道D3D和OPENGL是什么东东的,可能是我的笑点真的很低,反正是莫名喜感.前天在COCOS2D-X的一个群里 ...
- iOS开发之数据存取2-CoreData后台查询数据
注意:本人所讲的后台查询必须在使用CoreData时选择存储类型为“SQLite”,因为二进制或者XML存储方式会在打开的时候直接读到内存中. 1.CoreData数据后台查询出现的情况 CoreDa ...