【C#常用方法】2.DataTable(或DataSet)与Excel文件之间的导出与导入(使用NPOI)
DataTable与Excel之间的互导
1.项目添加NPOI的引用
- NPOI项目简介:
- 关于Excel扩展名.xls与.xlsx简介:
- NPOI项目的引用:
使用VisualStudio,打开NuGet包管理器,搜索NPOI,并添加到当前项目。

2.将Excel文件导入到DataSet(DataTable)中
因为一个Excel文件可以有多个sheet页,所以C#方法最好使用与Excel文档结构相对应的DataSet类,即将DataSet(可以包含多个DataTable)导出为Excel,DataSet中的每个DataTabel对应一个Excel中的Sheet页。

方法解释:此方法将一个Excel文件导入为一个DataSet,Excel中每个Sheet页都会生成一个DataTable存放在导入的DataSet中,并且每个DataTable的TableName与每个Sheet的SheetName一一对应。参数isFirstLineColumnName用来表示Excel文件各表第一行是否为表头。
代码如下:
/// <summary>
/// 读取Execl数据到DataTable(DataSet)中
/// </summary>
/// <param name="filePath">指定Execl文件路径</param>
/// <param name="isFirstLineColumnName">设置第一行是否是列名</param>
/// <returns>返回一个DataTable数据集</returns>
public static DataSet ExcelToDataSet(string filePath, bool isFirstLineColumnName)
{
DataSet dataSet = new DataSet();
int startRow = ;
try
{
using (FileStream fs = File.OpenRead(filePath))
{
IWorkbook workbook = null;
// 如果是2007+的Excel版本
if (filePath.IndexOf(".xlsx") > )
{
workbook = new XSSFWorkbook(fs);
}
// 如果是2003-的Excel版本
else if (filePath.IndexOf(".xls") > )
{
workbook = new HSSFWorkbook(fs);
}
if (workbook != null)
{
//循环读取Excel的每个sheet,每个sheet页都转换为一个DataTable,并放在DataSet中
for (int p = ; p < workbook.NumberOfSheets; p++)
{
ISheet sheet = workbook.GetSheetAt(p);
DataTable dataTable = new DataTable();
dataTable.TableName = sheet.SheetName;
if (sheet != null)
{
int rowCount = sheet.LastRowNum;//获取总行数
if (rowCount > )
{
IRow firstRow = sheet.GetRow();//获取第一行
int cellCount = firstRow.LastCellNum;//获取总列数 //构建datatable的列
if (isFirstLineColumnName)
{
startRow = ;//如果第一行是列名,则从第二行开始读取
for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
{
ICell cell = firstRow.GetCell(i);
if (cell != null)
{
if (cell.StringCellValue != null)
{
DataColumn column = new DataColumn(cell.StringCellValue);
dataTable.Columns.Add(column);
}
}
}
}
else
{
for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
{
DataColumn column = new DataColumn("column" + (i + ));
dataTable.Columns.Add(column);
}
} //填充行
for (int i = startRow; i <= rowCount; ++i)
{
IRow row = sheet.GetRow(i);
if (row == null) continue; DataRow dataRow = dataTable.NewRow();
for (int j = row.FirstCellNum; j < cellCount; ++j)
{
ICell cell = row.GetCell(j);
if (cell == null)
{
dataRow[j] = "";
}
else
{
//CellType(Unknown = -1,Numeric = 0,String = 1,Formula = 2,Blank = 3,Boolean = 4,Error = 5,)
switch (cell.CellType)
{
case CellType.Blank:
dataRow[j] = "";
break;
case CellType.Numeric:
short format = cell.CellStyle.DataFormat;
//对时间格式(2015.12.5、2015/12/5、2015-12-5等)的处理
if (format == || format == || format == || format == )
dataRow[j] = cell.DateCellValue;
else
dataRow[j] = cell.NumericCellValue;
break;
case CellType.String:
dataRow[j] = cell.StringCellValue;
break;
}
}
}
dataTable.Rows.Add(dataRow);
}
}
}
dataSet.Tables.Add(dataTable);
} }
}
return dataSet;
}
catch (Exception)
{
return null;
}
}
3.将DataSet(DataTable)导出为一个Excel文件
代码解释:我们可以将要导出的DataTable都放入一个DataSet中,将DataSet导出为Excel文件,方法参数OutPath用来传入导出Excel文件的路径,路径可以加Excel的扩展名(.xls或.xlsx),也可以不加,不加默认导出Excel文件扩展名为.xls。
/// <summary>
/// 将DataTable(DataSet)导出到Execl文档
/// </summary>
/// <param name="dataSet">传入一个DataSet</param>
/// <param name="Outpath">导出路径(可以不加扩展名,不加默认为.xls)</param>
/// <returns>返回一个Bool类型的值,表示是否导出成功</returns>
/// True表示导出成功,Flase表示导出失败
public static bool DataTableToExcel(DataSet dataSet, string Outpath)
{
bool result = false;
try
{
if (dataSet == null || dataSet.Tables == null || dataSet.Tables.Count == || string.IsNullOrEmpty(Outpath))
throw new Exception("输入的DataSet或路径异常");
int sheetIndex = ;
//根据输出路径的扩展名判断workbook的实例类型
IWorkbook workbook = null;
string pathExtensionName = Outpath.Trim().Substring(Outpath.Length - );
if (pathExtensionName.Contains(".xlsx"))
{
workbook = new XSSFWorkbook();
}
else if(pathExtensionName.Contains(".xls"))
{
workbook = new HSSFWorkbook();
}
else
{
Outpath = Outpath.Trim() + ".xls";
workbook = new HSSFWorkbook();
}
//将DataSet导出为Excel
foreach (DataTable dt in dataSet.Tables)
{
sheetIndex++;
if (dt != null && dt.Rows.Count > )
{
ISheet sheet = workbook.CreateSheet(string.IsNullOrEmpty(dt.TableName) ? ("sheet" + sheetIndex) : dt.TableName);//创建一个名称为Sheet0的表
int rowCount = dt.Rows.Count;//行数
int columnCount = dt.Columns.Count;//列数 //设置列头
IRow row = sheet.CreateRow();//excel第一行设为列头
for (int c = ; c < columnCount; c++)
{
ICell cell = row.CreateCell(c);
cell.SetCellValue(dt.Columns[c].ColumnName);
} //设置每行每列的单元格,
for (int i = ; i < rowCount; i++)
{
row = sheet.CreateRow(i + );
for (int j = ; j < columnCount; j++)
{
ICell cell = row.CreateCell(j);//excel第二行开始写入数据
cell.SetCellValue(dt.Rows[i][j].ToString());
}
}
}
}
//向outPath输出数据
using (FileStream fs = File.OpenWrite(Outpath))
{
workbook.Write(fs);//向打开的这个xls文件中写入数据
result = true;
}
return result;
}
catch (Exception ex)
{
return false;
}
}
}
4.上面两个方法的使用方法
将上面两个方法都定义在ExcelHelper类中,使用如下代码使用:
DataSet set = ExcelHelper.ExcelToDataTable("test.xlsx", true);//Excel导入
bool b = ExcelHelper.DataTableToExcel(set, "test2.xlsx");//导出Excel
【C#常用方法】2.DataTable(或DataSet)与Excel文件之间的导出与导入(使用NPOI)的更多相关文章
- java使用POI操作excel文件,实现批量导出,和导入
一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Exc ...
- csv,txt,excel文件之间的转换,perl脚本
最近接触一些需要csv,txt,excel文件之间的转换,根据一些网上搜索加上自己的改动,实现自己想要的结果为主要目的,代码的出处已经找不到了,还请见谅,以下主要是针对csv&excel 和t ...
- MATLAB导入txt和excel文件技巧汇总:批量导入、单个导入
在使用MATLAB的时候,想必各位一定会遇到导入数据的问题.如果需要导入的数据其数据量巨大的话,那么在MATLAB编辑器中将这些数据复制粘贴进来,显然会在编辑器中占据巨大的篇幅,这是不明智的. 一般来 ...
- 将mysql数据库数据以Excel文件的形式导出
最近在工作中,领导让从数据库中导出一些数据并存放到Excel表格中,网上有许多教程,下面是我总结的其中俩种方法. 从数据库管理工具中导出(navicat) 在navicat导出数据导Excel中还是比 ...
- JS前端创建CSV或Excel文件并浏览器导出下载
长期以来,在做文件下载功能的时候都是前端通过ajax把需要生成的文件的内容参数传递给后端,后端通过Java语言将文件生成在服务器,然后返回一个文件下载的连接地址url.前端通过location.hre ...
- excel文件使用html导出
<table><tr><td>1</td></tr><tr><td>2</td></tr>& ...
- Excel文件处理Demo
1.BLL业务逻辑代码 /// <summary> /// 处理“店铺竞品销售数据”导入文件 /// </summary> /// <param name="f ...
- .Net应用导入、导出Excel文件
本次阐述的导入和导出都围绕此Demo进行
- C# excel文件导入导出
欢迎关注微信公众号 C#编程大全 这里有更多入门级实例帮你快速成长 在C#交流群里,看到很多小伙伴在excel数据导入导出到C#界面上存在疑惑,所以今天专门做了这个主题,希望大家有所收获! 环境:wi ...
随机推荐
- X264-视频压缩编码VCL
在前面的过程中,我们得到了编码图像,编码器开始H264视频编码VCL.首先初始化有关参数,包括帧类型的获取.创建多参考帧的列表.初始化码流控制.初始化写码流结构和写SPS.PPS头结构信息. 1.初始 ...
- 以太网PHY寄存器分析【转】
转自:https://blog.csdn.net/Firefly_cjd/article/details/79825869 以太网PHY寄存器分析 1 1.以太网PHY标准寄存器分析 2 ...
- win10上安装ubunt18双系统过程中出现mmx64.efi not found问题
安装Ubuntu18过程中,从u盘启动ubunt安装,出现mmx64.efi not found问题 如下图: 制作好ubunt启动盘之后在EFI/BOOT下会看到两个文件,将其中grubx64.ef ...
- vue中webpack的配置理解
当我们需要和后台分离部署的时候,必须配置config/index.js: 用vue-cli 自动构建的目录里面 (环境变量及其基本变量的配置) var path = require('path') ...
- 继承c3,网络编程,相互通信
继承: 面向对象多继承,a先找左,再找右 py2中有经典类,新式类,py3中只有新式类 py2中用ascii 编译 py3中用unicode 编译 py2: 经典类 新式类:如果自己或自己的前辈继承o ...
- Spring(002)-创建rest服务
1.创建基于get参数的rest服务 @RestController @RequestMapping("/action") public class GetController { ...
- .Net反射-Type类型扩展
/// <summary> /// Type 拓展 /// </summary> public static class TypeExtensions { /// <su ...
- tornado之获取参数
self.write() # 返回字符串 self.redirect() # 重定向 self.render() # 返回html页面 一. 获取url中携带的参数, 如: 127.0.0.1: ...
- vue_02day练习
目录 vue_02day 作业 vue 框架 :成绩单的实现 v-for 与 v-if 联用: 3.添加筛选规则(深入) : 留言功能的页面实现: vue_02day 作业 1. 先有一下成绩单数据 ...
- thinkphp5.0 - 安装
1.thinkphp 5.0 可以通过下载,git 等方式安装,我这里采用下载完整版安装,解压到一个目录下就行了 2.配置 web 服务器配置文件,我是用的是 nginx(nginx/1.9.15) ...