C# 使用 NPOI 处理Excel导入单元格内容是公式问题

引言:今天在处理业务的时候,碰到导入Excel数据不成功的问题,那么就在这里做下笔记吧。
首先,我们有以下的数据。整块业务逻辑的代码在最后会贴上!
1.数值公式示例:
可以看出L3的内容值是80,公式J3*0.2

我们需要使用判断ICell对象的CellType枚举类型,当=CellType.Formula,则代表单元格是公式类型的。则直接用cell.NumericCellValue取值即可。

对于Excel来讲,除了数值的一些公式以外,还会有日期公式,不过最后都是进入到CellType.Formula判断中,需要另外根据转换出来的数值进行转换成日期类型即可。
2.日期公式示例:
G4的内容我使用的是TODAY公式获取当前日期。

同样的,我们需要使用判断ICell对象的CellType枚举类型,当=CellType.Formula,则代表单元格是公式类型的。则直接用cell.NumericCellValue取值,需要根据取出来的数值进行转换成日期类型即可。

数值转换成日期的处理代码:

long isNumberDateTime = 0;
if (Int64.TryParse(cellVal.ToString(), out isNumberDateTime))
{//数值型,则转换成日期DateTime d = DateTime.FromOADate(double.Parse(cellVal.ToString()));
}

转换后的结果:

3.整块业务逻辑的代码:

#region Excel/// <summary>/// Excel文件转换成DataTable/// </summary>/// <param name="filePath">文件路径</param>/// <param name="isUseNewColumnName">是否使用新列名,默认:是</param>/// <param name="deleteEndRowIndex">删除上面的行索引(由于有些Excel导入时上面会存在多余行)</param>/// <returns>返回列名Cols0,Cols1,Cols2···以此类推</returns>public DataTable ExcelToTable(string filePath, bool isUseNewColumnName = true, int deleteEndRowIndex = 0){DataTable dataTable = new DataTable();string a = Path.GetExtension(filePath).ToLower();DataTable result;using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)){IWorkbook workbook;if (a == ".xlsx"){workbook = new XSSFWorkbook(fileStream);}else{if (a == ".xls"){workbook = new HSSFWorkbook(fileStream);}else{workbook = null;throw new Exception("请导入.xlsx或.xls格式的文档");}}if (workbook == null){result = null;return result;}ISheet sheetAt = workbook.GetSheetAt(0);if (deleteEndRowIndex != 0){for (int i = deleteEndRowIndex; i >= 1; i--){sheetAt.ShiftRows(i, i + 1, -1);}}IRow row = sheetAt.GetRow(sheetAt.FirstRowNum);List<int> list = new List<int>();for (int i = 0; i < (int)row.LastCellNum; i++){if (isUseNewColumnName){dataTable.Columns.Add(new DataColumn("Cols" + i.ToString()));}else{object valueType = this.GetValueType(row.GetCell(i));if (valueType == null || valueType.ToString() == string.Empty){dataTable.Columns.Add(new DataColumn("Cols" + i.ToString()));}else{dataTable.Columns.Add(new DataColumn(valueType.ToString()));}}list.Add(i);}for (int j = sheetAt.FirstRowNum + 1; j <= sheetAt.LastRowNum; j++){DataRow dataRow = dataTable.NewRow();bool bCellIsNull = false;foreach (int current in list){if (sheetAt.GetRow(j) == null)break;ICell cell = sheetAt.GetRow(j).GetCell(current);dataRow[current] = this.GetValueType(cell);if (dataRow[current] != null && dataRow[current].ToString() != string.Empty){bCellIsNull = true;}}if (bCellIsNull){dataTable.Rows.Add(dataRow);}}}result = dataTable;return result;}/// <summary>/// 获取单元格类型/// </summary>/// <param name="cell"></param>/// <returns></returns>private object GetValueType(ICell cell){bool flag = cell == null;object result;if (flag){result = null;}else{switch (cell.CellType){case CellType.Numeric:                  //数值result = cell.NumericCellValue;return result;case CellType.String:                   //文本result = cell.StringCellValue;return result;case CellType.Blank:                    //空值result = null;return result;case CellType.Boolean:                  //布尔类型result = cell.BooleanCellValue;return result;case CellType.Error:                    //二进制result = cell.ErrorCellValue;return result;case CellType.Formula:                  //公式//这里只能处理数值公式。其他公式将会被转换成数值类型,如:日期公式。result = cell.NumericCellValue;return result;}result = "=" + cell.CellFormula;}return result;}#endregion

