以下简介——来自百度百科

NPOI 是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。

使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作。

(一)传统操作Excel遇到的问题:
1、如果是.NET,需要在服务器端装Office,且及时更新它,以防漏洞,还需要设定权限允许.NET访问COM+,如果在导出过程中出问题可能导致服务器宕机。
2、Excel会把只包含数字的列进行类型转换,本来是文本型的,Excel会将其转成数值型的,比如编号000123会变成123。
3、导出时,如果字段内容以“-”或“=”开头,Excel会把它当成公式进行,会报错。
4、Excel会根据Excel文件前8行分析数据类型,如果正好你前8行某一列只是数字,那它会认为该列为数值型,自动将该列转变成类似1.42702E+17格式,日期列变成包含日期和数字的。
(二)使用NPOI的优势
1、您可以完全免费使用该框架
2、包含了大部分EXCEL的特性(单元格样式、数据格式、公式等等)
3、专业的技术支持服务(24*7全天候) (非免费)
4、支持处理的文件格式包括xls, xlsx, docx.
5、采用面向接口的设计架构( 可以查看 NPOI.SS 的命名空间)
6、同时支持文件的导入和导出
7、基于.net 2.0 也支持xlsx 和 docx格式(当然也支持.net 4.0)
8、来自全世界大量成功且真实的测试Cases
9、大量的实例代码
11、你不需要在服务器上安装微软的Office,可以避免版权问题。
12、使用起来比Office PIAAPI更加方便,更人性化。
13、你不用去花大力气维护NPOINPOI Team会不断更新、改善NPOI,绝对省成本。
NPOI之所以强大,并不是因为它支持导出Excel,而是因为它支持导入Excel,并能“理解”OLE2文档结构,这也是其他一些Excel读写库比较弱的方面。通常,读入并理解结构远比导出来得复杂,因为导入你必须假设一切情况都是可能的,而生成你只要保证满足你自己需求就可以了,如果把导入需求和生成需求比做两个集合,那么生成需求通常都是导入需求的子集,这一规律不仅体现在Excel读写库中,也体现在pdf读写库中,目前市面上大部分的pdf库仅支持生成,不支持导入。
 
实例如下所示:

NPOI使用步骤:
==>获取NPOI第三方DLL及相关信息V_2.1.1.0
==>引入相关DLL,如下图所示:
==>创建ExcelHelper帮助类
==>实现具体的保存(如下,从GridView中保存数据到Excel)
注意:本地需要有相关ExcelTemplate.xls模板

