NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件。

在处理Excel文件上,NPOI 可以同时兼容 xls 和 xlsx。官网提供了一份 Examples

给出了很多应用场景的例子,打包好的二进制文件类库,也仅有几MB,使用非常方便。

  读Excel

NPOI 使用 HSSFWorkbook 类来处理 xls,XSSFWorkbook 类来处理 xlsx,它们都继承接口 IWorkbook,因此可以通过 IWorkbook 来统一处理 xls 和 xlsx 格式的文件

  1. public void ReadFromExcelFile(string filePath)
  2. {
  3. IWorkbook wk = null;
  4. string extension = System.IO.Path.GetExtension(filePath);
  5. try
  6. {
  7. FileStream fs = File.OpenRead(filePath);
  8. if (extension.Equals(".xls"))
  9. {
  10. //把xls文件中的数据写入wk中
  11. wk = new HSSFWorkbook(fs);
  12. }
  13. else
  14. {
  15. //把xlsx文件中的数据写入wk中
  16. wk = new XSSFWorkbook(fs);
  17. }
  18.  
  19. fs.Close();
  20. //读取当前表数据
  21. ISheet sheet = wk.GetSheetAt();
  22.  
  23. IRow row = sheet.GetRow(); //读取当前行数据
  24. //LastRowNum 是当前表的总行数-1(注意)
  25. int offset = ;
  26. for (int i = ; i <= sheet.LastRowNum; i++)
  27. {
  28. row = sheet.GetRow(i); //读取当前行数据
  29. if (row != null)
  30. {
  31. //LastCellNum 是当前行的总列数
  32. for (int j = ; j < row.LastCellNum; j++)
  33. {
  34. //读取该行的第j列数据
  35. string value = row.GetCell(j).ToString();
  36. Console.Write(value.ToString() + " ");
  37. }
  38. Console.WriteLine("\n");
  39. }
  40. }
  41. }
  42.  
  43. catch (Exception e)
  44. {
  45. //只在Debug模式下才输出
  46. Console.WriteLine(e.Message);
  47. }
  48. }

Excel中的单元格是有不同数据格式的,例如数字,日期,字符串等,在读取的时候可以根据格式的不同设置对象的不同类型,方便后期的数据处理。

  1. //获取cell的数据,并设置为对应的数据类型
  2. public object GetCellValue(ICell cell)
  3. {
  4. object value = null;
  5. try
  6. {
  7. if (cell.CellType != CellType.Blank)
  8. {
  9. switch (cell.CellType)
  10. {
  11. case CellType.Numeric:
  12. // Date comes here
  13. if (DateUtil.IsCellDateFormatted(cell))
  14. {
  15. value = cell.DateCellValue;
  16. }
  17. else
  18. {
  19. // Numeric type
  20. value = cell.NumericCellValue;
  21. }
  22. break;
  23. case CellType.Boolean:
  24. // Boolean type
  25. value = cell.BooleanCellValue;
  26. break;
  27. case CellType.Formula:
  28. value = cell.CellFormula;
  29. break;
  30. default:
  31. // String type
  32. value = cell.StringCellValue;
  33. break;
  34. }
  35. }
  36. }
  37. catch (Exception)
  38. {
  39. value = "";
  40. }
  41.  
  42. return value;
  43. }

特别注意的是CellType中没有Date,而日期类型的数据类型是Numeric,其实日期的数据在Excel中也是以数字的形式存储。可以使用DateUtil.IsCellDateFormatted方法来判断是否是日期类型。

有了GetCellValue方法,写数据到Excel中的时候就要有SetCellValue方法,缺的类型可以自己补。

  1. //根据数据类型设置不同类型的cell
  2. public static void SetCellValue(ICell cell, object obj)
  3. {
  4. if (obj.GetType() == typeof(int))
  5. {
  6. cell.SetCellValue((int)obj);
  7. }
  8. else if (obj.GetType() == typeof(double))
  9. {
  10. cell.SetCellValue((double)obj);
  11. }
  12. else if (obj.GetType() == typeof(IRichTextString))
  13. {
  14. cell.SetCellValue((IRichTextString)obj);
  15. }
  16. else if (obj.GetType() == typeof(string))
  17. {
  18. cell.SetCellValue(obj.ToString());
  19. }
  20. else if (obj.GetType() == typeof(DateTime))
  21. {
  22. cell.SetCellValue((DateTime)obj);
  23. }
  24. else if (obj.GetType() == typeof(bool))
  25. {
  26. cell.SetCellValue((bool)obj);
  27. }
  28. else
  29. {
  30. cell.SetCellValue(obj.ToString());
  31. }
  32. }

