C# 使用 NPOI 处理Excel导入单元格内容是公式问题
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导入单元格内容是公式问题相关推荐
- python查找excel中内容_python excel表格数据-python 如何读取 excel 指定单元格内容
python 怎么从excel中读取数据 VLOOKUP是函数,给定一个查找的目标,它就能从指定的查找中查找返回想找到的值.它的基本语法为: VLOOKUP(查找目标,查找范围,返回值的列数,精确OR ...
- excel 根据单元格内容自动调整列宽
excel 根据单元格内容自动调整列宽 CreateTime--2018年5月28日08:49:40 Author:Marydon 1.情景展示 单元格宽度超过了列宽 2.解决方案 第一步:同时选中A ...
- NPOI之Excel——合并单元格、设置样式、输入公式
首先建立一个空白的工作簿用作测试,并在其中建立空白工作表,在表中建立空白行,在行中建立单元格,并填入内容: //建立空白工作簿 IWorkbook workbook = new HSSFWorkboo ...
- java 解析excel获取单元格内容封装方法(兼容2003和2007)
支持xls2003及xlsx2007导入excel //导入excel接口 @RequestMapping(params = "importDecMainCode", method ...
- Excel根据单元格内容分类并插入空行的方法
存在问题: Excel中想通过单元格内容进行分类,并插入空行. 解决方案: 1)复制一列,并且上下错位一行 2)选中图示区域,按ctrl+G,并点定位条件,选"行内容差异单元格" ...
- excel根据单元格内容设定行列颜色
1. 根据单元格内容设定单元格颜色 [开始]-[条件格式]-[突出显示单元格规则]-[选择规则]-[设置样式] 2. 根据单元格内容设定所在行/列内容 [开始]-[条件格式]-[新建规则]-[是用公式 ...
- Java使用poi读取Excel文件单元格内容进行处理
使用poi读取单元格内容,如果是整数读取之后 后端获取却是小数所以需要处理一下 public static String getStringValue(XSSFCell cell) {NumberFo ...
- 【Excel】单元格内容显示完整
将单元格内容显示完整 自动换行 ctrl+A ,选中整个表格,工具栏-单元格-格式-自动调整行高.列宽
- NPOI之Excel——设置单元格背景色
NPOI Excel 单元格颜色对照表,在引用了 NPOI.dll 后可通过 ICellStyle 接口的 FillForegroundColor 属性实现 Excel 单元格的背景色设置,FillP ...
最新文章
- 设计模式:单例模式之枚举
- [LeetCode] Linked List Cycle
- lunbuntu install maven
- exchange和域得命名
- Wireshark网卡抓包工具简明教程
- AttributeMap类详解
- sql语句优化(二)
- Linux搜索无线网络命令,Linux操作系统的无线网络命令
- Entity Framework context per request
- PHP文件中定义加载资源文件
- 区块链 State Machine Replication (SMR)是什么
- 在线UML绘图完全免费!
- function函数
- 5分钟看懂XCP协议
- Error starting Tomcat context. Exception
- 现在可用:Yggdrasil图标包
- STM32 编码器驱动/旋转编码器旋钮encoder
- 【华为交换机配置命令大全】
- 【总结】java.lang.StackOverflowError错误原因及解决办法
- 带式输送机、采样控制系统、变速器、离心成型机、齿轮减速器、三级减速器、蜗轮减速机、多向混合机、颗粒包装机、机床夹具、球阀、支撑掩护式液压支架、轮式移动机器人、液压传动、轴向柱塞泵…毕业设计 课程设计