基于NPOI对Excel进行简单的操作
1. 关于NPOI
NPOI是一个开源的用于在C#程序中读写Excel、WORD等微软OLE2组件文档的项目,使用NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。
2. 使用NPOI的好处
- C#程序中操作Excel的另外一种方法是使用.NET自带的Excel API,但是这种方法需要运行环境安装微软的Excel,而使用NPOI可以在没有安装Microsoft Office Excel的设备上对Excel进行操作。
 - 因为服务器一般不安装office这么庞大的办公软件,所以NPOI适合在服务器端生成数据文件。
 - 几乎支持所有的Office97~Office2007的文件格式。
 
3. NPOI使用方法
NPOI里面的管理层次为:workbook->worksheet->row->cell,类比关系型数据库就是:
| 
 NPOI  | 
 说明  | 
 关系型数据库  | 
| 
 workbook  | 
 Excel文件  | 
 database  | 
| 
 worksheet  | 
 工作表  | 
 table  | 
| 
 row  | 
 行  | 
 record记录  | 
| 
 cell  | 
 单元格  | 
 field字段  | 
3.1 获取DLL
方式1:用Nuget命令行安装NPOI引用
Install-Package NPOI -Version 2.4.
方式2:直接在VS的Nuget包管理器中搜索“NPOI”获取
3.2 将NPOI的DLL导入工程
using NPOI; //基础辅助库
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
其中,NPOI 使用 HSSFWorkbook 类来处理 xls,XSSFWorkbook 类来处理 xlsx,它们都继承接口 IWorkbook,因此可以通过 IWorkbook 来统一处理 xls 和 xlsx 格式的文件。(本文以XLSX为例)
3.3 创建和读写Excel
(1) 创建Excel文件
XSSFWorkbook workbook2007 = new XSSFWorkbook(); //创建xlsx工作簿
HSSFWorkbook workbook2003 = new HSSFWorkbook(); //新建xls工作簿
Excel规定一个Workbook必须至少带1个Sheet,所以创建Excel之后必须同时创建Sheet的代码才能保证生成的文件正常。
ISheet sheet = workbook2007.CreateSheet("sheet1"); //创建一个Sheet
创建行和列的方式:
IRow row = sheet.CreateRow(); //创建一行
ICell cell = row.CreateCell(); //创建一列
创建XSSFWorkbook实例之后,要将其写入文件:
FileStream file =new FileStream(@"NpoiTest.xlsx", FileMode.Create);
workbook2007.Write(file);
file.Close();
workbook2007.Close();
之后会在指定目录下生成Excel文件。
(2) 向Excel文件写入数据
写数据要遵循一定的顺序,可以概括为:读取(或新建一个工作簿)->获取工作表->对工作表添加行->对每一行添加单元格->对单元格赋值。
XSSFWorkbook workbook2007 = new XSSFWorkbook(); //创建xlsx工作簿
workbook2007.CreateSheet("Sheet1"); //新建1个Sheet工作表
//ISheet sheet = workbook2007.CreateSheet("Sheet1");
HSSFSheet SheetOne = (HSSFSheet)workbook2007.GetSheet("Sheet1"); //获取名称为Sheet1的工作表
//对工作表先添加行,下标从0开始
for (int i = ; i < ; i++)
{
SheetOne.CreateRow(i); //为SheetOne添加2行
//IRow row = SheetOne.CreateRow(i);
}
//对每一行创建3个单元格
HSSFRow SheetRow = (HSSFRow)SheetOne.GetRow(); //获取Sheet1工作表的首行
HSSFCell[] SheetCell = new HSSFCell[];
for (int i = ; i < ; i++)
{
SheetCell[i] = (HSSFCell)SheetRow.CreateCell(i); //为第一行创建3个单元格
//ICell headcell = SheetRow.CreateCell(i);
}
//创建之后就可以赋值了
SheetCell[].SetCellValue("CellValue");
SheetCell[].SetCellValue("CellValue2");
SheetCell[].SetCellValue("CellValue3");
FileStream file2007 = new FileStream(@"E:\Excel2007.xls", FileMode.Create);
workbook2007.Write(file2007);
file2007.Close();
workbook2007.Close(); //转化为字节数组
//MemoryStream ms = new MemoryStream();
//workbook.Write(ms);
//ms.Flush();
//ms.Position = 0;
//return ms;
(3) 读取Excel文件数据
workbook的写入需要借助于FileStream来打开一个文件流,在创建FileStream的时候,可以传入数据的保存路径和文件名。
HSSFWorkbook类和XSSFWorkbook类都继承自IWorkbook类,所以在不知道所要读取的Excel文件时xls还是xlsx时,可以使用IWorkbook来声明一个通用的工作簿变量,随后根据传入的文件名判断是xls还是xlsx。
IWorkbook workbook = null; //新建IWorkbook对象
string fileName = "E:\\Excel2007.xls";
FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
if (fileName.IndexOf(".xlsx") > ) // 2007版本
{
workbook = new XSSFWorkbook(fileStream); //xlsx数据读入workbook
}
else if (fileName.IndexOf(".xls") > ) // 2003版本
{
workbook = new HSSFWorkbook(fileStream); //xls数据读入workbook
}
ISheet sheet = workbook.GetSheetAt(); //获取第一个工作表
IRow row;// = sheet.GetRow(0); //新建当前工作表行数据
for (int i = ; i < sheet.LastRowNum; i++) //对工作表每一行
{
row = sheet.GetRow(i); //row读入第i行数据
if (row != null)
{
for (int j = ; j < row.LastCellNum; j++) //对工作表每一列
{
string cellValue = row.GetCell(j).ToString(); //获取i行j列数据
Console.WriteLine(cellValue);
}
}
}
Console.ReadLine();
fileStream.Close();
workbook.Close();
3.4 Excel样式设置
(1) 设置字体
ICellStyle style = workbook.CreateCellStyle();//创建样式对象
IFont font = workbook.CreateFont(); //创建一个字体样式对象
font.FontName = "方正舒体"; //和excel里面的字体对应
font.Color = new HSSFColor.PIN.Index();//颜色参考NPOI的颜色对照表 (对照表见参考网址(参考文档2))
font.IsItalic = true; //斜体(下划线?)
font.FontHeightInPoints = ;//字体大小
font.Boldweight = short.MaxValue;//字体加粗
style.SetFont(font); //将字体样式赋给样式对象
cell.CellStyle = style; //把样式赋给单元格
(2) 设置单元格前景色
ICellStyle style=workbook.CreateCellStyle();
style.FillForegroundColor = ; //具体数字代表的颜色看NPOI颜色对照表
style.FillPattern = FillPatternType.SOLID_FOREGROUND; style.FillForegroundColor = HSSFColor.Blue.Index;//选中后文字背景
style.FillBackgroundColor = HSSFColor.Red.Index;//选中后单元格背景
style.FillPattern = FillPattern.AltBars;
(3) 设置单元格宽高
row.Height = * ; //行高,行高为30
sheet.SetColumnWidth(, * ) //列宽,第4列的列宽为13
(4) 合并单元格
单元格合并后,样式以左上角的单元格为准。
sheet.AddMergedRegion(new CellRangeAddress(, , , ));
//CellRangeAddress四个参数为:起始行,结束行,起始列,结束列
(5) 单元格水平居中和对齐
style.Alignment = HorizontalAlignment.CENTER;
style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;//水平对齐
style.VerticalAlignment = VerticalAlignment.Center;//垂直对齐
(6) 设置公式
cell.SetCellFormula = "公式"; //公式中不需要写“=”号
(7) 设置边框
分别设置上下左右边框样式
style.BorderTop = NPOI.SS.UserModel.BorderStyle.THIN;
style.BorderBottom = NPOI.SS.UserModel.BorderStyle.THIN;
style.BorderLeft = NPOI.SS.UserModel.BorderStyle.THIN;
style.BorderRight = NPOI.SS.UserModel.BorderStyle.THICK;
分别设置上下左右边框颜色
style.TopBorderColor = HSSFColor.OliveGreen.Blue.Index;
style.BottomBorderColor = HSSFColor.OliveGreen.Blue.Index;
style.LeftBorderColor = HSSFColor.OliveGreen.Blue.Index;
style.RightBorderColor = HSSFColor.OliveGreen.Blue.Index;
(8) 其它
style.WrapText = true; //自动换行
style.Indention = ;//缩进
3.5 用类CSS的方法设置单元格样式
NPOI.CSS是一个可以在使用NPOI时用类CSS的方法设置单元格样式的NPOI扩展,支持.NET4及以上版本的项目。
(1) 引用NPOI.CSS.dll
using NPOI.CSS;
(2) 设置单元格样式
cell.CSS("color:red;font-weight:bold;font-size:11;font-name:宋体;border-type:thin;");
具体样式参数见参考网址(参考文档3)。
(网上好像很难找到NPOI.CSS.dll的资源,需要的朋友可以直接在Github(参考文档3)找到源码,然后编译生成。)
参考文档:
1.文档读写相关:
https://blog.csdn.net/dcrmg/article/details/52356236
2. 样式设置相关:
https://www.cnblogs.com/nxxshxf/p/6410797.html
https://blog.csdn.net/qq_35957944/article/details/85163316
3. NPOI.CSS属性:
https://github.com/qihangnet/NPOI.CSS
原文地址:https://www.cnblogs.com/imdeveloper/p/10963364.html
转载请注明出处,谢谢!
基于NPOI对Excel进行简单的操作的更多相关文章
- 并发编程概述  委托(delegate)  事件(event)  .net core 2.0 event bus 一个简单的基于内存事件总线实现  .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段  基于Ace Admin 的菜单栏实现  第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
		
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
 - Java 实现Excel的简单读取操作
		
