C#读写Excel实践笔记
使用第三类包:NPOI
介绍
Github地址:https://github.com/tonyqus/npoi,Java POI项目的.NET版。
通过它可以在没有安装Office软件的情况下,快速的读写Office文档。
特点:
- 跨平台
- 支持Office2003及以后所有版本
- 支持Excel的大部分特性
- 开源
- 实例丰富
- 维护者是中国人,所以交流应该问题不大
Nuget包下载:https://www.nuget.org/packages/NPOI/
实践一:读取Excel数据
注意:行列开始索引为0,没有数据的Cell为NULL。
/// <summary>
/// 读取Excel所有单元格数据
/// </summary>
/// <param name="path">文件路径</param>
/// <param name="sheetName">Sheet名</param>
/// <param name="startRow">读取开始行位置</param>
/// <param name="columns">读取列表</param>
/// <returns>单元格列表</returns>
public static async Task<IList<ICell>> ReadAllCellsAsync(string path, string sheetName, int startRow = , IList<int> columns = null)
{
var ret = new List<ICell>(); await Task.Factory.StartNew(() =>
{
using (var file = new FileStream(path, FileMode.Open, FileAccess.Read))
{
var book = WorkbookFactory.Create(file);
var sheet = book?.GetSheet(sheetName);
if (sheet != null)
{
for (int row = startRow - ; row <= sheet.LastRowNum; row++)
{
var rowValue = sheet.GetRow(row);
if (rowValue == null)
{
continue;
} if (columns == null || columns?.Count <= )
{
columns = Enumerable.Range(, rowValue.LastCellNum + ).ToList();
} foreach (int col in columns)
{
var cell = rowValue.GetCell(col - );
if (cell == null)
{
continue;
} ret.Add(cell);
}
}
}
book?.Close();
}
}); return ret;
}
取Cell值扩展函数
public static string GetCellValue(this ICell cell)
{
if (cell == null)
{
return string.Empty;
} switch (cell.CellType)
{
case CellType.Formula:
case CellType.String:
return cell.StringCellValue;
case CellType.Numeric:
if (DateUtil.IsCellDateFormatted(cell))
{
return cell.DateCellValue.ToString();
}
else
{
return cell.NumericCellValue.ToString();
}
case CellType.Boolean:
return cell.BooleanCellValue.ToString();
default:
return string.Empty;
}
}
实践二:写Excel数据
1,创建Book。
public static IWorkbook CreateBook(this string path)
{
IWorkbook book;
string extension = Path.GetExtension(path); // HSSF => Microsoft Excel(xls形式)(excel 97-2003)
// XSSF => Office Open XML Workbook形式(xlsx形式)(excel 2007+)
if (extension == ".xls")
{
book = new HSSFWorkbook();
}
else
{
book = new XSSFWorkbook();
} return book;
}
2,创建Sheet。
var sheet = book.CreateSheet(“test”);
3,创建单元格。(为了不区分HSSHyperLink与XSSFHyperLink直接使用了设置函数形式)
ICellStyle hlink_style = book.CreateCellStyle();
IFont hlink_font = book.CreateFont();
hlink_font.Underline = FontUnderlineType.Single;
hlink_font.Color = IndexedColors.Blue.Index;
hlink_style.SetFont(hlink_font); var row = sheet.GetRow(rowIndex) ?? sheet.CreateRow(rowIndex);
var cell = row.GetCell(columnIndex) ?? row.CreateCell(columnIndex); cell.SetCellValue("test"); // OR hyperlink
var linkcell = row.GetCell(columnIndex) ?? row.CreateCell(columnIndex);
linkcell.SetCellFormula($"hyperlink(\"{linkValue}\",\"{value}\")");
linkcell.CellStyle = hlink_style;
4,创建合并单元格。
sheet.AddMergedRegion(new CellRangeAddress(rowStart, rowEnd, columnStart, columnEnd));
5,创建单元格数据入力规则。
public static void WriteValidation(this ISheet sheet, int rowStart, int rowEnd, int columnStart, int columnEnd, string[] values)
{
var addressList = new CellRangeAddressList(rowStart, rowEnd, columnStart, columnEnd);
var helper = sheet.GetDataValidationHelper();
var dataValidation = helper.CreateValidation(helper.CreateExplicitListConstraint(values), addressList); if (dataValidation is XSSFDataValidation)
{
dataValidation.SuppressDropDownArrow = true;
dataValidation.ShowErrorBox = true;
}
else
{
dataValidation.SuppressDropDownArrow = false;
}
dataValidation.EmptyCellAllowed = true;
dataValidation.ShowPromptBox = true;
sheet.AddValidationData(dataValidation);
}
6,创建过滤器。
sheet.SetAutoFilter(new CellRangeAddress(row + , row + , , col - ));
7,创建自动调整宽度。
for (int i = ; i <= col; i++)
{
sheet.AutoSizeColumn(i, true);
}
8,单元格格式设置。
注意:如果所有单元格使用同一个ICellStyle实例,那CellStyle对象一样。
var commonFont = book.CreateFont();
commonFont.Color = IndexedColors.Black.Index;
commonFont.FontHeightInPoints = ;
var Common= book.CreateCellStyle();
Common.SetFont(commonFont);
Common.BorderBottom = BorderStyle.Thin;
Common.BorderLeft = BorderStyle.Thin;
Common.BorderRight = BorderStyle.Thin;
Common.BorderTop = BorderStyle.Thin;
Common.WrapText = true;
Common.Alignment = HorizontalAlignment.Left;
Common.VerticalAlignment = VerticalAlignment.Center; var row = sheet.GetRow(rowIndex) ?? sheet.CreateRow(rowIndex);
var cell = row.GetCell(columnIndex) ?? row.CreateCell(columnIndex);
cell.CellStyle = Common;
9,单元格部分文字颜色设置。
int rowIndex = ;
int columnIndex = ; var row = sheet.GetRow(rowIndex) ?? sheet.CreateRow(rowIndex);
var cell = row.GetCell(columnIndex) ?? row.CreateCell(columnIndex); IRichTextString richText;
if (sheet is HSSFSheet)
{
richText = new HSSFRichTextString("Microsoft OfficeTM");
}
else
{
richText = new XSSFRichTextString("Microsoft OfficeTM");
} //apply font to "Microsoft Office"
IFont redFont = workbook.CreateFont();
redFont.FontHeightInPoints = ;
redFont.Color = IndexedColors.Red.Index;
richText.ApplyFont(, , redFont); //apply font to "TM"
IFont blueFont = workbook.CreateFont();
blueFont.TypeOffset = FontSuperScript.Super;
blueFont.IsItalic = true;
blueFont.Color = IndexedColors.Blue.Index;
blueFont.FontHeightInPoints = ;
richText.ApplyFont(, , blueFont); var style = workbook.CreateCellStyle();
style.BorderBottom = BorderStyle.Thin;
style.BorderLeft = BorderStyle.Thin;
style.BorderRight = BorderStyle.Thin;
style.BorderTop = BorderStyle.Thin;
// 解决字体大小不一样问题
richText.ApplyFont(style.FontIndex);
cell.SetCellValue(richText);
cell.CellStyle = style;
实行结果:

