基于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 ...
随机推荐
- Linux-CentOS-Nginx安装
原文转自 jerryhe326:https://www.cnblogs.com/jerrypro/p/7062101.html 一.安装准备 首先由于nginx的一些模块依赖一些lib库,所以在安装n ...
- testlink 1.9.19安装
环境平台: 系统:Centos 7.6 数据库:mysql 5.7 PHP版本:PHP 5.6 testlink版本:testlink- 链接:https://pan.baidu.com/s/10Pr ...
- 安装教程-Xshell 5 远程连接工具的安装
Xshell 5 远程连接工具的安装 1.实验描述 物理机中安装 Xshell 5 ,为实现 Linux 等操作系统提供远程连接的环境. 2.实验环境 物理机系统:Windows 10 企业版 3.实 ...
- Spring Junit 测试样例
SpringMVC 框架下的junit测试方式 package com.sixeco.user.controller; import org.apache.logging.log4j.LogManag ...
- scanf的返回值
参考这个博客,https://blog.csdn.net/sinat_40936062/article/details/84348021 #include<stdio.h> int mai ...
- 201871010134-周英杰《面想对象程序设计(java)》第十一周学习总结
项目 内容 <面向对象程序设计(java)> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/ ...
- day6_面向对象的概念
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/7/11 16:20 # @Author : 大坏男孩 # @File : d ...
- 怎么在虚拟机下的Linux系统安装数据库
1.查看 linux下是否有老版本的mysql(有删除) 查找old mysql:rpm -qa | grep mysql 卸载:卸载命令:rpm –ev {包名}——:rpm -ev mysql-c ...
- scrapy机制mark(基于twisted)
twisted twisted管理了所有的异步任务 Twisted的主线程是单线程的,即reactor线程: 而这些io耗时操作会在线程池中运行,不再twisted主线程中运行,即通过线程池来执行异步 ...
- cf1182D Complete Mirror
可以得到一个结论, 可行的点要么是直径端点, 要么是直径中点, 要么是直径中点引出的链中最短的端点 #include<cstdio> #include<algorithm> # ...