当前位置: 首页 > 编程笔记 >

C#读写EXCEL单元格的问题实现

袁炳
2023-03-14
本文向大家介绍C#读写EXCEL单元格的问题实现,包括了C#读写EXCEL单元格的问题实现的使用技巧和注意事项,需要的朋友参考一下

最近, 我在用C#开发一个EXCEL Add-In的时候,发现了一些害人不浅的坑,特来总结列举如下:

这里我读写EXCEL引用的是using Excel = Microsoft.Office.Interop.Excel; 

问题一、如何判断一个单元格去除首尾空格后是不是空的

在获取单元格内的文本内容进行判断时,总觉得最好用Text属性,少用或不用Value和Value2属性

if (cur_sht.Range["A1"].Text.Trim() == "")
{}

Text属性是只读,没有任何参数,会读取单元格的表面内容,表面内容是指当单元格的格式发生变化时,Text属性读取到的内容也会发生变化

Value属性可读可写,有一个可选参数(XlRangeValueDataType),会读取单元格的实际内容,实际内容是指给单元格赋值时是怎么样的内容,实际内容就一直保持不变,除非重新赋值

这个可选参数有三个值可选,第一个值是默认的,其他两个值没试过,估计永远也不会去用

xlRangeValueDefault=10:cur_sht.Range["A1"].Value[Excel.XlRangeValueDataType.xlRangeValueDefault]

xlRangeValueMSPersistXML=12:cur_sht.Range["A1"].Value[Excel.XlRangeValueDataType.xlRangeValueMSPersistXML]

xlRangeValueXMLSpreadsheet=11:cur_sht.Range["A1"].Value[Excel.XlRangeValueDataType.xlRangeValueXMLSpreadsheet]

Value2属性也是可读可写,跟Value属性一样,但没有参数

对于实际内容不为空的单元格,使用cur_sht.Range["A1"].Value.Trim()或者cur_sht.Range["A1"].Value2.Trim()是完全没问题的,但如果是一个完全为空的单元格,Value和Value2属性就会返回一个空对象,这时候后面再接Trim()方法就会报错了,要用Value或Value2属性找出这种完全为空的单元格,可以这样:

if (cur_sht.Range["A1"].Value is null)
{}

但是这样就不能把去除空格后的情况考虑进去了,而Text属性又有一个弊端,因为它是读取单元格的表面内容,所以有时候读取到的内容用来判断并不能反映真实的情况:

比如单元格存储的是一个长日期,但是单元格宽度不够的话就会显示成"##########",这时候Text属性获取到的就是一串井号,这种情况可以在前面添加一句代码:

cur_sht.Columns.AutoFit();

总之,两种方法皆有利有弊,视具体情况选择吧。

问题二、给一个单元格赋值为空有多少种方法

这三种方法效果都是一样的,用cur_sht.Range["A1"].Value取值都会返回null。

cur_sht.Range["A1"].Value = null;
cur_sht.Range["A1"].Value = "";
cur_sht.Range["A1"].Value =string.Empty;

问题三、如何利用数组快速读写单元格区域内容

如果要向行向区域的单元格写入东西,可以用一维数组,比如:

int[] arr1 = new int[4] { 1, 2, 3, 4 };
cur_sht.Range["a1:d1"].Value = arr1;

如果要向列向区域的单元格写入东西,可以用二维数组,比如:

int[,] arr2 = new int[4, 1] { { 4, },{ 3, },{ 2, },{ 1, } };
//int[,] arr2 = new int[4, 1] { {4},{3},{2},{1} };这个也可以
cur_sht.Range["a1:a4"].Value = arr2;

如果要向矩形区域的单元格写入东西,更要用二维数组,比如:

int[,] arr3 = new int[4, 2] { { 4, 3}, { 3, 2}, { 2, 1}, { 1, 4} };
cur_sht.Range["a1:b4"].Value = arr3;

如果要从单元格区域读出内容,放进数组中,不管一二维,都可以这么写:

object[,] arr4 = (object[,])cur_sht.Range["a1:b4"].Value2;

MessageBox.Show(arr4.GetValue(1,1).ToString());//这里输出的是A1单元格,index从1开始

好了,拿去用吧,不谢^ ^

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 我正在尝试使用Apache POI来读取旧的(2007年之前和XLS)Excel文件。我的程序走到行的末尾并进行迭代,直到找到非null或非空的内容。然后它迭代几次并获取这些细胞。该程序可以很好地读取Office 2010中的XLSX和XLS文件。 我收到以下错误消息: 排队的时候: 根据代码: 其中是文档中最后一个不为空或null的单元格。当我尝试打印第一个不为空或null的单元格时,它不会打印

  • 问题内容: 我正在尝试使用Apache POI读取旧的(2007年前和XLS前)Excel文件。我的程序转到行的末尾并进行迭代,直到找到不为null或为空的值。然后迭代回去几次并获取这些单元格。该程序可以很好地读取Office 2010中制作的XLSX和XLS文件。 我收到以下错误消息: 在行: 从代码: 其中是文档中最后一个不为空或为null的单元格。当我尝试打印不为空或为null的第一个单元格

  • 我读了如何读取单个Excel单元格值,并亲自尝试了一下。但当我到了

  • 本文向大家介绍python读写Excel表格的实例代码(简单实用),包括了python读写Excel表格的实例代码(简单实用)的使用技巧和注意事项,需要的朋友参考一下 安装两个库:pip install xlrd、pip install xlwt 1.python读excel——xlrd 2.python写excel——xlwt 1.读excel数据,包括日期等数据 运行效果 2.往excel写入

  • 我对Eclipse Java编码一无所知。我正在努力完成一个管理库存的项目。我遇到的问题是,当我试图将项目写入excel单元格时,我收到错误消息,称数组超出了界限。 附言:项目和item.get部分名称等都定义在另一个类文件下。请帮忙。谢谢

  • 我在把数据写到excel文件时遇到了问题。我使用的是apache POI 4.1.2版本库。下面是示例代码。 在excel文件中保存的最后一列单元格中,以前的单元格保持为空白。请帮忙,如果我做错了什么,请告诉我?