这样通过NPOI基本的Excel操作就没问题了。
C#读写Excel实践笔记的更多相关文章
- 【原创】.NET读写Excel工具Spire.Xls使用(3)单元格控制
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html .NET读写Excel工具Spire.Xls使用文章 ...
- C++读写EXCEL文件OLE,java读写excel文件POI 对比
C++读写EXCEL文件方式比较 有些朋友问代码的问题,将OLE读写的代码分享在这个地方,大家请自己看.http://www.cnblogs.com/destim/p/5476915.html C++ ...
- Python编程从入门到实践笔记——文件
Python编程从入门到实践笔记——文件 #coding=gbk #Python编程从入门到实践笔记——文件 #10.1从文件中读取数据 #1.读取整个文件 file_name = 'pi_digit ...
- 《python编程从入门到实践》读书实践笔记(一)
本文是<python编程从入门到实践>读书实践笔记1~10章的内容,主要包含安装.基础类型.函数.类.文件读写及异常的内容. 1 起步 1.1 搭建环境 1.1.1 Python 版本选择 ...
- MFC vs2012 Office2013 读写excel文件
近期在忙一个小项目(和同学一起搞的),在这里客户要求不但读写txt,而且可以读写excel文件,这里本以为很简单,结果...废话少说,过程如下: 笔者环境:win7 64+VS2012+Office2 ...
- C# 使用 NPOI 库读写 Excel 文件(转载)
NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件.在处理Excel文件上,NPOI 可以同时兼 容xls 和 xlsx.官网提供了一份Examples,给出了 ...
- Python3.4如何读写Excel
在python3.x(散仙使用的版本是python3.4)里,我们应该如何操作excel. 首先在python3.4里,我们可以使用新的python类库,来支持3.x之后的读写excel 针对 03版 ...
- 用Python读写Excel文件(转)
原文:google.com/ncr 虽然天天跟数据打交道,也频繁地使用Excel进行一些简单的数据处理和展示,但长期以来总是小心地避免用Python直接读写Excel文件.通常我都是把数据保存为以TA ...
- 使用NPOI读写Excel、Word
NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 ...
随机推荐
- python-2018.03.03
本周用python实现了 1.通过svn模块检出远程代码到本地(ps:修改了windows svn的一个编码模块的小bug),并通过调用MSbuild 编译.发布并打包发布后的代码 (注:以上需要安装 ...
- commons-dbcp2 新版本2.6使用连接池在关闭服务器的时候会有内存溢出的BUG....
这是异常信息.本人使用的mysql8.0数据库驱动版本mysql-connector-java Version 8.0.11,发生这种情况的原因主要是Dbcp2的XBasicDataSource在关闭 ...
- Nginx+Tomcat配置负载均衡(一)
关于负载均衡原理方面的知识点不在本文讨论范畴,本文主要就负载均衡配置过程中的细节部分配置做详细说明. 本次负载均衡大致的配置如下: 环境 : WIN7 + VM虚拟机3台(centos6.5) Ngi ...
- jQuery-4.动画篇---上卷下拉效果
jQuery中下拉动画slideDown 对于隐藏的元素,在将其显示出来的过程中,可以对其进行一些变化的动画效果.之前学过了show方法,show方法在显示的过程中也可以有动画,但是.show()方法 ...
- Linux 安装aria2
Ubuntu/Linux Mint/Debian sudo apt-get install aria2 CentOS/Fedora sudo yum install aria2 Manjaro/Arc ...
- Feign get接口传输对象引发一场追寻
一个报错引发的追寻之路: Feign get接口传输对象,调用方接口代码: @FeignClient(name = "manage") public interface Acces ...
- 学习笔记:Spark Streaming的核心
Spark Streaming的核心 1.核心概念 StreamingContext:要初始化Spark Streaming程序,必须创建一个StreamingContext对象,它是所有Spark ...
- mac系统访问windows共享文件夹
1. 打开finder 2. 找到前往 - 连接服务器 3. 打开后,输入smb://ip地址 点击连接 4. 选择共享文件夹 5. 点击好,之后就可以了,如下图
- Spring4.x Jpa + hibernate的配置(废弃JpaTemplate)
近年来 ORM(Object-Relational Mapping,对象关系映射,即实体对象和数据库表的映射)技术市场热闹非凡,各种各样的持久化框架应运而生,其中影响最大的是 Hibernate 和 ...
- python类的语法和底层实现
语法: class 类名: name = “egon” # 类属性 def __init__(self): self.age = 18 # 对象属性 self.__sex = "fe ...