cell.SetCellValue()方法只有四种重载方法,参数分别是stringboolDateTimedoubleIRichTextString
设置公式使用cell.SetCellFormula(string formula)

写Excel

以下是简单的例子,更多信息可以参见官网提供的Examples

  1. public void WriteToExcel(string filePath)
  2. {
  3. //创建工作薄
  4. IWorkbook wb;
  5. string extension = System.IO.Path.GetExtension(filePath);
  6. //根据指定的文件格式创建对应的类
  7. if (extension.Equals(".xls"))
  8. {
  9. wb = new HSSFWorkbook();
  10. }
  11. else
  12. {
  13. wb = new XSSFWorkbook();
  14. }
  15.  
  16. ICellStyle style1 = wb.CreateCellStyle();//样式
  17. style1.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;//文字水平对齐方式
  18. style1.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//文字垂直对齐方式
  19. //设置边框
  20. style1.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
  21. style1.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
  22. style1.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
  23. style1.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
  24. style1.WrapText = true;//自动换行
  25.  
  26. ICellStyle style2 = wb.CreateCellStyle();//样式
  27. IFont font1 = wb.CreateFont();//字体
  28. font1.FontName = "楷体";
  29. font1.Color = HSSFColor.Red.Index;//字体颜色
  30. font1.Boldweight = (short)FontBoldWeight.Normal;//字体加粗样式
  31. style2.SetFont(font1);//样式里的字体设置具体的字体样式
  32. //设置背景色
  33. style2.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Yellow.Index;
  34. style2.FillPattern = FillPattern.SolidForeground;
  35. style2.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.Yellow.Index;
  36. style2.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;//文字水平对齐方式
  37. style2.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//文字垂直对齐方式
  38.  
  39. ICellStyle dateStyle = wb.CreateCellStyle();//样式
  40. dateStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;//文字水平对齐方式
  41. dateStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//文字垂直对齐方式
  42. //设置数据显示格式
  43. IDataFormat dataFormatCustom = wb.CreateDataFormat();
  44. dateStyle.DataFormat = dataFormatCustom.GetFormat("yyyy-MM-dd HH:mm:ss");
  45.  
  46. //创建一个表单
  47. ISheet sheet = wb.CreateSheet("Sheet0");
  48. //设置列宽
  49. int[] columnWidth = { , , , };
  50. for (int i = ; i < columnWidth.Length; i++)
  51. {
  52. //设置列宽度,256*字符数,因为单位是1/256个字符
  53. sheet.SetColumnWidth(i, * columnWidth[i]);
  54. }
  55.  
  56. //测试数据
  57. int rowCount = , columnCount = ;
  58. object[,] data = {
  59. {"列0", "列1", "列2", "列3"},
  60. {"", , 5.2, 6.01},
  61. {"", true, "2014-07-02", DateTime.Now}
  62. //日期可以直接传字符串,NPOI会自动识别
  63. //如果是DateTime类型,则要设置CellStyle.DataFormat,否则会显示为数字
  64. };
  65.  
  66. IRow row;
  67. ICell cell;
  68.  
  69. for (int i = ; i < rowCount; i++)
  70. {
  71. row = sheet.CreateRow(i);//创建第i行
  72. for (int j = ; j < columnCount; j++)
  73. {
  74. cell = row.CreateCell(j);//创建第j列
  75. cell.CellStyle = j % == ? style1 : style2;
  76. //根据数据类型设置不同类型的cell
  77. object obj = data[i, j];
  78. SetCellValue(cell, data[i, j]);
  79. //如果是日期,则设置日期显示的格式
  80. if (obj.GetType() == typeof(DateTime))
  81. {
  82. cell.CellStyle = dateStyle;
  83. }
  84. //如果要根据内容自动调整列宽,需要先setCellValue再调用
  85. //sheet.AutoSizeColumn(j);
  86. }
  87. }
  88.  
  89. //合并单元格,如果要合并的单元格中都有数据,只会保留左上角的
  90. //CellRangeAddress(0, 2, 0, 0),合并0-2行,0-0列的单元格
  91. CellRangeAddress region = new CellRangeAddress(, , , );
  92. sheet.AddMergedRegion(region);
  93.  
  94. try
  95. {
  96. FileStream fs = File.OpenWrite(filePath);
  97. wb.Write(fs);//向打开的这个Excel文件中写入表单并保存。
  98. fs.Close();
  99. }
  100. catch (Exception e)
  101. {
  102. Debug.WriteLine(e.Message);
  103. }
  104. }

