C# 开源组件--NPOI读取Excel单元格中的公式值
今天在项目中碰到了EXCEL导入的数据是用公式生成,直接导入不了数据,写在博客中方便自已查询也可以给想找这方面的参考一下:
用NPOI导入时,在OFFICE 2007中的文件导入时一般会用XSSF,所以得到的类型会是CellType.FORMULA
1 /// <summary>读取excel
2 /// 默认第一行为表头
3 /// </summary>
4 /// <param name="strFileName">excel文档绝对路径</param>
5 /// <param name="rowIndex">内容行偏移量,第一行为表头,内容行从第二行开始则为1</param>
6 /// <returns></returns>
7 public static DataTable Import(string strFileName, int rowIndex)
8 {
9 DataTable dt = new DataTable();
10
11 IWorkbook hssfworkbook;
12 using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
13 {
14 hssfworkbook = WorkbookFactory.Create(file);
15 }
16 ISheet sheet = hssfworkbook.GetSheetAt(0);
17
18 IRow headRow = sheet.GetRow(0);
19 if (headRow != null)
20 {
21 int colCount = headRow.LastCellNum;
22 for (int i = 0; i < colCount; i++)
23 {
24 dt.Columns.Add("COL_" + i);
25 }
26 }
27
28 for (int i = (sheet.FirstRowNum + rowIndex); i <= sheet.LastRowNum; i++)
29 {
30 IRow row = sheet.GetRow(i);
31 bool emptyRow = true;
32 object[] itemArray = null;
33
34 if (row != null)
35 {
36 itemArray = new object[row.LastCellNum];
37
38 for (int j = row.FirstCellNum; j < row.LastCellNum; j++)
39 {
40
41 if (row.GetCell(j) != null)
42 {
43
44 switch (row.GetCell(j).CellType)
45 {
46 case CellType.NUMERIC:
47 if (HSSFDateUtil.IsCellDateFormatted(row.GetCell(j)))//日期类型
48 {
49 itemArray[j] = row.GetCell(j).DateCellValue.ToString("yyyy-MM-dd");
50 }
51 else//其他数字类型
52 {
53 itemArray[j] = row.GetCell(j).NumericCellValue;
54 }
55 break;
56 case CellType.BLANK:
57 itemArray[j] = string.Empty;
58 break;
59 case CellType.FORMULA: //此处是处理公式数据,获取公式执行后的值
60 if (Path.GetExtension(strFileName).ToLower().Trim() == ".xlsx")
61 {
62 XSSFFormulaEvaluator eva = new XSSFFormulaEvaluator(hssfworkbook);
63 if (eva.Evaluate(row.GetCell(j)).CellType == CellType.NUMERIC)
64 {
65 itemArray[j] = eva.Evaluate(row.GetCell(j)).NumberValue;
66 }
67 else
68 {
69 itemArray[j] = eva.Evaluate(row.GetCell(j)).StringValue;
70 }
71 }
72 else
73 {
74 HSSFFormulaEvaluator eva = new HSSFFormulaEvaluator(hssfworkbook);
75 if (eva.Evaluate(row.GetCell(j)).CellType == CellType.NUMERIC)
76 {
77 itemArray[j] = eva.Evaluate(row.GetCell(j)).NumberValue;
78 }
79 else
80 {
81 itemArray[j] = eva.Evaluate(row.GetCell(j)).StringValue;
82 }
83 }
84 break;
85 default:
86 itemArray[j] = row.GetCell(j).StringCellValue;
87 break;
88
89 }
90
91 if (itemArray[j] != null && !string.IsNullOrEmpty(itemArray[j].ToString().Trim()))
92 {
93 emptyRow = false;
94 }
95 }
96 }
97 }
98
99 //非空数据行数据添加到DataTable
100 if (!emptyRow)
101 {
102 dt.Rows.Add(itemArray);
103 }
104 }
105 return dt;
106 }
C# 开源组件--NPOI读取Excel单元格中的公式值的更多相关文章
- 通过VBA,当在EXCEL单元格中输入任意的日期格式时,都能自动转换为指定的标准格式的日期值
在日常录入EXCEL表格的单元格里 ,我们输入一些一般性的日期内容,如:2017-10-17 或 2017/10/17时,EXCEL会自动识别为日期并按单元格设计格式显示,单元格中存储的值也是日期格式 ...
- 如何在excel单元格中插入图片批注
在excel单元格中插入图片批注的方法: 1.选定要插入图片的单元格,然后右键选择插入批注. 2.然后会插入一个批注框,为了不影响图片效果,可以将批注文字都删除.然后鼠标移动到批注框边角再右键. 3. ...
- C# ASP.NET 读取EXCEL 单元格 读取 空值 不显示
跟大家分享一下,[摘自]:http://blog.csdn.net/li185416672/article/details/8213729 读取excel时,某些单元格为空值 原来如此: 当我们用ol ...
- excel单元格中批量加入固定字符
excel单元格前怎么批量加字母 现在我要在联系人这列,每个姓名前加入衡阳的首字母简写(HY). 3 在同行上面随便找列,我找D列.输入公式:="HY"&A2. 5 输入后 ...
- POI如何自动调整Excel单元格中字体的大小
问题 目的是要将Excel中的文字全部显示出来,可以设置对齐格式为[缩小字体填充],但是这样的话只能展示出一行数据,字体会变得很小.还有一种办法,设置对齐格式为[自动换行],然后让单元格中的字体自动调 ...
- Java 在Excel单元格中应用一种/多种字体样式
在Excel表格中,设置单元格字体样式时,可以对单元格内的所有字符应用同一样式,即获取指定单元,应用样式即可:另外也可以对单元格内的不同字符内容应用不同字体样式,即获取单元格中的字符位置,应用样式:本 ...
- C#/VB.NET 在Excel单元格中应用多种字体格式
在Excel中,可对单元格中的字符串设置多种不同样式,通常只需要获取到单元格直接设置样式即可,该方法设置的样式会应用于该单元格中的所有字符.如果需要对单元格中某些字符设置样式,则可以参考本文中的方法. ...
- 通过第三方组件NPOI读取Excel的方法
public class ExcelHelper { public class x2003 { #region Excel2003 /// <summary> /// 将Excel文件中的 ...
- NPOI设置Excel单元格字体、边框、对齐、背景色
代码: ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; ce ...
随机推荐
- asp.net core 的 razor pages 如何使用ajax调用后台方法
Razor 是一种允许您向网页中嵌入基于服务器的代码(Visual Basic 和 C#)的标记语法. 当网页被写入浏览器时,基于服务器的代码能够创建动态内容. 在网页加载时,服务器在向浏览器返回页面 ...
- No grammar constraints (DTD or XML Schema) referenced in the document.
问题描述 web.xml 使用 Servlet4.0 版本,No grammar constraints (DTD or XML Schema) referenced in the document. ...
- SQL语句原理解析(原创)
基本的sql语句很好理解这里不做分析,这里只考虑复杂的sql语法和关键词用法的实验分析: 一,join关联的作用: 作用: 1,为了生成信息信息更加全面的中间表:2,为了where可以使用含有单表外字 ...
- TopN案例
准备三份数据 t1 2067 t2 2055 t3 2055 t4 1200 t5 2367 t6 255 t7 2555 t8 12100 t9 20647 t10 245 t11 205 t12 ...
- Python判断输入字符类型
"""从键盘上输入 一个字符,判断其字符类型.""" while True: char = input("请输入需要判断的字符:& ...
- James Munkres Topology: Theorem 20.3 and metric equivalence
Proof of Theorem 20.3 Theorem 20.3 The topologies on \(\mathbb{R}^n\) induced by the euclidean metri ...
- 台达PLC modbus 不支持04功能码
如果有04功能码的通讯,需要使用RS指令
- STL 贺习笔记
贺文链接www.cnblogs.com/zhouzhendong/p/STL.html C++ STL 的一些基础用法 前言 创建一个空的 vector ,我一直是这样写的: vector < ...
- 浅谈Java反射
什么是反射? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语 ...
- 【数据结构】KMP算法
我还是不太懂... 转2篇大神的解释 1>https://www.cnblogs.com/yjiyjige/p/3263858.html 2>https://blog.csd ...