--------------Excel操作帮助类ExcelHelper--------------
public abstract class ExcelHelper
{
#region structure、define

public ExcelHelper() { }

/// <summary>
/// NPIO的workbook
/// </summary>
private IWorkbook Workbook;

/// <summary>
/// NPIO的sheet
/// </summary>
private ISheet Sheet;

#endregion

#region public method

/// <summary>
/// 将文件保存到指定的位置
/// </summary>
public void WriteToFile(string filePath)
{
try
{
using (FileStream file = new FileStream(filePath, FileMode.Create))
{
Workbook.Write(file);
file.Close();
}

DialogResult result = MessageBox.Show(
"保存测试结果完成\n是否查看测试结果",
"提示",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
System.Diagnostics.Process.Start(filePath);
}
}
catch
{
return;
}
}

public bool WriteToFile2(string filePath)
{
try
{
using (FileStream file = new FileStream(filePath, FileMode.Create))
{
Workbook.Write(file);
file.Close();
}
}
catch
{
return false;
}
return true;
}

/// <summary>
/// 将指定位置的文件复制到指定的新位置
/// </summary>
/// <param name="sourceFileName">选择文件路径</param>
/// <param name="targetFileName">目标文件路径</param>
public void CopyModel(string sourceFileName, string targetFileName)
{
File.Copy(sourceFileName, targetFileName, true);
}

/// <summary>
/// 是否存在指定的模版文件
/// </summary>
/// <param name="filePath">文件路径</param>
/// <returns>true/false</returns>
public bool IsExistFile(string filePath)
{
string excelModelPath = AppDomain.CurrentDomain.BaseDirectory + "\\Template.xlsx";
if (File.Exists(excelModelPath))
{
File.Copy(excelModelPath, filePath, true);
return true;
}
else
{
MessageBox.Show("加载Excel模板失败,请从新加载Execl模板!");
return false;
}
}

/// <summary>
///设置样式—标题
/// </summary>
/// <returns></returns>
public ICellStyle SetHeaderStyle(string headerTest)
{
//合并单元格
//设置一个合并单元格区域,使用上下左右定义CellRangeAddress区域
//CellRangeAddress四个参数为:起始行,结束行,起始列,结束列
// Sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 5));

ICellStyle style = Workbook.CreateCellStyle();
style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;

IFont font = Workbook.CreateFont();
font.FontHeightInPoints = 20;
font.Boldweight = short.MaxValue;
font.FontName = "微软雅黑";
style.SetFont(font);

//边框
style.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
style.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
style.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
style.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;

return style;
}

/// <summary>
/// 设置样式—列表表头
/// </summary>
/// <param name="fontSize">字体大小</param>
/// <returns></returns>
public ICellStyle SetColumnStyle(int fontSize)
{
ICellStyle style = Workbook.CreateCellStyle();
style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;
IFont font = Workbook.CreateFont();
font.FontHeightInPoints = (short)fontSize;
font.Boldweight = short.MaxValue;
font.FontName = "微软雅黑";
style.SetFont(font);

//边框
style.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
style.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
style.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
style.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;

return style;
}

public ISheet GetSheet(string filePath, string sheetName)
{
using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite))
{
if (Workbook == null)
{
Workbook = new XSSFWorkbook(file);
}

Sheet = Workbook.GetSheet(sheetName);
if (Sheet == null)
{
Sheet = Workbook.CreateSheet(sheetName);
}
//合并单元格
//设置一个合并单元格区域,使用上下左右定义CellRangeAddress区域
//CellRangeAddress四个参数为:起始行,结束行,起始列,结束列
Sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 5));
file.Close();

return Sheet;
}
}

/// <summary>
/// 将RadGridView中数据导入到Excel
/// 第一步,判断Excel是否存在
/// 第二步,获取或创建Sheet
/// 第三步,获取数据并保存到流
/// 第四步,保存数据到文件
/// </summary>
/// <param name="filePath">文件路径</param>
/// <param name="sheetName">sheet名称</param>
/// <param name="dataview">RadGridView</param>
/// <param name="headerTest">Excel标题内容</param>
public void SaveDataToExcel(string filePath, string sheetName,
RadGridView dataview, string headerTest)
{
try
{
if (!IsExistFile(filePath))
{
return;
}
//获取Sheet
ISheet sheet = GetSheet(filePath, sheetName);
//获取数据
GetData(sheet, dataview, headerTest);
//保存数据
WriteToFile(filePath);
}
catch (Exception ex)
{
MessageBox.Show("error==" + ex.Message);
}
}

public bool SaveDataToExcel2(string filePath, string sheetName,
RadGridView dataview, string headerTest)
{
try
{
if (!IsExistFile(filePath))
{
return false;
}
//获取Sheet
ISheet sheet = GetSheet(filePath, sheetName);
//获取数据
GetData(sheet, dataview, headerTest);
//保存数据
//WriteToFile2(filePath);
}
catch (Exception ex)
{
MessageBox.Show("error==" + ex.Message);
}
return true;
}

#endregion

#region virtual/abstract method

/// <summary>
/// 将RadGridView中数据导入到Excel
/// 第一步,判断Excel是否存在
/// 第二步,获取或创建Sheet
/// 第三步,获取数据并保存到流
/// 第四步,保存数据到文件
/// </summary>
/// <param name="filePath">文件路径</param>
/// <param name="sheetName">sheet名称</param>
/// <param name="modelList">modelList,实体对象集合</param>
/// <param name="headerTest">Excel标题内容</param>
public virtual void SaveDataToExcel<TModel>(string filePath, string sheetName,
List<TModel> modelList, string headerTest) { }

/// <summary>
/// 获取数据并保存到流
/// </summary>
/// <param name="sheet">sheet</param>
/// <param name="dataview">RadGridView</param>
/// <param name="headerTest">Excel标题内容</param>
public abstract void GetData(ISheet sheet, RadGridView dataview, string headerTest);