如果想要设置单元格为只读或可写,可以参考,方法如下:

  1. ICellStyle unlocked = wb.CreateCellStyle();
  2. unlocked.IsLocked = false;//设置该单元格为非锁定
  3. cell.SetCellValue("未被锁定");
  4. cell.CellStyle = unlocked;
  5. ...
  6. //保护表单,password为解锁密码
  7. //cell.CellStyle.IsLocked = true;的单元格将为只读
  8. sheet.ProtectSheet("password");

cell.CellStyle.IsLocked 默认就是true,

因此sheet.ProtectSheet("password")一定要执行,

才能实现锁定单元格,对于不想锁定的单元格,

就一定要设置cellCellStyle中的IsLocked = false

NPOI读写的更多相关文章

  1. NPOI读写Excel

    1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.NPOI是POI的C#版本,NPOI的行和列的index都是从0开始 ...

  2. 【转】NPOI读写Excel

    1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.NPOI是POI的C#版本,NPOI的行和列的index都是从0开始 ...

  3. NPOI读写Excel【转载】

    参考示例:https://www.cnblogs.com/luxiaoxun/p/3374992.html 感谢! 1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表): ...

  4. 使用NPOI读写Excel、Word

    NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 ...

  5. C#使用NPOI读写excel

    本帖内容来自网络+自己稍作整理,已找不到原贴,侵删 个人比较习惯用NPOI操作excel,方便易理解.在宇宙第一IDE(笑)——VS2017中插入NPOI就很方便: 首先安装NPOI: 然后在.cs文 ...

  6. NPOI读写Excel组件封装Excel导入导出组件

    后台管理系统多数情况会与Excel打交道,常见的就是Excel的导入导出,对于Excel的操作往往是繁琐且容易出错的,对于后台系统的导入导出交互过程往往是固定的,对于这部分操作,我们可以抽离出公共组件 ...

  7. NPOI 读写Excel

    实例功能概述: 1.支持Excel2003以及2007 2.支持Excel读取到DataTable(TableToExcel) 3.支持DataTable导出到Excel(TableToExcel) ...

  8. Unity3d 使用NPOI读写Excel 遇到的问题

    开发环境:unity5.3  NPOI(.net 2.0版  http://npoi.codeplex.com/) 运行环境:PC版, 其他平台没有测试 先上效果图: 实现步骤: 1.新建一个Exce ...

  9. NPOI读写Excel0307

    #region NPOI 操作 Excel 2007 /// <summary> /// 将Excel文件中的数据读出到DataTable中(xlsx) /// </summary& ...

随机推荐

  1. Modbus协议 CRC 校验码

    CRC(循环冗余校验)在线计算 http://www.ip33.com/crc.html 里面的8005的多项式值,但网上看到的算法都是用A001来异或的 ---------------------- ...

  2. 阿里云部署SSL证书

    查找中间证书 为了确保兼容到所有浏览器,我们必须在阿里云上部署中间证书,如果不部署证书,虽然安装过程可以完全也不会报错,但可能导致Android系统,Chrome 和 Firefox等浏览器无法识别. ...

  3. 4-7 3D绘图

    In [1]: import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D % ...

  4. Python语言基础01-初识Python

    本文收录在Python从入门到精通系列文章系列 1. Python简介 1.1 Python的历史 Python的创始人为吉多·范罗苏姆(荷兰语:Guido van Rossum) 1989年的圣诞节 ...

  5. linux (06) redis安装

    redis安装 一.在linux安装redis,通过源码编译安装redis 1.下载源码包 wget http://download.redis.io/releases/redis-4.0.10.ta ...

  6. 201871010101-陈来弟《面向对象程序设计(Java)》第八周学习总结

    实验七 接口的定义与使用 第一部分:理论知识 一.接口.lambda和内部类:  Comparator与comparable接口: 1.comparable接口的方法是compareTo,只有一个参数 ...

  7. 201871010134-周英杰《面向对象程序设计(java)》第十三周学习总结

    201871010134-周英杰<面向对象程序设计(java)>第十三周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  8. 201871010111-刘佳华《面向对象程序设计(java)》第四周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第四周学习总结 实验时间 2019-9-20 第一部分:总结第四章理论知识 4.1:类与对象的概念. 类:类是构造对象的模板 ...

  9. Linux SSH建立连接过程分析

    https://blog.csdn.net/qwertyupoiuytr/article/details/71213463 SSH建立连接的过程主要分为下面几个阶段: SSH协议版本协商阶段.SSH目 ...

  10. EventBus事件总线(牛x版)

    事件总线: public interface IEventBus { void Trigger<TEvent>(TEvent eventData, string topic = null) ...