什么是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的更多相关文章

  1. C# 使用 NPOI 库读写 Excel 文件

    NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件.在处理Excel文件上,NPOI 可以同时兼容 xls 和 xlsx.官网提供了一份 Examples,给出 ...

  2. C# 使用 NPOI 库读写 Excel 文件(转载)

    NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件.在处理Excel文件上,NPOI 可以同时兼 容xls 和 xlsx.官网提供了一份Examples,给出了 ...

  3. C# 中 NPOI 库读写 Excel 文件的方法【摘】

    原作:淡水网志 NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件.在处理Excel文件上,NPOI 可以同时兼容 xls 和 xlsx.官网提供了一份 Exa ...

  4. NPOI简单操作excel

    本文仅当是个记录文件,仅供初学者参考. 首先得using几个npoi的空间名如下: using NPOI.HSSF.UserModel;using NPOI.HSSF.Util;using NPOI. ...

  5. NPOI库读写Excel文件

    //首先Nuget安装NPOI库using System; using System.Data; using System.IO; using NPOI.HSSF.UserModel; using N ...

  6. 使用NPOI读写Excel、Word

    NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 ...

  7. NPOI读写Excel

    1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.NPOI是POI的C#版本,NPOI的行和列的index都是从0开始 ...

  8. NPOI.dll 用法。单元格,样式,字体,颜色,行高,宽度。读写excel

    NPOI.dll 用法.单元格,样式,字体,颜色,行高,宽度.读写excel 转载:http://yuncode.net/code/c_531e679b3896495 view source prin ...

  9. JS异步上传Excel 并使用NPOI进行读写操作

    实现功能 导入——客户端使用 ajaxfileupload.js 插件实现Excel的异步上传,并在服务端解析成JSON字符串返回页面 导出——将页面中的grid表拼接成JSON串上传至服务器,在服务 ...

随机推荐

  1. .net core 接口返回图片并且进行压缩

    背景:  .net core 中默认已经取消可以直接访问图片,因为这样不安全. 导致我们上传的图片无法直接通过url访问. 解决方案:  一: 通过修改项目配置,使可以直接通过url访问.(方法略,可 ...

  2. sql server 实现split功能 行转列

    --實現split功能的函數create function [dbo].[func_split]( @SourceSql varchar(max), @StrSeprate varchar(10))r ...

  3. Unity 5.x动态加载光照信息(所有坑已踩)

    能搜到这的应该是被新的烘焙系统坑了少时间,4.x到5.x美术必须重新烘焙,关于美术的没什么说的,只有---重新烘焙! 新的烘焙系统,为了兼容5.x的多场景编辑功能,将烘焙信息从mesh全部挪到了一个中 ...

  4. [奇思异想]使用Zookeeper管理数据库连接串

    背景 有一套特定规格的应用(程序+数据库),当有业务需求时,就需要多部署应用,并且所有的应用都使用一个共同的后台来管理.应用新增后,如何通知后台更新连接串成了一个关键的问题.于是就产生了使用ZooKe ...

  5. DevExpress控件库 开发使用经验总结3 制作项目安装包

    2015-01-27 使用DevExpress控件包开发C/S项目完成后,部署前需要制作本地安装包.本文还是使用“SetupFactory”安装工厂来制作安装包.在以前的系列文章中详细介绍过该工具的使 ...

  6. day20.序列化模块

    参考云游道士:https://www.cnblogs.com/yyds/p/6563608.html 1.什么是序列化 序列化就是将字典,数字等数据类型转换为字符串数据类型 所说的序列就是字符串 2. ...

  7. Android进阶:七、Retrofit2.0原理解析之最简流程【上】

    retrofit 已经流行很久了,它是Square开源的一款优秀的网络框架,这个框架对okhttp进行了封装,让我们使用okhttp做网路请求更加简单.但是光学会使用只是让我们多了一个技能,学习其源码 ...

  8. 【省选十连测之一】【线段树】【最小生成树之Kruskal】公路建设

    目录 题意 输入格式 输出格式 数据范围 思路 代码 题意 有n个点,m条双向道路,其中第条公路的两个端点是u[i],v[i],费用是c[i]. 现在给出q个询问,每次给定一个L和一个R,要求你只能够 ...

  9. BZOJ4668: 冷战 [并查集 按秩合并]

    BZOJ4668: 冷战 题意: 给定 n 个点的图.动态的往图中加边,并且询问某两个点最早什 么时候联通,强制在线. 还可以这样乱搞 并查集按秩合并的好处: 深度不会超过\(O(\log n)\) ...

  10. CentOS7 VMware-Tools安装与共享文件夹设置

    一. VMware-Tools安装 1.加载VMware Tools的光驱:点击"虚拟机"->"安装VMware Tools".这里,由于我已经安装了,所 ...