C# 中 NPOI 库读写 Excel 文件的方法【摘】
原作:淡水网志
NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件。在处理Excel文件上,NPOI 可以同时兼容 xls 和 xlsx。官网提供了一份 Examples,给出了很多应用场景的例子,打包好的二进制文件类库,也仅有几MB,使用非常方便。
读Excel
NPOI使用HSSFWorkbook
类来处理xls,XSSFWorkbook
类来处理xlsx,它们都继承接口IWorkbook
,因此可以通过IWorkbook
来统一处理xls和xlsx格式的文件。
以下是简单的例子
- /// <summary>
- /// 读取excel文件
- /// </summary>
- /// <param name="filePath">文件路径</param>
- public void ReadFromExcelFile(string filePath)
- {
- IWorkbook wk = null;
- string extension = System.IO.Path.GetExtension(filePath);
- try
- {
- FileStream fs = File.OpenRead(filePath);
- if (extension.Equals(".xls"))
- {
- //把xls文件中的数据写入wk中
- wk = new HSSFWorkbook(fs);
- }
- else
- {
- //把xlsx文件中的数据写入wk中
- wk = new XSSFWorkbook(fs);
- }
- fs.Close();
- //读取当前表数据
- ISheet sheet = wk.GetSheetAt();
- IRow row = sheet.GetRow(); //读取当前行数据
- //LastRowNum 是当前表的总行数-1(注意)
- string text = string.Empty;
- for (int i = ; i <= sheet.LastRowNum; i++)
- {
- row = sheet.GetRow(i); //读取当前行数据
- if (row != null)
- {
- //LastCellNum 是当前行的总列数
- for (int j = ; j < row.LastCellNum; j++)
- {
- //读取该行的第j列数据
- string value = row.GetCell(j).ToString();
- //Console.Write(value.ToString() + " ");
- text = text + value.ToString() + "\r\n";
- }
- //Console.WriteLine("\n");
- }
- }
- SetText(text);
- }
- catch (Exception e)
- {
- //只在Debug模式下才输出
- //Console.WriteLine(e.Message);
- this.textBox1.Text = e.Message;
- }
- }
Excel中的单元格是有不同数据格式的,例如数字,日期,字符串等,在读取的时候可以根据格式的不同设置对象的不同类型,方便后期的数据处理。
- //获取cell的数据,并设置为对应的数据类型
- public object GetCellValue(ICell cell)
- {
- object value = null;
- try
- {
- if (cell.CellType != CellType.Blank)
- {
- switch (cell.CellType)
- {
- case CellType.Numeric:
- // Date comes here
- if (DateUtil.IsCellDateFormatted(cell))
- {
- value = cell.DateCellValue;
- }
- else
- {
- // Numeric type
- value = cell.NumericCellValue;
- }
- break;
- case CellType.Boolean:
- // Boolean type
- value = cell.BooleanCellValue;
- break;
- case CellType.Formula:
- value = cell.CellFormula;
- break;
- default:
- // String type
- value = cell.StringCellValue;
- break;
- }
- }
- }
- catch (Exception)
- {
- value = "";
- }
- return value;
- }
特别注意的是CellType
中没有Date,而日期类型的数据类型是Numeric
,其实日期的数据在Excel中也是以数字的形式存储。可以使用DateUtil.IsCellDateFormatted
方法来判断是否是日期类型。
有了GetCellValue
方法,写数据到Excel中的时候就要有SetCellValue
方法,缺的类型可以自己补。
- //根据数据类型设置不同类型的cell
- public static void SetCellValue(ICell cell, object obj)
- {
- if (obj.GetType() == typeof(int))
- {
- cell.SetCellValue((int)obj);
- }
- else if (obj.GetType() == typeof(double))
- {
- cell.SetCellValue((double)obj);
- }
- else if (obj.GetType() == typeof(IRichTextString))
- {
- cell.SetCellValue((IRichTextString)obj);
- }
- else if (obj.GetType() == typeof(string))
- {
- cell.SetCellValue(obj.ToString());
- }
- else if (obj.GetType() == typeof(DateTime))
- {
- cell.SetCellValue((DateTime)obj);
- }
- else if (obj.GetType() == typeof(bool))
- {
- cell.SetCellValue((bool)obj);
- }
- else
- {
- cell.SetCellValue(obj.ToString());
- }
- }
cell.SetCellValue()
方法只有四种重载方法,参数分别是string
, bool
, DateTime
, double
, IRichTextString
设置公式使用cell.SetCellFormula(string formula)
写Excel
以下是简单的例子,更多信息可以参见官网提供的Examples。
- public void WriteToExcel(string filePath)
- {
- //创建工作薄
- IWorkbook wb;
- string extension = System.IO.Path.GetExtension(filePath);
- //根据指定的文件格式创建对应的类
- if (extension.Equals(".xls"))
- {
- wb = new HSSFWorkbook();
- }
- else
- {
- wb = new XSSFWorkbook();
- }
- ICellStyle style1 = wb.CreateCellStyle();//样式
- style1.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;//文字水平对齐方式
- style1.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//文字垂直对齐方式
- //设置边框
- style1.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
- style1.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
- style1.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
- style1.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
- style1.WrapText = true;//自动换行
- ICellStyle style2 = wb.CreateCellStyle();//样式
- IFont font1 = wb.CreateFont();//字体
- font1.FontName = "楷体";
- font1.Color = HSSFColor.Red.Index;//字体颜色
- font1.Boldweight = (short)FontBoldWeight.Normal;//字体加粗样式
- style2.SetFont(font1);//样式里的字体设置具体的字体样式
- //设置背景色
- style2.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Yellow.Index;
- style2.FillPattern = FillPattern.SolidForeground;
- style2.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.Yellow.Index;
- style2.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;//文字水平对齐方式
- style2.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//文字垂直对齐方式
- ICellStyle dateStyle = wb.CreateCellStyle();//样式
- dateStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;//文字水平对齐方式
- dateStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//文字垂直对齐方式
- //设置数据显示格式
- IDataFormat dataFormatCustom = wb.CreateDataFormat();
- dateStyle.DataFormat = dataFormatCustom.GetFormat("yyyy-MM-dd HH:mm:ss");
- //创建一个表单
- ISheet sheet = wb.CreateSheet("Sheet0");
- //设置列宽
- int[] columnWidth = { , , , };
- for (int i = ; i < columnWidth.Length; i++)
- {
- //设置列宽度,256*字符数,因为单位是1/256个字符
- sheet.SetColumnWidth(i, * columnWidth[i]);
- }
- //测试数据
- int rowCount = , columnCount = ;
- object[,] data = {
- {"列0", "列1", "列2", "列3"},
- {"", , 5.2, 6.01},
- {"", true, "2014-07-02", DateTime.Now}
- //日期可以直接传字符串,NPOI会自动识别
- //如果是DateTime类型,则要设置CellStyle.DataFormat,否则会显示为数字
- };
- IRow row;
- ICell cell;
- for (int i = ; i < rowCount; i++)
- {
- row = sheet.CreateRow(i);//创建第i行
- for (int j = ; j < columnCount; j++)
- {
- cell = row.CreateCell(j);//创建第j列
- cell.CellStyle = j % == ? style1 : style2;
- //根据数据类型设置不同类型的cell
- object obj = data[i, j];
- SetCellValue(cell, data[i, j]);
- //如果是日期,则设置日期显示的格式
- if (obj.GetType() == typeof(DateTime))
- {
- cell.CellStyle = dateStyle;
- }
- //如果要根据内容自动调整列宽,需要先setCellValue再调用
- //sheet.AutoSizeColumn(j);
- }
- }
- //合并单元格,如果要合并的单元格中都有数据,只会保留左上角的
- //CellRangeAddress(0, 2, 0, 0),合并0-2行,0-0列的单元格
- CellRangeAddress region = new CellRangeAddress(, , , );
- sheet.AddMergedRegion(region);
- try
- {
- FileStream fs = File.OpenWrite(filePath);
- wb.Write(fs);//向打开的这个Excel文件中写入表单并保存。
- fs.Close();
- }
- catch (Exception e)
- {
- Debug.WriteLine(e.Message);
- }
- }
如果想要设置单元格为只读或可写,可以参考这里,方法如下:
- ICellStyle unlocked = wb.CreateCellStyle();
- unlocked.IsLocked = false;//设置该单元格为非锁定
- cell.SetCellValue("未被锁定");
- cell.CellStyle = unlocked;
- ...
- //保护表单,password为解锁密码
- //cell.CellStyle.IsLocked = true;的单元格将为只读
- sheet.ProtectSheet("password");
cell.CellStyle.IsLocked
默认就是true,因此sheet.ProtectSheet("password")
一定要执行,才能实现锁定单元格,对于不想锁定的单元格,就一定要设置cell
的CellStyle
中的IsLocked = false
C# 中 NPOI 库读写 Excel 文件的方法【摘】的更多相关文章
- C# 使用 NPOI 库读写 Excel 文件
NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件.在处理Excel文件上,NPOI 可以同时兼容 xls 和 xlsx.官网提供了一份 Examples,给出 ...
- C# 使用 NPOI 库读写 Excel 文件(转载)
NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件.在处理Excel文件上,NPOI 可以同时兼 容xls 和 xlsx.官网提供了一份Examples,给出了 ...
- NPOI库读写Excel文件
//首先Nuget安装NPOI库using System; using System.Data; using System.IO; using NPOI.HSSF.UserModel; using N ...
- python使用xlrd模块读写Excel文件的方法
本文实例讲述了python使用xlrd模块读写Excel文件的方法.分享给大家供大家参考.具体如下: 一.安装xlrd模块 到python官网下载http://pypi.python.org/pypi ...
- MFC vs2012 Office2013 读写excel文件
近期在忙一个小项目(和同学一起搞的),在这里客户要求不但读写txt,而且可以读写excel文件,这里本以为很简单,结果...废话少说,过程如下: 笔者环境:win7 64+VS2012+Office2 ...
- python 读写 Excel文件
最近用python处理一个小项目,其中涉及到对excel的读写操作,通过查资料及实践做了一下总结,以便以后用. python读写excel文件要用到两个库:xlrd和xlwt,首先下载安装这两个库. ...
- C++读写EXCEL文件OLE,java读写excel文件POI 对比
C++读写EXCEL文件方式比较 有些朋友问代码的问题,将OLE读写的代码分享在这个地方,大家请自己看.http://www.cnblogs.com/destim/p/5476915.html C++ ...
- Python使用openpyxl读写excel文件
Python使用openpyxl读写excel文件 这是一个第三方库,可以处理xlsx格式的Excel文件.pip install openpyxl安装.如果使用Aanconda,应该自带了. 读取E ...
- Python使用读写excel文件
Python使用openpyxl读写excel文件 这是一个第三方库,可以处理xlsx格式的Excel文件.pip install openpyxl安装.如果使用Aanconda,应该自带了. 读取E ...
随机推荐
- .net core 读取本地指定目录下的文件
项目需求 asp.net core 读取log目录下的.log文件,.log文件的内容如下: xxx.log ------------------------------------------beg ...
- MVVM Light 新手入门(2) :ViewModel / Model 中定义“属性” ,并在View中调用
今天学习MVVM架构中“属性”的添加并调用,特记录如下,学习资料均来自于网络,特别感谢翁智华的利刃 MVVMLight系列. 一个窗口的基本模型如下: View(视图) -> ViewModel ...
- Android------------------ListVIew学习
一.ListActivity : 如何你的Activity仅涉及到一个列表(ListVIew),那么你就该考虑使用ListActivity这个类 注意事项:1.ListActivity 里面默认包含 ...
- Sentinel 哨兵 实现redis高可用
本文链接:http://www.cnblogs.com/zhenghongxin/p/8885879.html 我们知道redis是有主从复制的,例如下图: 但如果master主进程挂掉之后,没有sl ...
- Django(图书管理系统1)
day63 内容回顾 1. 单表的增删改查 1. 删和改 1. GET请求 URL传值 1. 格式 ...
- Storm Trident API
在Storm Trident中有五种操作类型 Apply Locally:本地操作,所有操作应用在本地节点数据上,不会产生网络传输 Repartitioning:数据流重定向,单纯的改变数据流向,不会 ...
- [转][SQL]如何实现存储过程中动态加入条件---没想到语句可以这么巧妙
在存储过程过程中,如果要实现Select查询的where子句动态查询,可以用exec ( "select .... where" +@whereStr)这样的方式.但这样的话,感觉 ...
- 怎么在eclipse中访问webservice
在eclipse创建webservice的方法: 1.在Eclipse的菜单栏中,Window --> Preferences --> Web Service --> Axis2 P ...
- Swift 里字符串(八)UnicodeScalarView
即以 Unicode Scarlar 的方式来查看字符串. /// let flag = "
- js的let语句在安卓手机端的QQ浏览器出错的问题
关于JavaScript里面的let,let 语句可以声明一个块级作用域的本地变量,并且可选的将其初始化为一个值. <ul id="list"> </ul> ...