设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间15 现在时间15 缓存数据 哪怕他只唱了几句,哪怕别人不仔细听都听不到他的声音,他还是要固执的在自己的名字后面写上他的名字,从他们两个名字写在一起的第一天起,就注定了一辈子不会分开[爱心]

哪怕他只唱了几句,哪怕别人不仔细听都听不到他的声音,他还是要固执的在自己的名字后面写上他的名字,从他们两个名字写在一起的第一天起,就注定了一辈子不会分开[爱心] -- 怎么了,没什么

查看: 1281|回复: 2

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

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:203
  • 打卡月天数:0
  • 打卡总奖励:3059
  • 最近打卡:2023-08-27 07:38:29
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
384
主题
351
精华
0
金钱
4168
积分
761
注册时间
2022-12-23
最后登录
2025-5-31

发表于 2023-2-26 16:19:46 | 显示全部楼层 |阅读模式
最近, 我在用C#开发一个EXCEL Add-In的时候,发现了一些害人不浅的坑,特来总结列举如下:
这里我读写EXCEL引用的是using Excel = Microsoft.Office.Interop.Excel;
问题一、如何判断一个单元格去除首尾空格后是不是空的
在获取单元格内的文本内容进行判断时,总觉得最好用Text属性,少用或不用Value和Value2属性
  1. if (cur_sht.Range["A1"].Text.Trim() == "")
  2. {}
复制代码
Text属性是只读,没有任何参数,会读取单元格的表面内容,表面内容是指当单元格的格式发生变化时,Text属性读取到的内容也会发生变化
Value属性可读可写,有一个可选参数(XlRangeValueDataType),会读取单元格的实际内容,实际内容是指给单元格赋值时是怎么样的内容,实际内容就一直保持不变,除非重新赋值
这个可选参数有三个值可选,第一个值是默认的,其他两个值没试过,估计永远也不会去用
  1. xlRangeValueDefault=10:cur_sht.Range["A1"].Value[Excel.XlRangeValueDataType.xlRangeValueDefault]

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

  3. 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属性找出这种完全为空的单元格,可以这样:
  1. if (cur_sht.Range["A1"].Value is null)
  2. {}
复制代码
但是这样就不能把去除空格后的情况考虑进去了,而Text属性又有一个弊端,因为它是读取单元格的表面内容,所以有时候读取到的内容用来判断并不能反映真实的情况:
比如单元格存储的是一个长日期,但是单元格宽度不够的话就会显示成"##########",这时候Text属性获取到的就是一串井号,这种情况可以在前面添加一句代码:
  1. cur_sht.Columns.AutoFit();
复制代码
总之,两种方法皆有利有弊,视具体情况选择吧。
问题二、给一个单元格赋值为空有多少种方法
这三种方法效果都是一样的,用cur_sht.Range["A1"].Value取值都会返回null。
  1. cur_sht.Range["A1"].Value = null;
  2. cur_sht.Range["A1"].Value = "";
  3. cur_sht.Range["A1"].Value =string.Empty;
复制代码
问题三、如何利用数组快速读写单元格区域内容
如果要向行向区域的单元格写入东西,可以用一维数组,比如:
  1. int[] arr1 = new int[4] { 1, 2, 3, 4 };
  2. cur_sht.Range["a1:d1"].Value = arr1;
复制代码
如果要向列向区域的单元格写入东西,可以用二维数组,比如:
  1. int[,] arr2 = new int[4, 1] { { 4, },{ 3, },{ 2, },{ 1, } };
  2. //int[,] arr2 = new int[4, 1] { {4},{3},{2},{1} };这个也可以
  3. cur_sht.Range["a1:a4"].Value = arr2;
复制代码
如果要向矩形区域的单元格写入东西,更要用二维数组,比如:
  1. int[,] arr3 = new int[4, 2] { { 4, 3}, { 3, 2}, { 2, 1}, { 1, 4} };
  2. cur_sht.Range["a1:b4"].Value = arr3;
复制代码
如果要从单元格区域读出内容,放进数组中,不管一二维,都可以这么写:
  1. object[,] arr4 = (object[,])cur_sht.Range["a1:b4"].Value2;
复制代码
MessageBox.Show(arr4.GetValue(1,1).ToString());//这里输出的是A1单元格,index从1开始
好了,拿去用吧,不谢^ ^

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持晓枫资讯。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:21
  • 打卡月天数:0
  • 打卡总奖励:223
  • 最近打卡:2025-04-23 04:36:32
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
5
精华
0
金钱
268
积分
53
注册时间
2023-1-3
最后登录
2025-4-23

发表于 2025-2-16 15:01:39 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
20
积分
20
注册时间
2022-12-26
最后登录
2022-12-26

发表于 前天 20:14 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表