#endregion

}
---------具体实现类---------
public class SaveGridViewToExcel : ExcelHelper
{
#region structure、single

public SaveGridViewToExcel() { }

private static SaveGridViewToExcel instance;

public static SaveGridViewToExcel Instance
{
get
{
if (instance ==null)
{
instance = new SaveGridViewToExcel();
}
return SaveGridViewToExcel.instance;
}
}

/// <summary>
/// Excel样式
/// </summary>
private ICellStyle Style = null;
private ICellStyle ColStyle = null;

#endregion

#region override method

public override void GetData(ISheet sheet, RadGridView dataview, string headerTest)
{
//获取样式
//获取样式
if (Style == null)
{
Style = SetHeaderStyle(headerTest);
}
if (ColStyle == null)
{
ColStyle = SetColumnStyle(16);
}
//添加标题并设置其样式
IRow headerRow = sheet.CreateRow(0);
sheet.GetRow(0).CreateCell(0).CellStyle = Style;
sheet.GetRow(0).CreateCell(1).CellStyle = Style;
sheet.GetRow(0).CreateCell(2).CellStyle = Style;
sheet.GetRow(0).CreateCell(3).CellStyle = Style;
sheet.GetRow(0).CreateCell(4).CellStyle = Style;
sheet.GetRow(0).CreateCell(5).CellStyle = Style;
sheet.GetRow(0).GetCell(0).SetCellValue(headerTest);
//列表标题
sheet.CreateRow(1);
sheet.GetRow(1).CreateCell(0).CellStyle = ColStyle;
sheet.GetRow(1).CreateCell(1).CellStyle = ColStyle;
sheet.GetRow(1).CreateCell(2).CellStyle = ColStyle;
sheet.GetRow(1).CreateCell(3).CellStyle = ColStyle;
sheet.GetRow(1).CreateCell(4).CellStyle = ColStyle;
sheet.GetRow(1).CreateCell(5).CellStyle = ColStyle;
sheet.GetRow(1).GetCell(0).SetCellValue(dataview.Columns[0].HeaderText);
sheet.GetRow(1).GetCell(1).SetCellValue(dataview.Columns[1].HeaderText);
sheet.GetRow(1).GetCell(2).SetCellValue(dataview.Columns[2].HeaderText);
sheet.GetRow(1).GetCell(3).SetCellValue(dataview.Columns[3].HeaderText);
sheet.GetRow(1).GetCell(4).SetCellValue(dataview.Columns[4].HeaderText);
sheet.GetRow(1).GetCell(5).SetCellValue(dataview.Columns[5].HeaderText);

int startpoint = 2;
ICellStyle colStyle2 = null;
for (int i = 0; i < dataview.Rows.Count; i++)
{
//首次需要创建行
sheet.CreateRow(startpoint).CreateCell(0).SetCellValue(dataview.Rows[i].Cells[0].Value.ToString());
sheet.GetRow(startpoint).CreateCell(1).SetCellValue(dataview.Rows[i].Cells[1].Value.ToString());
sheet.GetRow(startpoint).CreateCell(2).SetCellValue(dataview.Rows[i].Cells[2].Value.ToString());
sheet.GetRow(startpoint).CreateCell(3).SetCellValue(dataview.Rows[i].Cells[3].Value.ToString());
sheet.GetRow(startpoint).CreateCell(4).SetCellValue(dataview.Rows[i].Cells[4].Value.ToString());
sheet.GetRow(startpoint).CreateCell(5).SetCellValue(dataview.Rows[i].Cells[5].Value.ToString());
//设置样式
if (colStyle2 == null)
{
colStyle2 = SetColumnStyle(12);
}
sheet.GetRow(startpoint).GetCell(0).CellStyle = colStyle2;
sheet.GetRow(startpoint).GetCell(1).CellStyle = colStyle2;
sheet.GetRow(startpoint).GetCell(2).CellStyle = colStyle2;
sheet.GetRow(startpoint).GetCell(3).CellStyle = colStyle2;
sheet.GetRow(startpoint).GetCell(4).CellStyle = colStyle2;
sheet.GetRow(startpoint).GetCell(5).CellStyle = colStyle2;
startpoint++;
}
}

#endregion

}

-------------客户端调用---------------

UI

