NPOI读写
NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件。
在处理Excel文件上,NPOI 可以同时兼容 xls 和 xlsx。官网提供了一份 Examples,
给出了很多应用场景的例子,打包好的二进制文件类库,也仅有几MB,使用非常方便。
读Excel
NPOI 使用 HSSFWorkbook
类来处理 xls,XSSFWorkbook
类来处理 xlsx,它们都继承接口 IWorkbook
,因此可以通过 IWorkbook
来统一处理 xls 和 xlsx 格式的文件
- 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(注意)
- int offset = ;
- 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() + " ");
- }
- Console.WriteLine("\n");
- }
- }
- }
- catch (Exception e)
- {
- //只在Debug模式下才输出
- Console.WriteLine(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
NPOI读写的更多相关文章
- NPOI读写Excel
1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.NPOI是POI的C#版本,NPOI的行和列的index都是从0开始 ...
- 【转】NPOI读写Excel
1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.NPOI是POI的C#版本,NPOI的行和列的index都是从0开始 ...
- NPOI读写Excel【转载】
参考示例:https://www.cnblogs.com/luxiaoxun/p/3374992.html 感谢! 1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表): ...
- 使用NPOI读写Excel、Word
NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 ...
- C#使用NPOI读写excel
本帖内容来自网络+自己稍作整理,已找不到原贴,侵删 个人比较习惯用NPOI操作excel,方便易理解.在宇宙第一IDE(笑)——VS2017中插入NPOI就很方便: 首先安装NPOI: 然后在.cs文 ...
- NPOI读写Excel组件封装Excel导入导出组件
后台管理系统多数情况会与Excel打交道,常见的就是Excel的导入导出,对于Excel的操作往往是繁琐且容易出错的,对于后台系统的导入导出交互过程往往是固定的,对于这部分操作,我们可以抽离出公共组件 ...
- NPOI 读写Excel
实例功能概述: 1.支持Excel2003以及2007 2.支持Excel读取到DataTable(TableToExcel) 3.支持DataTable导出到Excel(TableToExcel) ...
- Unity3d 使用NPOI读写Excel 遇到的问题
开发环境:unity5.3 NPOI(.net 2.0版 http://npoi.codeplex.com/) 运行环境:PC版, 其他平台没有测试 先上效果图: 实现步骤: 1.新建一个Exce ...
- NPOI读写Excel0307
#region NPOI 操作 Excel 2007 /// <summary> /// 将Excel文件中的数据读出到DataTable中(xlsx) /// </summary& ...
随机推荐
- Modbus协议 CRC 校验码
CRC(循环冗余校验)在线计算 http://www.ip33.com/crc.html 里面的8005的多项式值,但网上看到的算法都是用A001来异或的 ---------------------- ...
- 阿里云部署SSL证书
查找中间证书 为了确保兼容到所有浏览器,我们必须在阿里云上部署中间证书,如果不部署证书,虽然安装过程可以完全也不会报错,但可能导致Android系统,Chrome 和 Firefox等浏览器无法识别. ...
- 4-7 3D绘图
In [1]: import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D % ...
- Python语言基础01-初识Python
本文收录在Python从入门到精通系列文章系列 1. Python简介 1.1 Python的历史 Python的创始人为吉多·范罗苏姆(荷兰语:Guido van Rossum) 1989年的圣诞节 ...
- linux (06) redis安装
redis安装 一.在linux安装redis,通过源码编译安装redis 1.下载源码包 wget http://download.redis.io/releases/redis-4.0.10.ta ...
- 201871010101-陈来弟《面向对象程序设计(Java)》第八周学习总结
实验七 接口的定义与使用 第一部分:理论知识 一.接口.lambda和内部类: Comparator与comparable接口: 1.comparable接口的方法是compareTo,只有一个参数 ...
- 201871010134-周英杰《面向对象程序设计(java)》第十三周学习总结
201871010134-周英杰<面向对象程序设计(java)>第十三周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- 201871010111-刘佳华《面向对象程序设计(java)》第四周学习总结
201871010111-刘佳华<面向对象程序设计(java)>第四周学习总结 实验时间 2019-9-20 第一部分:总结第四章理论知识 4.1:类与对象的概念. 类:类是构造对象的模板 ...
- Linux SSH建立连接过程分析
https://blog.csdn.net/qwertyupoiuytr/article/details/71213463 SSH建立连接的过程主要分为下面几个阶段: SSH协议版本协商阶段.SSH目 ...
- EventBus事件总线(牛x版)
事件总线: public interface IEventBus { void Trigger<TEvent>(TEvent eventData, string topic = null) ...