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

相关文章

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当