今天在项目中碰到了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单元格中的公式值的更多相关文章

  1. 通过VBA,当在EXCEL单元格中输入任意的日期格式时,都能自动转换为指定的标准格式的日期值

    在日常录入EXCEL表格的单元格里 ,我们输入一些一般性的日期内容,如:2017-10-17 或 2017/10/17时,EXCEL会自动识别为日期并按单元格设计格式显示,单元格中存储的值也是日期格式 ...

  2. 如何在excel单元格中插入图片批注

    在excel单元格中插入图片批注的方法: 1.选定要插入图片的单元格,然后右键选择插入批注. 2.然后会插入一个批注框,为了不影响图片效果,可以将批注文字都删除.然后鼠标移动到批注框边角再右键. 3. ...

  3. C# ASP.NET 读取EXCEL 单元格 读取 空值 不显示

    跟大家分享一下,[摘自]:http://blog.csdn.net/li185416672/article/details/8213729 读取excel时,某些单元格为空值 原来如此: 当我们用ol ...

  4. excel单元格中批量加入固定字符

    excel单元格前怎么批量加字母 现在我要在联系人这列,每个姓名前加入衡阳的首字母简写(HY). 3 在同行上面随便找列,我找D列.输入公式:="HY"&A2. 5 输入后 ...

  5. POI如何自动调整Excel单元格中字体的大小

    问题 目的是要将Excel中的文字全部显示出来,可以设置对齐格式为[缩小字体填充],但是这样的话只能展示出一行数据,字体会变得很小.还有一种办法,设置对齐格式为[自动换行],然后让单元格中的字体自动调 ...

  6. Java 在Excel单元格中应用一种/多种字体样式

    在Excel表格中,设置单元格字体样式时,可以对单元格内的所有字符应用同一样式,即获取指定单元,应用样式即可:另外也可以对单元格内的不同字符内容应用不同字体样式,即获取单元格中的字符位置,应用样式:本 ...

  7. C#/VB.NET 在Excel单元格中应用多种字体格式

    在Excel中,可对单元格中的字符串设置多种不同样式,通常只需要获取到单元格直接设置样式即可,该方法设置的样式会应用于该单元格中的所有字符.如果需要对单元格中某些字符设置样式,则可以参考本文中的方法. ...

  8. 通过第三方组件NPOI读取Excel的方法

    public class ExcelHelper { public class x2003 { #region Excel2003 /// <summary> /// 将Excel文件中的 ...

  9. NPOI设置Excel单元格字体、边框、对齐、背景色

    代码: ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; ce ...

随机推荐

  1. python获取设备主机名和IP地址

    import socket def print_machine_info(): host_name = socket.gethostname() ip_address = socket.gethost ...

  2. JavaScript 变量声明:var、let、const

    1. 概述 1.1 说明 在ES5 声明变量的方法:var命令和function命令. 在ES6 声明变量的方法:var命令.function命令.let命令.const命令.import命令.cla ...

  3. .net 操作excel

    .net 操作excel的常用组件:EPPlus,NPOI 1.NPOI,即POI的.NET版本(POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office文件, ...

  4. 20175226 2018-2019-2 《Java程序设计》第五周学习总结

    20175226 2018-2019-2 <Java程序设计>第五周学习总结 教材学习内容总结 接口 包含接口声明和接口体 接口声明interface 接口的名字 接口体中包含常量的声明( ...

  5. 不使用synchronized和lock 锁实现线程安全单例

    单例实现方式一,锁机制 public class Singleton { private static Singleton singleton=null; public Singleton() { } ...

  6. centos6.9 改系统语言成中文简体

    1.在root权限下 切换到root下:su root 查看当前语言环境:locale -a  (注意中间有空格) 如果看到 zh_CN.UTF-8(这个是中文简体)说明你的系统支持中文语言 2.编辑 ...

  7. java中的static

    1.静态方法 在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: 1. 它们仅能调用其他的static 方法. 2· 它们只能访问s ...

  8. React知识杂烩(持续更新)

    每隔半年不看官方文档,你就会不认识React了

  9. Linux从入门到进阶全集——【第八集:软件包管理:rpm、tar、yum】

    1,对Linux下软件的了解 源码包:未编译,要编译安装. 二进制包:已编译,可直接安装. 2,centos和ubuntu下的软件包对比: [centos]rpm文件手动安装,使用rpm指令     ...

  10. java编程(2)——servlet和Ajax异步请求的接口编程(有调用数据库的数据)

    第一步: 1.为项目配置 Tomcat 为 server: 2.导入 mysql的jar包 到项目目录中: 第二步:编码 1.数据库连接类ConnectMysql.java代码: package co ...