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组件是很方便的,但一方面慢,一方面成本高,所以从网上 ...
随机推荐
- mikrotik/IPSec Dynamic End points Updater.rsc
# IPSec Peer/Policy Updater for Dynamic WAN addresses # ============================================ ...
- C# 链接Sql和Access数据库语句
1.sql数据库: 1.1.链接数据语句:server=localhost;database=Data; uid=sa;pwd=123; 或 Data Source=localhost;DataBas ...
- cadence 16.6 Pspice 仿真步骤
从ADI官网下载后缀为 cir 的文件,AD8210 为例 进行仿真 1 打开 Cadence -> Release 16.6 -> PSpice Accessories -> Mo ...
- MinGW-64 安装
一.在mingw-w64官网下载mingw-w64在线安装包 二.点击mingw-w64进行安装,选择: Version:选最新版本 我这个是4.9.2 Architecture:x86_64 (64 ...
- 从零开始学ios开发(八):Autorotation and Autosizing
不好意思,这一篇间隔的时间有点长,最近实在是事情太多,耽搁了,好了,长话短说,下面继续学习ios. 这次学习的内容是Autorotation和Autosizing,Autorotation就是屏幕内容 ...
- Jquery post 传递数组给asp.net mvc方法
以批量删除数据为例 做批量删除会需要传递要删除的数据ID数组 function RemoveLog(){ var postModel=[]; //遍历复选框获取要删除的数据ID 存放到数组中 $( ...
- Scene (场景视图) 详解
控制二维切换的按钮 点击2D按钮可以激活2D模式.这个按钮会将场景相机在透视视图和正交投影视图之间进行切换.当观察透视视图时,远离相机的物体看起来更小:然而,当正交投影视图的时候,物体的大小并不受相机 ...
- ios关于layer的一些常用属性
UILabel * labb = ... //set the border of labb labb.layer.borderWidth = 1; labb.layer.borderColor = [ ...
- Python环境搭建和开发工具的配置
本文转自http://237451446.blog.51cto.com/2307663/766781 因为要学习python了,第一步当然是环境搭建和开发工具的配置了,下边开始了. 我的开发环境是在w ...
- android 设置半透明
对于Button和ImageButton 还有一些View 设置半透明或者透明都是通过 android:background="#b0000000" 这是就是半透明 android ...