感谢支持,有写得不好的地方还望多多指教。

C# 使用 NPOI 处理Excel导入单元格内容是公式问题相关推荐

  1. python查找excel中内容_python excel表格数据-python 如何读取 excel 指定单元格内容

    python 怎么从excel中读取数据 VLOOKUP是函数,给定一个查找的目标,它就能从指定的查找中查找返回想找到的值.它的基本语法为: VLOOKUP(查找目标,查找范围,返回值的列数,精确OR ...

  2. excel 根据单元格内容自动调整列宽

    excel 根据单元格内容自动调整列宽 CreateTime--2018年5月28日08:49:40 Author:Marydon 1.情景展示 单元格宽度超过了列宽 2.解决方案 第一步:同时选中A ...

  3. NPOI之Excel——合并单元格、设置样式、输入公式

    首先建立一个空白的工作簿用作测试,并在其中建立空白工作表,在表中建立空白行,在行中建立单元格,并填入内容: //建立空白工作簿 IWorkbook workbook = new HSSFWorkboo ...

  4. java 解析excel获取单元格内容封装方法(兼容2003和2007)

    支持xls2003及xlsx2007导入excel //导入excel接口 @RequestMapping(params = "importDecMainCode", method ...

  5. Excel根据单元格内容分类并插入空行的方法

    存在问题: Excel中想通过单元格内容进行分类,并插入空行. 解决方案: 1)复制一列,并且上下错位一行 2)选中图示区域,按ctrl+G,并点定位条件,选"行内容差异单元格" ...

  6. excel根据单元格内容设定行列颜色

    1. 根据单元格内容设定单元格颜色 [开始]-[条件格式]-[突出显示单元格规则]-[选择规则]-[设置样式] 2. 根据单元格内容设定所在行/列内容 [开始]-[条件格式]-[新建规则]-[是用公式 ...

  7. Java使用poi读取Excel文件单元格内容进行处理

    使用poi读取单元格内容,如果是整数读取之后 后端获取却是小数所以需要处理一下 public static String getStringValue(XSSFCell cell) {NumberFo ...

  8. 【Excel】单元格内容显示完整

    将单元格内容显示完整 自动换行 ctrl+A ,选中整个表格,工具栏-单元格-格式-自动调整行高.列宽

  9. NPOI之Excel——设置单元格背景色

    NPOI Excel 单元格颜色对照表,在引用了 NPOI.dll 后可通过 ICellStyle 接口的 FillForegroundColor 属性实现 Excel 单元格的背景色设置,FillP ...

最新文章

  1. 设计模式:单例模式之枚举
  2. [LeetCode] Linked List Cycle
  3. lunbuntu install maven
  4. exchange和域得命名
  5. Wireshark网卡抓包工具简明教程
  6. AttributeMap类详解
  7. sql语句优化(二)
  8. Linux搜索无线网络命令,Linux操作系统的无线网络命令
  9. Entity Framework context per request
  10. PHP文件中定义加载资源文件
  11. 区块链 State Machine Replication (SMR)是什么
  12. 在线UML绘图完全免费!
  13. function函数
  14. 5分钟看懂XCP协议
  15. Error starting Tomcat context. Exception
  16. 现在可用:Yggdrasil图标包
  17. STM32 编码器驱动/旋转编码器旋钮encoder
  18. 【华为交换机配置命令大全】
  19. 【总结】java.lang.StackOverflowError错误原因及解决办法
  20. 带式输送机、采样控制系统、变速器、离心成型机、齿轮减速器、三级减速器、蜗轮减速机、多向混合机、颗粒包装机、机床夹具、球阀、支撑掩护式液压支架、轮式移动机器人、液压传动、轴向柱塞泵…毕业设计 课程设计

热门文章

  1. 【转载】跟我一起写 Makefile(一)
  2. 【项目笔记_答题器】rp552d usb hid 在seewo win10 设备上启动无法识别
  3. html:(9):blockquote引用和br换行
  4. cuteftp向服务器传输文件没有权限
  5. flash actionscript MovieClip(电影剪辑)控制
  6. 双连通分量的题目列表(一)
  7. 光电池和光电二极管的区别
  8. opencv下载过慢的问题
  9. 为什么我的程序中没有stdafx.h头文件?
  10. 有什么办法可以预防网页被劫持