JAVA实现Excel表单的简单读取操作 实现Excel表单的简单读取操作,首先要导入相关的jar包: 如图所示: 此处贴上代码: public static List<List<Stri ...
 - C#利用NPOI导出Excel类(简单版)
		
代码: using System.Data; using System.IO; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; namespac ...
 - .Net Core下基于NPOI对Excel、Word操作封装
		
本库进行了重写,如果需要请转移到下文查看: https://www.cnblogs.com/holdengong/p/10889780.html 框架与依赖 框架:.NET Standard 2.0 ...
 - 基于NPOI导出Excel
		
在上一篇文章[关于大数据的查询与导出]中,提到了使用NPOI组件导出Excel,本想上次一起分享给大家,无奈最近比较忙,今天抽空整理了下,分享出来. 预置填充模板,并且需要支持公式计算; 可导入图片; ...
 - 分享:一个基于NPOI的excel导入导出组件(强类型)
		
一.引子 新进公司被安排处理系统的数据报表任务——对学生的考试成绩进行统计并能导出到excel.虽然以前也有弄过,但感觉不是很好,所以这次狠下心,多花点时间作个让自己满意的插件. 二.适用领域 因为需 ...
 - 基于NPOI的Excel数据导入
		
从Excel导入数据最令人头疼的是数据格式的兼容性,特别是日期类型的兼容性.为了能够无脑导入日期,折腾了一天的NPOI.在经过测试确实可以导入任意格式的合法日期后,写下这篇小文,与大家共享.完整代码请 ...
 - C# 使用NPOI 实现Excel的简单导入导出
		
