C# 读取本地Excel并解析 Cannot get a xx value from a yy cell 【深度踩坑】

2024-03-26 17:10

本文主要是介绍C# 读取本地Excel并解析 Cannot get a xx value from a yy cell 【深度踩坑】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天记录一下C#读取本地Excel并解析的基本流程与问题解决。

众嗦粥汁,Excel不管在业务处理还是测试数据导入等方面都非常有用,嗯。

我这边使用的是NPOI 2.5.3。

这里准备了两个版本,诸君各取所需。

2.5.3

https://download.csdn.net/download/qq_35139974/85011468

2.5.5

https://download.csdn.net/download/qq_35139974/85011473

接下来,先说问题。

(1)问题如下:

 

 Excel单元格中,单元格格式非常多,存储交叉又比较复杂,如果用文本存储了一个数值,然后用数值类型获取就会报错,如果用文本类型获取又需要做类型转换,你还不确定编辑Excel的用户给你设置了个什么单元格格式……

但是相对来说,我们是知道哪一列正确数值是什么格式的,所以可以在读取单元格数据之前先把它设置为该格式,然后再读取,就好了:

// 不仅限于String类型,Numeric类型等也是一样
row.GetCell(0).SetCellType(CellType.String);
if (row.GetCell(0).IsNullOrEmpty() || row.GetCell(0).StringCellValue.IsNullOrEmpty())
{throw new Exception("Excel解析异常:第" + (r + 1) + "行某属性为空");
}
string strValue = row.GetCell(0).StringCellValue;

这样,就解决了。

下面说详细读取流程,个人记录,仅供参考。

(2)直接上代码吧。

try
{string localPath = "本地完整绝对路径";// 打开工作簿IWorkbook workbook = WorkbookFactory.Create(localPath);if (workbook == null){throw new Exception("解析异常:Excel工作簿获取异常");}// 获取第一个工作表ISheet sheet = workbook.GetSheetAt(0);if (sheet == null){throw new Exception("解析异常:Excel默认工作表获取异常");}// 获取总行数int rowCount = sheet.LastRowNum;// 按行遍历for (int r = 0; r < rowCount; r++){// 获取行数据IRow row = sheet.GetRow(r);if (row == null){throw new Exception("解析异常:获取第" + (r + 1) + "行失败");}// 获取列数 可以对列进行数据校验int columnCount = row.LastCellNum;if (columnCount != 5){throw new Exception("解析异常:每行应该有5列,当前为" + columnCount + "列");}row.GetCell(0).SetCellType(CellType.String);if (row.GetCell(0).IsNullOrEmpty() || row.GetCell(0).StringCellValue.IsNullOrEmpty()){throw new Exception("解析异常:第" + (r + 1) + "行某属性为空");}string strValue = row.GetCell(0).StringCellValue;row.GetCell(1).SetCellType(CellType.Numeric);if (row.GetCell(1).IsNullOrEmpty() || row.GetCell(1).NumericCellValue.IsNullOrEmpty()){throw new Exception("解析异常:第" + (r + 1) + "行某属性为空");}double realValue = row.GetCell(1).NumericCellValue;}
}
catch (Exception e)
{throw new Exception("Excel 解析异常:" + e.Message);
}

(3)如果还是没有解决  Cannot get a xx value from a yy cell,我自己封装了一个方法,先把单元格中的数据转为string读出,然后根据自己的需求转为各种格式。下面,贴代码吧。

/// <summary>
/// 读取Row中Cell的值
/// </summary>
/// <param name="row">当前行数据</param>
/// <param name="columnIndex">读取当前行第几列(从0开始)</param>
/// <param name="expString">解析什么文件,执行什么操作。为抛出异常提供信息支持</param>
/// <param name="rowIndex">当前行为第几行(从0开始)。为抛出异常提供信息支持</param>
/// <param name="filedName">当前列表头。为抛出异常提供信息支持</param>
/// <param name="allowEmpty">是否允许为空,不允许为空时如果遇到空值会抛出异常</param>
/// <returns></returns>
private static string GetCellValueFromRow(IRow row, int columnIndex, string expString, int rowIndex, string filedName, bool allowEmpty)
{if (row.GetCell(columnIndex).IsNullOrEmpty()){if (!allowEmpty){throw new Exception(expString + "解析异常:第" + (rowIndex + 1) + "行" + filedName + "为空");}else{return "";}}return row.GetCell(columnIndex).ToString();
}

调用也很简单:

// 读取文本类型
string name = GetCellValueFromRow(row, 0, "用户信息", r, "姓名", false);
// 读取数值类型
double height = Convert.ToDouble(GetCellValueFromRow(row, 2, "用户信息", r, "身高", false));

好了,记录完毕。

Thanks♪(・ω・)ノ

这篇关于C# 读取本地Excel并解析 Cannot get a xx value from a yy cell 【深度踩坑】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/849246

相关文章

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

C#下Newtonsoft.Json的具体使用

《C#下Newtonsoft.Json的具体使用》Newtonsoft.Json是一个非常流行的C#JSON序列化和反序列化库,它可以方便地将C#对象转换为JSON格式,或者将JSON数据解析为C#对... 目录安装 Newtonsoft.json基本用法1. 序列化 C# 对象为 JSON2. 反序列化