什么是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 利用日志查看ef生成的SQL语句

    EF Core 没有直接提供像 EF6 那样方便的在日志中记录最终生成的 SQL 的功能,可以通过官方提供的日志记录(Microsoft.Extensions.Logging)实现. 一. 使用 Mi ...

  2. pwn学习(1)

    0x00 简介 入职之后,公司发布任务主搞pwn和re方向,re之前还有一定的了解,pwn我可真是个弟弟,百度了一番找到了蒸米大佬的帖子,现在开始学习. 0x01 保护方式 NX (DEP):堆栈不可 ...

  3. WPF自定义仪表盘控件

    闲来无事,分享一个仪表盘 源码: 直接复制代码即可运行,=.=! <Window x:Class="TGP.InstrumentationDemo.MainWindow" x ...

  4. About Why Inline Member Function Should Defined in The Header File

    About why inline member function should defined in the header file. It is legal to specify inline on ...

  5. 工具系列-idea破解

    >>>>>>>>>>>>>>>>>>>>>>>>> ...

  6. MongoDB数据库发展历程及商业模式

    2007年,Dwight Merriman, Eliot Horowitz和Kevin Ryan成立10gen软件公司,在成立之初,这家的公司目标进军云计算行业,为企业提供云计算服务.在开发云计算产品 ...

  7. 022 包含min函数的栈

    1.题目 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 2.分析 最初想法是定义一个成员变量min来存放最小元素,但是当最小元素弹出后,min ...

  8. MFC学习RepositionBars

    学习过程中用到了就找了下资料 https://blog.csdn.net/u012372584/article/details/50718968

  9. 针对 jQuery Gridly 控件显示多少列的问题。

    针对 jQuery Gridly 控件显示多少列的问题,完全根据 columns 的值来显示. 但是显示columns,并不是给多少值显示几列.到目前还是很模糊的.官方文档没有给出具体的一个解释. $ ...

  10. [CF1132G]Greedy Subsequences

    [CF1132G]Greedy Subsequences 题目大意: 定义一个序列的最长贪心严格上升子序列为:任意选择第一个元素后,每次选择右侧第一个大于它的元素,直到不能选为止. 给定一个长度为\( ...