private void btnImport_Click(object sender, EventArgs e) { DataSet ds = new DataSet(); DataTable dt ...
 - .net core 基于NPOI 的excel导入导出类,支持自定义导出哪些字段,和判断导入是否有失败的记录
		
#region 从Excel导入 //用法 //var cellHeader = new Dictionary<string, string>(); //cellHeader.Add(&q ...
 
随机推荐
- 通过Request对象获取请求的IP地址
			
/** * 标识要从哪些消息头中获取IP地址 */ private static final String[] getIpArray = {"HTTP_X_FORWARDED_FOR&quo ...
 - node知识
			
node中的url url中的方法: parse,resolve,format: 方法parse: 例子:url.parse('http://imooc.com/course/list'); 结果:{ ...
 - 唐敬博-201871010118 《面向对象程序设计(java)》第六、七周学习总结
			
在博客园撰写博客(随笔),总结6-7周学习内容(包括实验内容),作业格式要求如下: 博文名称:学号-姓名<面向对象程序设计(java)>第四周学习总结(1分) 博文正文开头格式:(2分) ...
 - AsyncTask隐藏的陷阱
			
转自:http://blog.csdn.net/snow4dev/article/details/8809897 当AsyncTask被介绍到Android中时,它被贴上“无忧线程”的标签.其目标是让 ...
 - zz1998_Efficient Backprop笔记
			
1998_Efficient Backprop笔记 A few practical tricks 1. Stochastic vs Batch learning 在最小值附近震荡的幅度与学习速率成比例 ...
 - CF1193A Amusement Park
			
洛谷 CF1193A Amusement Park 洛谷传送门 题目翻译 有一个游乐场有一个好玩的项目:一些有向滑梯可以将游客从一个景点快速.刺激地传送到另一个景点.现在,你要帮游乐场老板来规划一个造 ...
 - P256 VRF实现解读
			
目录 P256 VRF实现及其改造 公式推导 H1:把任意信息映射到曲线上的点 H2: 映射任意信息为(1,q) 计算随机数 随机数的proof 如何验证 VRF优点 针对S256曲线的改造 1. 使 ...
 - Excel-基本操作
			
一.EXCEL的数据类型 1.字符型 2.数值型 3.日期型数据和时间型数据 二.快捷键 ctrl+上下左右健 快速选择某区域 上下左右单元格 ctrl+shift+上下左右 快速选择某个取悦 三. ...
 - B1038 统计同成绩学生 (20 分)
			
#include<iostream> #include<cstring> using namespace std; const int maxn = 10010; int sc ...
 - [LeetCode] 112. Path Sum 二叉树的路径和
			
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...