欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#读写EXCEL单元格的问题

程序员文章站 2022-03-20 12:00:50
最近, 我在用C#开发一个EXCEL Add-In的时候,发现了一些害人不浅的坑,特来总结列举如下: 这里我读写EXCEL引用的是using Excel = Microsoft.Office.Interop.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开始

 

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