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[,] 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 开始
好了, 拿去用吧, 不谢 ^ ^
来源: https://www.2cto.com/kf/201904/805475.html