Npoi简单读写Excel
什么是NPOI ?
简而言之,NPOI就是可以在没有Office的情况下对Word或Excel文档进行读写等操作。
使用方式 :
1、准备NPOI的dll文件
下载链接:https://npoi.codeplex.com/releases
2、将下载的dll文件引入项目中
3、引用命名空间

须知:
1、Excel表格分为:WorkBook(工作薄)-> Sheet(工作表) -> 行:Row 单元格:Cell。
2、NPOI是POI的C#版本,NPOI的行和列的index都是从0开始
3、POI读取Excel有两种格式一个是HSSF,另一个是XSSF。 HSSF和XSSF的区别如下:
HSSF is the POI Project's pure Java implementation of the Excel '97(-2007) file format.
XSSF is the POI Project's pure Java implementation of the Excel 2007 OOXML (.xlsx) file format.
即:HSSF适用2007以前的版本,XSSF适用2007版本及其以上的。
下面使用NPOI读取Excel例子:主要功能是将DataTable导入Excel,或将Excel读取到DataTable中。
代码如下:
/// <summary>
/// 将DataTable导入到Excel
/// </summary>
/// <param name="data">要导入的数据</param>
/// <param name="filepath">导入的文件路径(包含文件名称)</param>
/// <param name="sheename">要导入的表名</param>
/// <param name="iscolumwrite">是否写入列名</param>
/// <returns>导入Excel的行数</returns>
public int DataTableToExcel(DataTable data, string filepath, string sheename, bool iscolumwrite)
{
int i = ;
int j = ;
int count = ;
ISheet sheet = null;
using (fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
//根据Excel不同版本实例不同工作铺
if (filepath.IndexOf(".xlsx") > ) // 2007版本
{
workbook = new XSSFWorkbook();
}
else if (filepath.IndexOf(".xls") > ) // 2003版本
workbook = new HSSFWorkbook(); try
{
if (workbook != null)
{
sheet = workbook.CreateSheet(sheename);
}
else
{
return -;
} if (iscolumwrite == true) //写入DataTable的列名
{
IRow row = sheet.CreateRow();
for (j = ; j < data.Columns.Count; ++j)
{
row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);
}
count = ;
}
else
{
count = ;
} for (i = ; i < data.Rows.Count; ++i)
{
IRow row = sheet.CreateRow(count);
for (j = ; j < data.Columns.Count; ++j)
{
row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
}
count++;
}
workbook.Write(fs); //写入到excel
return count;
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
return -;
}
finally { fs.Close(); fs.Dispose(); }
}
}
/// <summary>
/// 将Excel导入DataTable
/// </summary>
/// <param name="filepath">导入的文件路径(包括文件名)</param>
/// <param name="sheetname">工作表名称</param>
/// <param name="isFirstRowColumn">第一行是否是DataTable的列名</param>
/// <returns>DataTable</returns>
public DataTable ExcelToDataTable(string filepath, string sheetname, bool isFirstRowColumn)
{
ISheet sheet = null;//工作表
DataTable data = new DataTable(); var startrow = ;
using (fs = new FileStream(filepath, FileMode.Open, FileAccess.Read))
{
try
{
if (filepath.IndexOf(".xlsx") > ) // 2007版本
workbook = new XSSFWorkbook(fs);
else if (filepath.IndexOf(".xls") > ) // 2003版本
workbook = new HSSFWorkbook(fs);
if (sheetname != null)
{
sheet = workbook.GetSheet(sheetname);
if (sheet == null) //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet
{
sheet = workbook.GetSheetAt();
}
}
else
{
sheet = workbook.GetSheetAt();
}
if (sheet != null)
{
IRow firstrow = sheet.GetRow();
int cellCount = firstrow.LastCellNum; //行最后一个cell的编号 即总的列数
if (isFirstRowColumn)
{
for (int i = firstrow.FirstCellNum; i < cellCount; i++)
{
ICell cell = firstrow.GetCell(i);
if (cell != null)
{
string cellvalue = cell.StringCellValue;
if (cellvalue != null)
{
DataColumn column = new DataColumn(cellvalue);
data.Columns.Add(column);
}
}
}
startrow = sheet.FirstRowNum + ;
}
else
{
startrow = sheet.FirstRowNum;
}
//读数据行
int rowcount = sheet.LastRowNum;
for (int i = startrow; i < rowcount; i++)
{
IRow row = sheet.GetRow(i);
if (row == null)
{
continue; //没有数据的行默认是null
}
DataRow datarow = data.NewRow();//具有相同架构的行
for (int j = row.FirstCellNum; j < cellCount; j++)
{
if (row.GetCell(j) != null)
{
datarow[j] = row.GetCell(j).ToString();
}
}
data.Rows.Add(datarow);
}
}
return data;
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
return null;
}
finally { fs.Close(); fs.Dispose(); }
}
}
测试代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data; using NPOIHelperTool;
using Bll;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DataTable data = new DataTable();
for (int i = ; i < ; ++i)
{
data.Columns.Add("Columns_" + i.ToString(), typeof(string));
} for (int i = ; i < ; ++i)
{
DataRow row = data.NewRow();
row["Columns_0"] = "item0_" + i.ToString();
row["Columns_1"] = "item1_" + i.ToString();
row["Columns_2"] = "item2_" + i.ToString();
row["Columns_3"] = "item3_" + i.ToString();
row["Columns_4"] = "item4_" + i.ToString();
data.Rows.Add(row);
} ExcelHelper h = new ExcelHelper();
DataTable de = h.ExcelToDataTable(@"E:\Myuser.xls", "Sheet1", true);
int c = h.DataTableToExcel(data, @"E:\Test.xls", "sheet1", true);
IList<student> a = TypeUtil.ToList<student>(de);
} }
class student
{
public string Id { get; set; }
public string Name { get; set; }
public string nc { get; set; }
}
}
参考:
https://www.cnblogs.com/Raning/p/5872822.html
https://blog.csdn.net/dcrmg/article/details/52356236
http://www.cnblogs.com/Erik_Xu/archive/2012/06/08/2541957.html
作者:遥远的Ta
出处:https://www.cnblogs.com/lycb
Npoi简单读写Excel的更多相关文章
- C# 使用 NPOI 库读写 Excel 文件
NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件.在处理Excel文件上,NPOI 可以同时兼容 xls 和 xlsx.官网提供了一份 Examples,给出 ...
- C# 使用 NPOI 库读写 Excel 文件(转载)
NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件.在处理Excel文件上,NPOI 可以同时兼 容xls 和 xlsx.官网提供了一份Examples,给出了 ...
- C# 中 NPOI 库读写 Excel 文件的方法【摘】
原作:淡水网志 NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件.在处理Excel文件上,NPOI 可以同时兼容 xls 和 xlsx.官网提供了一份 Exa ...
- NPOI简单操作excel
本文仅当是个记录文件,仅供初学者参考. 首先得using几个npoi的空间名如下: using NPOI.HSSF.UserModel;using NPOI.HSSF.Util;using NPOI. ...
- NPOI库读写Excel文件
//首先Nuget安装NPOI库using System; using System.Data; using System.IO; using NPOI.HSSF.UserModel; using N ...
- 使用NPOI读写Excel、Word
NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 ...
- NPOI读写Excel
1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.NPOI是POI的C#版本,NPOI的行和列的index都是从0开始 ...
- NPOI.dll 用法。单元格,样式,字体,颜色,行高,宽度。读写excel
NPOI.dll 用法.单元格,样式,字体,颜色,行高,宽度.读写excel 转载:http://yuncode.net/code/c_531e679b3896495 view source prin ...
- JS异步上传Excel 并使用NPOI进行读写操作
实现功能 导入——客户端使用 ajaxfileupload.js 插件实现Excel的异步上传,并在服务端解析成JSON字符串返回页面 导出——将页面中的grid表拼接成JSON串上传至服务器,在服务 ...
随机推荐
- python sys.argv[]简单解释
上一篇UDP编程中简单使用了一些sys模块的argv参数,也是我第一次看见这个参数,这里做个记录: sys.argv是一个从程序外部获取参数的桥梁,这个“外部”很关键, 因为我们从外部取得的参数可以是 ...
- Flink+kafka实现Wordcount实时计算
1. Flink Flink介绍: Flink 是一个针对流数据和批数据的分布式处理引擎.它主要是由 Java 代码实现.目前主要还是依靠开源社区的贡献而发展.对 Flink 而言,其所要处理的主要场 ...
- python正则表达式判断素数【厉害了】
参考: https://www.cnblogs.com/imjustice/p/check_prime_by_using_regular_expression.html for i in range( ...
- Django----将列表按照一定的顺序展示
1.要求:按照文章的时间降序排列,并且只展示前5篇文章 2.需要用到:list的切片知识 ###改造view.py中的视图方法 #列表页 def get_article(request): artic ...
- tomcat部署项目启动采坑之UnknownHostException
在一台新服务器上,把war包部署在tomcat上,很普通的很简单的一个活,但我踩到一个大坑. 需要组件tomcat8,mysql5.7,mosqquito1.5,centos7,war包,把组件都装好 ...
- 微信跳转之WAP跳转微信公众号关注页面链接weixin://dl/business/?ticket=
本文整理了部分微信 URL Schemes,经过本人测试,所有url在微信 6.3.22 版本下都可正常工作.大家可以在 Safari 中打开链接进行尝试.(部分链接仅允许在微信内部浏览器中打开,已用 ...
- hyperopt自动调参
hyperopt自动调参 在传统机器学习和深度学习领域经常需要调参,调参有些是通过通过对数据和算法的理解进行的,这当然是上上策,但还有相当一部分属于"黑盒" hyperopt可以帮 ...
- deepin 开机进入 initramfs,无法开机
原因 这个问题多是由于不正常关机造成文件系统出问题导致的 解决 fsck -t ext4 /dev/sda6 这个命令用于修复磁盘,一直选择y即可. 如果sda6 不行就换位sda1 再试. 执行完后 ...
- vue的登陆验证及返回登录前页面实现
一.路由配置部分如下所示, 导出路由示例 let router = new VueRouter({ routes: [ // 登陆 { name: 'login', path: '/login', c ...
- 删除 id 列表 存进数据库
当图片写的传id的时候 用着方法存进数据库