源码
public partial class Form1 : RadForm
{
public Form1()
{
InitializeComponent();

InitData();
}

private void InitData()
{
dgvList.Rows.AddNew();
dgvList.Rows[0].Cells[0].Value = "1";
dgvList.Rows[0].Cells[1].Value = "西游记";
dgvList.Rows[0].Cells[2].Value = "380";
dgvList.Rows[0].Cells[3].Value = "180";
dgvList.Rows[0].Cells[4].Value = "陕西邮电出版社";
dgvList.Rows[0].Cells[5].Value = "哈哈";

dgvList.Rows.AddNew();
dgvList.Rows[1].Cells[0].Value = "2";
dgvList.Rows[1].Cells[1].Value = "红楼梦";
dgvList.Rows[1].Cells[2].Value = "390";
dgvList.Rows[1].Cells[3].Value = "100";
dgvList.Rows[1].Cells[4].Value = "中央邮电出版社";
dgvList.Rows[1].Cells[5].Value = "哈哈哈";

dgvList.Rows.AddNew();
dgvList.Rows[2].Cells[0].Value = "3";
dgvList.Rows[2].Cells[1].Value = "三国演义";
dgvList.Rows[2].Cells[2].Value = "360";
dgvList.Rows[2].Cells[3].Value = "120";
dgvList.Rows[2].Cells[4].Value = "山东出版社";
dgvList.Rows[2].Cells[5].Value = "哈哈哈哈";

dgvList.Rows.AddNew();
dgvList.Rows[3].Cells[0].Value = "4";
dgvList.Rows[3].Cells[1].Value = "水浒传";
dgvList.Rows[3].Cells[2].Value = "380";
dgvList.Rows[3].Cells[3].Value = "108";
dgvList.Rows[3].Cells[4].Value = "山东出版社";
dgvList.Rows[3].Cells[5].Value = "哈哈哈哈哈";
for (int i = 4; i < 5000; i++)
{
dgvList.Rows.AddNew();
dgvList.Rows[i].Cells[0].Value = (i + 1).ToString();
dgvList.Rows[i].Cells[1].Value = "水浒传";
dgvList.Rows[i].Cells[2].Value = "380";
dgvList.Rows[i].Cells[3].Value = "108";
dgvList.Rows[i].Cells[4].Value = "山东出版社";
dgvList.Rows[i].Cells[5].Value = "呵呵呵";
}
}

private void btnExport_Click(object sender, EventArgs e)
{
string sheetName = "图书信息列表";
SaveFileDialog sf = new SaveFileDialog();
sf.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
if (sf.ShowDialog() == DialogResult.OK)
{
string path = string.Empty;
if (!sf.FileName.Contains(".xlsx"))
{
path = sf.FileName + ".xlsx";
}
else
{
path = sf.FileName;
}
//ExcelManage.Instance.SaveDataToExcelByGridView(path,
// sheetName, this.dgvList, "基础数据信息列表");

//SaveGridViewToExcel.Instance.SaveDataToExcel(path,
// sheetName, this.dgvList, "基础数据信息列表");

ExcelHelper helper = new SaveGridViewToExcel();
helper.SaveDataToExcel(path, sheetName, this.dgvList, "基础数据信息列表");

}
}

string path = string.Empty;
private void btnExportAll_Click(object sender, EventArgs e)
{
SaveFileDialog sf = new SaveFileDialog();
sf.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
if (sf.ShowDialog() == DialogResult.OK)
{
this.lblStartTime.Text = DateTime.Now.ToString();
if (!sf.FileName.Contains(".xlsx"))
{
path = sf.FileName + ".xlsx";
}
else
{
path = sf.FileName;
}

SaveData();
}
}

private void SaveData()
{
ExcelHelper helper = new SaveGridViewToExcel();
string title = "基础数据信息列表";
for (int i = 1; i < 21; i++)
{
helper.SaveDataToExcel2(path, Convert.ToString(title + i), this.dgvList, "基础数据信息列表");
}

helper.WriteToFile2(path);

this.lblEndTime.Text = DateTime.Now.ToString();

DialogResult result = MessageBox.Show(
"保存测试结果完成\n是否查看测试结果",
"提示",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
System.Diagnostics.Process.Start(path);
}
}
}

 

 
 

