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

相关文章

CSS place-items: center解析与用法详解

《CSSplace-items:center解析与用法详解》place-items:center;是一个强大的CSS简写属性,用于同时控制网格(Grid)和弹性盒(Flexbox)... place-items: center; 是一个强大的 css 简写属性,用于同时控制 网格(Grid) 和 弹性盒(F

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据