本文主要是介绍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 【深度踩坑】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!