转载于:https://www.cnblogs.com/YYkun/p/5663186.html

NPOI 操作Excel相关推荐

  1. NPOI 操作Excel学习总结

    NPOI读写Excel http://www.cnblogs.com/luxiaoxun/p/3374992.html 1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表 ...

  2. npoi获取合并单元格_梦琪小生 C# 如何使用NPOI操作Excel以及读取合并单元格等

    C#操作Excel方法有很多,以前用的需要电脑安装office才能用,但因为版权问题公司不允许安装office.所以改用NPOI进行Excel操作,基本上一些简单的Excel操作都没有问题,读写合并单 ...

  3. C# 使用NPOI 操作 Excel 文件

    C# 使用NPOI 操作 Excel 文件 使用 创建 Excel 文件 创建 XLS 文件 创建 XLSX 文件 合并单元格 设置单元格格式 对齐 字体 边框 填充 保护 数字 下拉框 直接传递下拉 ...

  4. .NET/C#使用NPOI操作Excel

    前言 Asp.net/C#操作Excel最惨的就是环境配置了:使用NPOI能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件,支持的文件格式包括xls, doc, ...

  5. .NET——NPOI操作excel

    一.引言 C#操作excel的方法大概有这几种: 1.采用OleDB读取EXCEL文件,把EXCEL文件当做一个数据源来进行数据的读取操作 2.引用的com组件:Microsoft.Office.In ...

  6. hssfwork 导出excel 文件已损坏_C# NPOI 操作EXCEL文件的读取和导出

    在实际项目中有很多场景遇到需要操作EXCEL文件,而常用到的库就有NPOI:NPOI是开源的POI 项目的.NET版,POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目, ...

  7. C#NPOI操作Excel

    C#NPOI 一.NPOI的引用 二.操作Excel 1.创建新的Excel工作簿 2.读取现有的Excel工作簿 3.操作sheet工作表 4.操作workbook工作簿 5.跨workbook工作 ...

  8. NPOI操作Excel 002:读取Excel

    本文讲述如何通过NPOI来读取Excel. 需要准备的dll见: http://blog.csdn.net/yysyangyangyangshan/article/details/42614181 环 ...

  9. 使用NPOI操作Excel

    案例:用NPOI动态生成一个Excel表,然后弹出对话框让用户下载,文件名是"用户列表.xls" 先去相关网站下载 NPOI DLL文件,再引用 application/x-exc ...

最新文章

  1. 凯撒密码、GDP格式化输出、99乘法表
  2. AFNetworking 源代码分析
  3. 济南交警推出《酒驾整治日历》酒驾为每日必查项
  4. NOIP2006提高组 能量项链
  5. MQTT——QoS服务质量等级
  6. 总结 创建领取 微信会员卡 踩过的坑
  7. 如何用Pygame写游戏(九)
  8. 给广告打“保”字标、弄风险提示 百度搜索为用户旅游操碎了心
  9. 宝塔反代默认缓存了html吗,宝塔面板安装 OneList 设置反代
  10. 脚本升级openssh
  11. lfw分类 python_无法在sklearn中使用LFW数据集
  12. 2022年低压电工题库及模拟考试
  13. 网络基础之TCP/IP五层模型
  14. python web框架django面试题收藏
  15. ILSVRC2012下载+训练
  16. android bugly qq,Android如何快速集成腾讯Bugly
  17. 【001】半电池的开路电压测试_#LIB
  18. Linux的命令和快捷键
  19. VS+QT编译出现QMYSQL driver not loaded
  20. 华为MA5626 ONU配置成交换机及开启POE指令教程

热门文章

  1. Java中的内存溢出和内存泄漏
  2. webstorm免安装版推荐
  3. 【VFS】Apache VFS: FTP
  4. 安装 Oracle11g grid 遇到如下问题,请哪位大神指点一下!
  5. zb怎么做渲染图_zb制作和通过照片绘制真实黑人头
  6. 《深入分析GCC 》——第3章 GCC总体结构3.1 GCC的目录结构
  7. (转)关闭360的主动防御
  8. 数字电路IC设计—流水线的艺术
  9. iOS 跳转到地图后导航(高德地图,百度地图,腾讯地图,苹果手机原生的地图)
  10. 黑客术语基础知识快速了解_必看