npoi 执行公式_C# 开源组件--NPOI读取Excel单元格中的公式值

本文介绍如何使用C#开源组件NPOI读取包含公式的Excel文件。在读取时,针对Excel的XSSF工作簿类型,通过FormulaEvaluator来评估公式并获取计算后的值,分别处理数值和字符串类型的返回结果。
摘要由CSDN通过智能技术生成

今天在项目中碰到了EXCEL导入的数据是用公式生成,直接导入不了数据,写在博客中方便自已查询也可以给想找这方面的参考一下:

用NPOI导入时,在OFFICE 2007中的文件导入时一般会用XSSF,所以得到的类型会是CellType.FORMULA

1 /// 读取excel

2 /// 默认第一行为表头

3 ///

4 /// excel文档绝对路径

5 /// 内容行偏移量,第一行为表头,内容行从第二行开始则为1

6 ///

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 }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值