Excel中的条件格式功能是个11分强劲且方便的效用,通过对采取规则格式作用能够在非常大程度上改革表格的设计和可读性,用户能够内定单个只怕多少个单元格区域接纳一种或然两种格式,如此一来,也在大大进步了表格的可操作性。上面将介绍在C#编制程序中怎么着来设置并应用Excel条件格式。
上一篇文章中介绍了关于设置Excel条件格式,包罗基于单元格值、自定义公式等利用条件格式、应用数据条规则类型格式、删除条件格式等剧情。在本篇小说上将继续介绍C#
设置条件格式的办法。
使用Range对象
Range对象表示电子表格中的单元格范围。范围能够分包一个单元格,多个接二连三的单元格,甚至三个不一连的单元格。您能够在Excel中接纳时按住Ctrl键采纳两个不总是的单元格。
闲话Microsoft Excel
三大绝招,助你笑傲Excel江湖
从1981年的率先款Excel(只用于Mac系统)诞生现今,Microsoft
Excel已经3叁周岁,现时正当而立之年!成效最好强大,但对周边使用者而言,Microsoft
Excel同时也尤其混乱。一人想要完全可行控制和采取Microsoft
Excel的兼具机能的话,能够说是不容许做到的职务(Mission
Impossible!)。而其实对于大多数人而言,平日生存和工作中能用到的和常用的法力实在并不多,而且即便如此,Microsoft
Excel也早已帮大家很好地处理了很多任务了!
正所谓,“过犹不及”,我们平素不须要为了利用工具而接纳工具,我们的靶子是缓解难点和完结义务!(题外话:我们的对象是星辰大海~~)由此,大家并不须要领会和控制Microsoft
Excel的富有有关文化,而只须求控制那些我们有需求明白的就能够了!
本篇小说就为大家介绍Microsoft
Excel中的三个特别有效的成效和用法,希望能够使大家的办公生活有点轻松一些!(^_^)
示范要点概述:
-
依据单元格值应用条件格式
-
基于自定义公式应用条件格式
-
运用数据条标准类型格式
-
除去条件格式
4.1 删除钦命数量范围中的条件格式
【澳门葡京备用网址】应用Excel条件格式,助你笑傲Excel江湖。 4.2 删除全数规范格式
要领概述:
-
动用条件格式用于高亮重复、唯一数值
-
应用条件格式用于高亮峰值(最高、最低)
-
选用条件格式用于高亮低于、高于平均值的数值
得到特定Cell或Cells范围对象
Excel提供了四种收获Range对象的主意。
Range对象是你要在Excel工作表中处理单元格或单元格范围时行使的靶子。在Application对象的描述中涉及了两种获得Range对象的措施。
Application.ActiveCell在运动窗口中回到活动采用的左上角单元格。
Application.Selection再次来到3个表示活动窗口中移动选择的对象。若是运动接纳是单元格范围,则能够将Application.Selection转换为Range对象。假使在运动窗口(例如形状或图表)中选用了其余选用,Application.Selection将赶回所选对象。
1.SUMIFS:
SUM函数是MS Excel中最宗旨也最得力的函数之一,相信大家已经已经用得烂熟了!它经过七个不难易行的公式就足以高速拉长大批量的数目,节省了广大钟头的用指尖多个键3个键地敲总括器的日子。不过,SUM函数的通用性也正因为其简要而饱受掣肘,由此大家要介绍的SUMIF(S)等函数该出场了!
假诺你有三个急剧的行销数据表,当中囊括销售总额、商家、城市、售出产品和制品销售月份等目标:
销售数据表
SUM函数能够很简单地抬高出总销售额,可是你的CEO那时只想要纸巾的总销售额,怎么办吧?别担心,很简短,大家运用SUMIF函数来计算:
SUMIF函数
第壹,设定筛选标准的物色范围(产品列),然后添加筛选标准(具体产品名),最终选拔进行求和的值(筛选标准所对应的值)并累加。公式应该是如此的:
=SUMIF(D:D,”纸巾”,E:E)
*小提醒:公式中有着的假名、标点、括号都以在英文输入法的半角状态下输入的。
解释一下:那些公式告诉Excel将E列中的与D列的规格“纸巾”相呼应的全数数据拉长起来。
接下去,假使你的业主想要巴黎的办公椅的总销量,而且还即便由你的同事赵六负责的(即使第1感应是,“又不是自身承担的,干嘛让本身来总括”。但人家终归是业主,又怎么好意思怼回去吧?),那又该怎么处理呢?挠头,觉得不大概?放心,有SUMIFS在,没什么不容许!(Nothing
is Impossible!不好意思,广告看太多了。)
逆天的SUMIFS函数允许你使用几个条件,就一定于是压实版的SUMIF:
SUMIFS函数
在SUMIF的前面扩充3个S,就好像匈牙利(Hungary)语里的单数、复数格局吗!微软真是会造词啊!
那三遍,从需供给和的值伊始,稳步拉长每一种需求的筛选标准。最后结出应当是那般的:
=SUMIFS(E:E,A:A,”4″,B:B,”赵六”,C:C,”上海”,D:D,”办公椅”)
*小提示:公式中有所的假名、标点、括号都是在英文输入法的半角状态下输入的。
解释一下:简单地说,正是告诉MS
Excel,首先哪些列里有我们需求的数目,然后依照筛选标准筛选出适合的值,最终求和。只可是,条件多了一丝丝!
*小提醒:SUMIF和SUMIFS的括号里,搜索范围、筛选标准的相继是分裂的哦!
当然啦,我们也能够应用此外一种MS
Excel中千篇一律既简约又作用强大的工具:数据透视表来获得依照那些筛选标准所分离出来的兼具数据的完好视图。可是,SUMIFS函数也有其特殊优点,它能够选拔和过滤掉大数目汇总的多少,而并不须要处理全体的连锁或不相干的多寡。
应用工具
- Free Spire.XLS for .NET
8.3(免费版) - Visual Studio
接纳工具:
- Spire.XLS for
.NET
注:在编写制定代码时留目的在于程序中加上引用Spire.Xls.dll,dll文件可在设置路径下的Bin文件夹中取得。
工作表还提供了两种得到Range对象的不二法门。
Worksheet.get_Range方法是从工作表获取Range对象的最常用方法。此方法接收能够传递字符串的不可或缺对象参数。它具有能够传递第二个字符串的第三个可选参数。您传递的字符串是所谓的A1体制参考格式。解释A1体裁参考格式的最简易的措施是付诸多少个例证。
2.Find/Mid:
Find/Mid函数组合为自个儿在MS
Excel中节省的日子,或者是享有函数中最多的。它(们)是能够从单元格中领到文本块的个别多少个Excel函数之一。甚至能够说它(们)是最有效的函数,因为能够操作它(们)跨越数千个单元格而享有相同的公式。
示范代码(供参考)
测试文书档案如下:
C#代码示例(供参考)
参考A1钦赐A列1行的单元格。参考D22内定D列22行的单元格。参考AA11钦点行11,列AA(第②7列)处的单元格。
MID:
MID函数
MS Excel 2016中,Mid函数的定义是:MID
再次回到文本字符串中从内定地方上马的一定数指标字符,该数量由用户钦点。
像Left和Right函数一样,Mid函数也足以从单元格中领到文本。首先,引用单元格从中提取文本。然后,重返从钦点地点上马的急需多少的字符。例如:
MID函数用法示例
通过运用Mid函数,Excel将引用单元格D1(MS Excel functions are so amazing
cool),找到第二伍个字符,然后从10分地点上马向后,再次回到前拾一个字符。
很简短吗!
*小提示:重返结果是从第三四个字符初步的,即将第壹5个字符作为重返值的第贰个,然后向右数壹 、② 、3…10,重返计算13个字符。
【示例 1 】应用条件格式
using Spire.Xls;
using System.Drawing;
namespace ConditionalFormatting_XLS
{
class Program
{
static void Main(string[] args)
{
//实例化workbook对象并加载文档
Workbook wb = new Workbook();
wb.LoadFromFile("sample.xlsx");
//获取第一个工作表
Worksheet sheet = wb.Worksheets[0];
//获取数据范围
CellRange range = sheet.Range["A2:H27"];
//在所选范围添加条件格式1
ConditionalFormatWrapper format1 = range.ConditionalFormats.AddCondition();
//条件格式类型1基于单元格值
format1.FormatType = ConditionalFormatType.CellValue;
//将数值在60到90之间的单元格进行字体加粗,并设置字体颜色为橙色
format1.FirstFormula = "60";
format1.SecondFormula = "90";
format1.Operator = ComparisonOperatorType.Between;
format1.FontColor = Color.Orange;
//format1.BackColor = Color.Orange;
//添加条件格式2
ConditionalFormatWrapper format2 = range.ConditionalFormats.AddCondition();
format2.FormatType = ConditionalFormatType.CellValue;
format2.FirstFormula = "60";
format2.Operator = ComparisonOperatorType.Less;
format2.FontColor = Color.Red;
//format2.BackColor = Color.Red;
format2.IsBold = true;
//添加边框格式(边框颜色、边框类型)到条件格式2
format2.LeftBorderColor = Color.Red;
format2.RightBorderColor = Color.DarkBlue;
format2.TopBorderColor = Color.DeepSkyBlue;
format2.BottomBorderColor = Color.DeepSkyBlue;
format2.LeftBorderStyle = LineStyleType.Medium;
format2.RightBorderStyle = LineStyleType.Thick;
format2.TopBorderStyle = LineStyleType.Double;
format2.BottomBorderStyle = LineStyleType.Double;
//条件格式3的类型为自定义公式
ConditionalFormatWrapper format3 = range.ConditionalFormats.AddCondition();
format3.FormatType = ConditionalFormatType.Formula;
//自定义公式将低于60的单元格所在的行填充背景色
format3.FirstFormula = "=OR($C2<60,$D2<60,$E2<60,$F2<60,$G2<60,$H2<60)";
format3.BackColor = Color.Gray;
//保存并打开文档
wb.SaveToFile("result.xlsx", ExcelVersion.Version2013);
System.Diagnostics.Process.Start("result.xlsx");
}
}
}
调剂运营程序,生成文书档案,如下:
【示例 1】应用条件格式用于高亮重复、唯一数值
C#
using Spire.Xls;
using System.Drawing;
namespace HightDuplicateData_XLS
{
class Program
{
static void Main(string[] args)
{
//实例化Workbook类,加载测试文档
Workbook workbook = new Workbook();
workbook.LoadFromFile("test.xlsx");
//获取第一个工作表
Worksheet sheet = workbook.Worksheets[0];
//应用条件格式1到指定数据范围,高亮重复数值的单元格
ConditionalFormatWrapper format1 = sheet.Range["A3:A13"].ConditionalFormats.AddCondition();
format1.FormatType = ConditionalFormatType.DuplicateValues;
format1.BackColor = Color.Cyan;
//应用条件格式2到指定数据范围,高亮唯一值的单元格
ConditionalFormatWrapper format2 = sheet.Range["A3:A13"].ConditionalFormats.AddCondition();
format2.FormatType = ConditionalFormatType.UniqueValues;
format2.BackColor = Color.Yellow;
//保存文档并打开
workbook.SaveToFile("result.xlsx", ExcelVersion.Version2013);
System.Diagnostics.Process.Start("result.xlsx");
}
}
}
成功代码后,调试运维程序,生成文书档案,如下图:
参照$ A $
1也指的是第二行列A中的单元格。假诺在A1体制引用中央银行使$符号,则它们将被忽视。
FIND:
FIND函数
MS Excel 二零一四中,Find函数的概念如下:函数
FIND用于在第二个文本串中一定第①个文本串,并回到第三个公文串的开首地方的值,该值从第三个文件串的首先个字符算起。
读起来有个别生硬是还是不是?其实相当的粗略。Find函数将在单元格中找到1个字符串,并再次回到第四个字符的地点数。我们用平等的数量来比喻:
FIND函数用法示例
“are” 在单元格D1里是从第三0个字符初步的。
小心1:要是给定单元格中的文本字符串不是唯一的,那么Excel将回来文本字符串中找到的第贰个实例。比如,=FIND(“c”,D1)获得的结果是3,而忽略掉别的的。
在意2:Find函数区分轻重缓急写,所以只要采用”Are”而不是”are”的话,结果将重返错误。
那正是说今后让我们采纳下边的事例来对FIND/MID的组合使用举行验证呢!
第2,比如有八个网址:ttp://www.gamersky.com/news/201612/843064.shtml
(注明1:举那一个网址为例没有别的企图,只是因为刚刚作者打开了这些网页在看消息。)
(证明2:特意删除掉了第三个字母h,实际演示的Excel文书档案中是一对。)
若是你供给从这些网址中领到页面ID号(在本例中为843064)。
数字从第三多少个字符起初,由此你能够利用= Mid(单元格,37,6)重返ID号。
FIND_MID组合用法示例
MS
Excel的函数之所以强大,就在于函数可以互为组合使用。上面包车型大巴例证中,=MID(A1,37,6)中的起先地点37是怎么获得的吧?有人说,大家得以多少个多少个从左到右数过去呀。也有人说,假若网址不长这岂不是要累死,而且难免不会数错!说的对,所以大家就把数数的行事交给强大的Excel去做,大家等它的结果就足以了。让我们把地点的公式稍微改变一下:
=MID(A1,FIND(“shtml”,A1)-7,6)
我们着眼到,ID号有七个人数,并且是从处于最右侧的旷世的shtml字符串的左边第10个字符伊始的,所以大家就把本来的公式改造成了上边的榜样。那下不用大家叁个字符四个字符地数了呢?
MID和FIND的整合可以抒发出巨大的功效,给我们处理多少推动最好的方便人民群众。具体的例证那里就不多列举了,我们先品尝起来吧!须知,“眼过千遍,不如手过二次”!
【示例2】应用数据条类型的准绳格式
using Spire.Xls;
using System.Drawing;
namespace ConditionalFormatting_XLS
{
class Program
{
static void Main(string[] args)
{
//实例化workbook对象并加载文档
Workbook wb = new Workbook();
wb.LoadFromFile("sample.xlsx");
//获取第2个工作表
Worksheet sheet = wb.Worksheets[1];
//获取数据范围
CellRange range = sheet.Range["B2:D7"];
//添加条件类型4为data bars
ConditionalFormatWrapper format4 = sheet.AllocatedRange.ConditionalFormats.AddCondition();
format4.FormatType = ConditionalFormatType.DataBar;
format4.DataBar.BarColor = Color.ForestGreen;
//保存并打开文档
wb.SaveToFile("result1.xlsx", ExcelVersion.Version2013);
System.Diagnostics.Process.Start("result1.xlsx");
}
}
}
测试结果:
【示例2】应用条件格式用于高亮峰值(最高、最低)
C#
using Spire.Xls;
using System.Drawing;
namespace HighlightTopData_XLS
{
class Program
{
static void Main(string[] args)
{
//实例化workbook类
Workbook workbook = new Workbook();
//加载测试文档
workbook.LoadFromFile("test.xlsx");
//获取第一个工作表
Worksheet sheet = workbook.Worksheets[0];
//应用条件格式1到指定范围,并高亮最高(依次排序)的两个数值
ConditionalFormatWrapper format1 = sheet.Range["B17:B24"].ConditionalFormats.AddCondition();
format1.FormatType = ConditionalFormatType.TopBottom;
format1.TopBottom.Type = TopBottomType.Top;
format1.TopBottom.Rank = 2;
format1.BackColor = Color.Green;
//应用条件格式2到指定范围,并高亮最低(依次排序)的两个数值
ConditionalFormatWrapper format2 = sheet.Range["B17:B24"].ConditionalFormats.AddCondition();
format2.FormatType = ConditionalFormatType.TopBottom;
format2.TopBottom.Type = TopBottomType.Bottom;
format2.TopBottom.Rank = 2;
format2.BackColor = Color.RosyBrown;
//保存并打开文档
workbook.SaveToFile("output.xlsx", ExcelVersion.Version2013);
System.Diagnostics.Process.Start("output.xlsx");
}
}
}
测试结果:
你能够行使范围运算符(:)来钦赐单元格范围,当中第2个A1体制引用是限制的左上角,后跟2个冒号运算符,之后是右下角的第三个A1样式引用的范围。参考A1:B1指的是行1,列A和列1,列B的多少个单元格。参考A1:AA11是指块中的全数29八个单元格,其左上角位于第③列,第A列和下侧右角位于第二1列,AA栏(第二7列)。
3.LEN函数+条件格式
我们日常索要写一些事物,但因为有字数限制,所以创作的进度并不都以那么和颜悦色——经常一一点都不小心字数就跨越限制了。那么借助于MS
Excel大家能够有点子提示自个儿小心呢?
答案是必定的。大家只需使用LEN函数和“条件格式”就能够很好地开始展览字符限制跟踪提醒了!
MS Excel 二零一四中,Len函数的定义:LEN 再次回到文本字符串中的字符个数。
很简单懂啊!LEN函数卓殊不难——只回去给定单元格中的字符数。大家如故来看例子吗!
LEN函数用法示例
见状上边那张图纸了啊?都是自己发过的腾讯网(嘻嘻)。假若本身须求你总计各类单元格的字符数,然后告诉作者那么些单元格里当先了柒11个字(符),你会不会想打作者?(作者躲~~)
再想象一下如果现在一共有两千个这样的单元格,你又怎么火速准确地判定哪些超出了字数限制,哪些没超越呢?
好吧,让本人来演示一下吧。首先大家选中B列,然后点击“起始”选项卡里面包车型大巴“条件格式”,在弹出的选项中精选“出色显示单元格规则”之“大于…”
LEN函数用法示例2
继之,输入我们的单元格字符数限制数值:(那里以70为例)
LEN函数用法示例3
如上海体育地方所示,点击“明确”后,在B1单元格里输入LEN函数并援引文本单元格:
=LEN(A1)
LEN函数用法示例4
把鼠标放在B1单元格的右下角,变成十字后,按下鼠标左键,鼠标向下拖动,公式就被机关复制下去了:
LEN函数用法示例5
“条件格式”里的限制条件“大于”也能够被变更为别的的规范选拔,那统统在于你的切实可行处理要求。因而,条件格式是不行管用的,而且将它与其余职能整合在联合署名的话更是将大家的工作处理能力升高到了3个新的层系,尤其是在处理具体的数目内容时!
【示例3】删除条件格式
using Spire.Xls;
namespace RemoveConditionalFormat_XLS
{
class Program
{
static void Main(string[] args)
{
//实例化Workbook类,加载测试文档
Workbook workbook = new Workbook();
workbook.LoadFromFile("test.xlsx");
//获取第一个工作表
Worksheet sheet = workbook.Worksheets[0];
//删除指定区域的条件格式
//sheet.Range["A5:H5"].ConditionalFormats.Remove();
//删除表格中的所有条件格式
sheet.AllocatedRange.ConditionalFormats.Remove();
//保存并打开文档
workbook.SaveToFile("result1.xlsx", ExcelVersion.Version2010);
System.Diagnostics.Process.Start("result1.xlsx");
}
}
}
删除效果
- 去除钦命数量范围的规则格式
- 删去全部标准格式
本次关于“C# 应用条件格式到Excel”的示范方法介绍到此。
如需转发,请注脚出处。
【示例3】应用条件格式用于高亮低于、高于平均值的数值
C#
using System.Drawing;
using Spire.Xls;
using Spire.Xls.Core;
using Spire.Xls.Core.Spreadsheet.Collections;
namespace Average_Condition
{
class Program
{
static void Main(string[] args)
{
//实例化workbook类
Workbook workbook = new Workbook();
//加载文档
workbook.LoadFromFile("test.xlsx");
//获取第一个工作表
Worksheet sheet = workbook.Worksheets[0];
//添加条件格式1并应用到指定数据范围
XlsConditionalFormats format1 = sheet.ConditionalFormats.Add();
format1.AddRange(sheet.Range["B17:B24"]);
//高亮低于平均数值的单元格
IConditionalFormat cf1 = format1.AddAverageCondition(AverageType.Below);
cf1.BackColor = Color.SkyBlue;
//添加条件格式2并应用到指定数据范围
XlsConditionalFormats format2 = sheet.ConditionalFormats.Add();
format2.AddRange(sheet.Range["B17:B24"]);
//高亮高于平均数值的单元格
IConditionalFormat cf2 = format1.AddAverageCondition(AverageType.Above);
cf2.BackColor = Color.Orange;
//保存并打开文档
workbook.SaveToFile("result.xlsx", ExcelVersion.Version2013);
System.Diagnostics.Process.Start("result.xlsx");
}
}
}
测试结果:
如上内容是这次关于设置Excel表格条件格式的补充介绍,如需转载,请注解出处。
(本文完)
你能够应用联合运算符(,)来钦定或然是不总是的两个单元格。例如,参考A1,C4点名了第3个单元格位于第①列,第A列,第①个单元格位于第5列第C列的七个单元格的界定。用户可以经过按住Ctrl键来选用单元格的不总是范围因为他俩选用各个细胞。参考A1,C4,C8,C10是钦点多个分裂单元格的另二个使得的A1样式参考。
结语
尽管本篇作品并不曾为您提供Microsoft
Excel在那之中全部与您或你的事情相关的内容,但本身的确希望能够为您提供一些更高级别的利用范例和选用。我深信不疑,精晓和左右了那些用法之后,应该能够为你或你的作业节省下许多贵重的光阴,并提供更好的数码观望和剖析参考。
交点运算符(二个空格)能够钦点单元格的混合。例如,参考A1:A10
A5:A十五分析为从行5,列A初始并以行A,列A起先的交接八个单元。参考A1:A10
A5:A15 A5解释为第④行的单个单元格,列A.
您还足以行使你在A1样式参考中在劳作表中定义的任何名称。例如,借使您定义了指向单元格A1的名为foo的名称范围。使用你的名指标某个使得的A1样式的引用将席卷foo:A2,其引用行1,列A和行2,列A的单元格。引用foo,A5:A6是指第3行,第A列;第⑥行,A列;和第肆列,列A。
如前所述,get_Range方法应用第二个可选参数,您能够传递第①个A1体制的引用字符串。使用限制运算符有效地构成率先个参数和第三个参数。由此,当调用get_Range(“A1”,“A2”)时,get_Range再次回到的限量等同于调用get_Range(“A1:A2”,Type.Missing)时收获的界定。
获取Range对象的第二种艺术是利用Worksheet.Cells属性,该属性再次回到工作表中全体单元格的界定。然后,您能够在再次回到的Range对象上运用同样的get_Range方法,并以与运用Worksheet对象中的get_Range相同的不二法门传递A1体裁引用以选择单元格。所以Cells.get_Range(“A1:A2”,Type.Missing)等价于get_Range(“A1:A2”,Type.Missing)。使用Cells属性的更广泛的用法是将其与Range的get_Item属性结合使用,该属性将选用行索引和可选的列索引。使用get_Item是一种在不选取A1体裁引用的境况下访问特定单元格的方法。所以Cells.get_Item(1,1)相当于get_Range(“A1”,Type.Missing)。
获得Range对象的另一种办法是使用Worksheet.Rows或Worksheet.Columns属性。这么些重临贰个与别的Range对象差别的限量。例如,假如您使用Column重临的限定并展现范围内的单元格数,则赶回256列数。然则一旦您在回去的界定内调用Select方法,Excel将在干活表中挑选具有16,772,2十五个单元格。考虑Rows和Columns重回的限量的最简易的办法是它们的表现与列和行标题在Excel中的行为相似。
清单5-27显得了动用get_Range方法和Cells,Rows和Columns属性的多少个示范。大家选择范围的Value2属性将限制中的每一种单元格设置为钦定的字符串值。程序的周转结果如图5-7所示
清单5-27 获取Range对象的VSTO定制
private void Sheet1_Startup(object sender, System.EventArgs e)
{
Excel.Range r1 = this.get_Range("A1", missing);
r1.Value2 = "r1";
Excel.Range r2 = this.get_Range("B7:C9", missing);
r2.Value2 = "r2";
Excel.Range r3 = this.get_Range("C1,C3,C5", missing);
r3.Value2 = "r3";
Excel.Range r4 = this.get_Range("A1:A10 A5:A15", missing);
r4.Value2 = "r4";
Excel.Range r5 = this.get_Range("F4", "G8");
r5.Value2 = "r5";
Excel.Range r6 = this.Rows.get_Item(12, missing)
as Excel.Range;
r6.Value2 = "r6";
Excel.Range r7 = this.Columns.get_Item(5, missing)
as Excel.Range;
r7.Value2 = "r7";
}
图5-7 运转结果清单5-27
使用Address
给定多少个Range对象,你时常索要分明它所指的单元格。
get_Address方法再次回到A1样式或PAJERO1C1样式范围的地点。
您已经精通了A1体裁的引用。
CRUISER1C1体裁的引用支持与A1样式引用(范围为冒号,联合逗号和陆续空间)商讨的兼具同一的运算符。
中华V1C1体裁的引用分别以LAND和C初阶的行和列号。
所以帕杰罗1C1品格的单元格西玛将是本田CR-V4C1。
图5-8显得了笔者们在本节初级中学结业生升学考试虑的多个地方的限定。
图5-8 具有多个不总是区域的限量
图5-第88中学范围的地址以A1样式和Tiguan1C1样式展示:
$A$15:$F$28,$H$3:$J$9,$L$1
R15C1:R28C6,R3C8:R9C10,R1C12
获得地址的另多个抉择是赢得外部引用仍旧当地引用。
大家已经在图5-第88中学显示的地点是本土引用。
外部引用包涵限制所在的工作簿和工作表的名称。
在图5-8中,与A1品格和福睿斯1C1品格的外表参考同样。
[Book1]Sheet1!$A$15:$F$28,$H$3:$J$9,$L$1
[Book1]Sheet1!R15C1:R28C6,R3C8:R9C10,R1C12
对此我们的演示,大家创立的范围的工作簿未保存。
当咱们将它保存为Book1.xls时,地址如下所示:
[Book1.xls]Sheet1!$A$15:$F$28,$H$3:$J$9,$L$1
[Book1.xls]Sheet1!R15C1:R28C6,R3C8:R9C10,R1C12
收获地址的另叁个精选是应用相对化地址依旧接纳相对地址。
大家早已考虑过的地址是纯属的。
相对格式(相对于单元格A1)的平等地方如下所示:
R[14]C:R[27]C[5],R[2]C[7]:R[8]C[9],RC[11]
A15:F28,H3:J9,L1
对于福睿斯1C1样式的地点,您还足以钦点希望地点相对的单元格。
假设大家在图5-4中绝对于单元格B2得到了帕杰罗1C1样式,大家赢得以下结果:
R[13]C[-1]:R[26]C[4],R[1]C[6]:R[7]C[8],R[-1]C[10]
澳门葡京备用网址,get_Address方法应用多少个可选参数来决定引用的回来格局,如表5-17所示。
表5-17 get_Address的可选参数
Parameter Name |
Type |
What It Does |
---|---|---|
RowAbsolute |
|
通过TRue将地址的行部分作为绝对引用返回($ A $ 1)。 如果您传递false,行参考将不会是绝对的($ A1)。 默认值为true。 |
ColumnAbsolute |
|
通过TRue将地址的列部分作为绝对引用返回($ A $ 1)。 如果你传递错误,列参考将不是绝对的(A $ 1)。 默认值为true。 |
ReferenceStyle |
|
通过xlA1返回A1样式的引用。 通过xlR1C1返回R1C1样式的引用。 |
External |
|
传递真的返回外部引用。 默认值为false。 |
RelativeTo |
|
传递一个表示您希望R1C1样式引用相对于单元格的Range对象。 与A1样式引用一起使用时不起作用。 |
清单5-28显得了动用示例范围的get_Address的多少个示范。
清单5-28 使用get_Address的VSTO自定义
private void Sheet1_Startup(object sender, System.EventArgs e)
{
Excel.Range range1 = this.get_Range(
"$A$15:$F$28,$H$3:$J$9,$L$1", missing);
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.AppendLine("A1-Style Addresses:");
sb.AppendFormat("Default: {0}\n", range1.get_Address(
missing, missing, Excel.XlReferenceStyle.xlA1,
missing, missing));
sb.AppendFormat("Relative rows: {0}\n",
range1.get_Address(false, missing,
Excel.XlReferenceStyle.xlA1, missing, missing));
sb.AppendFormat("Row & Column Relative: {0}\n",
range1.get_Address(false, false,
Excel.XlReferenceStyle.xlA1, missing, missing));
sb.AppendFormat("External: {0}\n", range1.get_Address(
missing, missing, Excel.XlReferenceStyle.xlA1,
true, missing));
sb.AppendLine();
sb.AppendLine("R1C1-Style Addresses:");
sb.AppendFormat("Default: {0}\n", range1.get_Address(
missing, missing, Excel.XlReferenceStyle.xlR1C1,
missing, missing));
sb.AppendFormat("Row & Column Relative to C5: {0}\n",
range1.get_Address(false, false,
Excel.XlReferenceStyle.xlR1C1, missing,
this.get_Range("C5", missing)));
sb.AppendFormat("External: {0}", range1.get_Address(
missing, missing, Excel.XlReferenceStyle.xlR1C1,
true, missing));
MessageBox.Show(sb.ToString());
}
接纳运算符方法成立新的限量
咱俩谈论了足以在地方字符串中采纳的多少个“运算符”,包涵联合运算符(逗号)和交集运算符(空格)。
您还足以透过Application.Union和Application.Intersection方法应用这几个操作符。
也能够经过应用get_Offset方法取叁个限量并获得2个与之相距一些行和列的新范围。
该办法应用行和列值来偏移给定范围并重回新的偏移范围。
所以在图5-8的演示范围中调用get_Offset(5,5)再次回到三个如此的A1体制地址的限制:
"$F$20:$K$33,$M$8:$O$14,$Q$6"
清单5-29体现了动用那么些运算符的演示。
请注意,联合和交点要求过多可选参数,允许你共同或相交多于多少个范围。
清单5-29 使用Union,Intersection和get_Offset的VSTO自定义
private void Sheet1_Startup(object sender, System.EventArgs e)
{
Excel.Application app = this.Application;
Excel.Range range1 = this.get_Range("$A$15:$F$28", missing);
Excel.Range range2 = this.get_Range("$H$3:$J$9", missing);
Excel.Range range3 = this.get_Range("$L$1", missing);
Excel.Range range4 = this.get_Range("$A$11:$G$30", missing);
Excel.Range rangeUnion = app.Union(range1, range2,
range3, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing);
Excel.Range rangeIntersection = app.Intersect(range1,
range4, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing);
Excel.Range rangeOffset = rangeUnion.get_Offset(5, 5);
MessageBox.Show(String.Format("Union: {0}",
rangeUnion.get_Address(missing, missing,
Excel.XlReferenceStyle.xlA1, missing, missing)));
MessageBox.Show(String.Format("Intersection: {0}",
rangeIntersection.get_Address(missing, missing,
Excel.XlReferenceStyle.xlA1, missing, missing)));
MessageBox.Show(String.Format("Offset: {0}",
rangeOffset.get_Address(missing, missing,
Excel.XlReferenceStyle.xlA1, missing, missing)));
}
使用Area
当3个限制内设有七个不接二连三的单元格范围时,每个不接二连三的限定称为一个区域。
假使Range中有八个不再三再四的区域,请使用Areas属性通过Areas集合访问每个地方(作为Range)。
Areas集合具有三个Areas.Count属性和三个Areas.get_Item方法,它将二个意味着依照1的目录的int参数作为数组。
清单5-30显得了三个迭代示例范围(有七个区域)并打印各个地方的地方的以身作则。
清单5-30 适用于区域的VSTO定制
private void Sheet1_Startup(object sender, System.EventArgs e)
{
Excel.Range range1 = this.get_Range(
"$A$15:$F$28,$H$3:$J$9,$L$1", missing);
MessageBox.Show(String.Format("There are {0} areas",
range1.Areas.Count));
foreach (Excel.Range area in range1.Areas)
{
MessageBox.Show(String.Format("Area address is {0}",
area.get_Address(missing, missing,
Excel.XlReferenceStyle.xlA1, missing, missing)));
}
}
使用Cells
Count属性重返给定范围内的单元格数。
您能够选取get_Item方法获得范围内的一定单元格范围。
get_Item方法接受所需的行索引和可选的列索引。
当范围是单元格的一维数组时,能够总结列索引,因为在这种景况下,它唯有一列或一列的单元格,所以称为RowIndex的参数真的像数组索引一样。
若是限制有五个区域,则必须首先取得要处理的区域,get_Item只会回到单元格的界定中的第②个区域。
清单5-31显得了动用get_Item的示例。
清单5-31 使用get_Item的VSTO自定义
private void Sheet1_Startup(object sender, System.EventArgs e)
{
Excel.Range range1 = this.get_Range("$A$15:$F$28", missing);
int rowCount = range1.Rows.Count;
int columnCount = range1.Columns.Count;
for (int i = 1; i <= rowCount; i++)
{
for (int j = 1; j <= columnCount; j++)
{
Excel.Range cell = range1.get_Item(i, j) as Excel.Range;
string address = cell.get_Address(missing,
missing, Excel.XlReferenceStyle.xlA1,
missing, missing);
cell.Value2 = String.Format("get_Item({0},{1})", i, j);
}
}
}
使用rows和columns
给定三个Range对象,您可以行使Row和Column属性来显著其首先个区域的左上角的行和列号。行和列号作为int值重临。
你还能运用“行”和“列”属性来分明第二个区域中的行和列的总额。那几个属性再次来到特殊范围,您可以将其视为对应于与限定相关联的行或列标题。当我们从图5-第88中学的示例范围得到Rows.Count时,它回到14,Columns.Count重临6.那是有道理的,因为大家挑选的首先个区域(A15:F28)跨越6列和14行。
要拿走第三个区域右下角的行和列地方,能够应用清单5-32所示的相当为难的表达式。清单5-32还证实了利用get_Item,它使用行和列索引(相对于给定范围的顶部),并赶回该行和列索引处的单元格(作为限制)。当您收获三个Rows或Columns范围时,那一个限制是一维的,在那种情状下,称为RowIndex的参数像数组索引一样。
清单5-32 获取行和列地方的VSTO自定义
private void Sheet1_Startup(object sender, System.EventArgs e)
{
Excel.Range range1 = this.get_Range(
"$A$15:$F$28,$H$3:$J$9,$L$1", missing);
Excel.Range area = range1.Areas.get_Item(1);
int topLeftColumn = area.Column;
int topLeftRow = area.Row;
int bottomRightColumn = ((Excel.Range)area.Columns.
get_Item(area.Columns.Count, missing)).Column;
int bottomRightRow = ((Excel.Range)area.Rows.
get_Item(area.Rows.Count, missing)).Row;
MessageBox.Show(String.Format(
"Area Top Left Column {0} and Row {1}",
topLeftColumn, topLeftRow));
MessageBox.Show(String.Format(
"Area Bottom Right Column {0} and Row {1}",
bottomRightColumn, bottomRightRow));
MessageBox.Show(String.Format(
"Total Rows in Area = {0}", area.Rows));
MessageBox.Show(String.Format(
"Total Columns in Area = {0}", area.Columns));
}
使用regions
CurrentRegion属性再次来到三个限制,该限量将扩充为含有全体单元格,直到空白行和空白列。这么些扩充的限制被称为叁个区域。所以,例如,你或然有2个限制,它含有一个报表中的多少个单元格,以得到包蕴整体表格的范围(假如该表由空白的行和列组成),您将运用较小范围的CurrentRegion属性重返整个案子
get_End方法是对与Range相关联的区域起功用的办法。
get_End方法接受XlDirection枚举的积极分子:xlDown,xlUp,xlToLeft或xlToRight。当xlUp传递的不二法门再次回到与Range范围左上角的单元格相同的列中的最上边的单元格。当通过xlDown时,它回到与Range的左上角单元格相同的列中的最下边包车型大巴单元格。当通过xlToLeft时,它回到与Range的左上角单元格相同行中的最左边的单元格。当通过xlToRight时,它将赶回与Range的左上角单元格相同行中的最右侧的单元格。
选择Range
您可以应用范围上的抉择方式使范围当前增选。记住,拨打选拔会转移用户的此时此刻挑选,那不是一件很好的事务,没有很好的理由。但是,在一些情状下,您愿意将用户的注意力吸引到有些意况下,在选择范围的图景下得以做到那或多或少。
编辑Range的值
一般而言使用二种格局来赢得和装置限定内的值。第③种方法是运用get_Value和set_Value方法。第二种艺术是使用品质Value2。
Value2和get_Value的分别在于,Value2属性再次回到的成分是货币或日期作为双重值。而且,get_Value也接受XlRangeValueDataType类型的可选参数。倘若你传递XlRangeValueData.xlRangeValueDefault,您将回到1个意味单个单元格范围单元格值的靶子。对于Value2和get_Value,假使Range包括八个单元格,则将再次回到与Range中单元格相对应的对象数组。
清单5-33出示了采纳Value2的多少个示范,包罗将值数组传递给Value2的以身作则。通过数组1次设置限制内的单元格的值比通过多个调用单独设置每一种单元格更实用。
清单5-33 使用Value2的VSTO定制
private void Sheet1_Startup(object sender, System.EventArgs e)
{
Excel.Range range1 = this.get_Range("$A$15:$F$28", missing);
range1.Value2 = "Test";
int rowCount = range1.Rows.Count;
int columnCount = range1.Columns.Count;
object[,] array = new object[rowCount, columnCount];
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < columnCount; j++)
{
array[i, j] = i * j;
}
}
range1.Value2 = array;
}
复制,清除和删除Range
Excel提供了部分复制,清除和删除范围的不二法门。复制方法应用Destination参数,您可以传递复制范围的目的地。
Clear方法清除限制内的单元格的内容和格式。
ClearContents只清除限制内单元格的值,而ClearFormats仅清除格式。删除方法删除单元格的限制,并作为参数移动单元格替换已去除的单元格的大势。该方向作为XlDeleteShiftDirection枚举的分子传递:xlShiftToLeft或xlShiftUp。
在Range内查找文本
Find方法允许你寻找范围中的文本,并赶回范围内的单元格,在那之中找到文本。查找方法对应于查找和替换对话框,如图5-9所示。假使在调用Find方法时大约参数,它将动用上次接纳Find对话框时用户设置的任何设置。此外,当您钦定参数时,钦定的安装将在下次用户打开时显得在“查找”对话框中。
图5-9 查找和替换对话框
Find方法应用表5-1第88中学描述的多如牛毛参数。
Find再次回到一个Range对象,假若它成功,假使找不到别的东西,则赶回null。
您能够行使FindNext方法找到与你的检索条件同盟的下一个单元格。
FindNext要求三个可选的After参数,您必要传递上3个找到的限定,以确认保证您不会再一次找到同样的单元格。
清单5-34显示了运用Find和FindNext方法的言传身教,个中我们摸索包含字符“2”的其余单元格,并加粗这一个单元格。
表5-18 查找方法的参数
Parameter Name |
Type |
What It Does |
---|---|---|
What |
|
Pass the data to search for as a required |
After |
|
Pass a single cell after which you want the search to begin as a Range. The default is the top-left cell if this omitted. |
LookIn |
|
Pass the type to search. |
LookAt |
|
Pass |
SearchOrder |
|
Pass |
SearchDirection |
|
Pass |
MatchCase |
|
Pass |
MatchByte |
|
Pass |
SearchFormat |
|
Set to |
清单5-34 使用Find和FindNext的VSTO定制
private void Sheet1_Startup(object sender, System.EventArgs e)
{
Excel.Range range1 = this.get_Range("$A$15:$F$28", missing);
int rowCount = range1.Rows.Count;
int columnCount = range1.Columns.Count;
object[,] array = new object[rowCount, columnCount];
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < columnCount; j++)
{
array[i, j] = i * j;
}
}
range1.Value2 = array;
Excel.Range foundRange = range1.Find("2",
range1.get_Item(1, 1), missing,
Excel.XlLookAt.xlPart, missing,
Excel.XlSearchDirection.xlNext,
missing, missing, missing);
while (foundRange != null)
{
foundRange.Font.Bold = true;
foundRange = range1.FindNext(foundRange);
}
}
格式化一一日千里单元格
Excel提供了二种办法和性质来格式化一密密麻麻单元格。最有效的是NumberFormat属性,您能够将其设置为格式化与“格式化单元格”对话框的“自定义”类别中的字符串绝对应的字符串。例如,您能够将NumberFormat设置为“常规”,不安装一定的数字格式。将NumberFormat设置为m
/ d /
yyyy设置日期格式,0%将格式设置为百分比格式。当使用NumberFormat时,若是您正在构建控制台应用程序或加载项,请务必考虑本章前面包车型地铁“特殊Excel难点”一节中斟酌的区域设置难点,因为读取和设置此字符串或然会在差别的运转时造成难题语言环境。假若你在工作簿或模板项如今面使用VSTO代码,则无需担心语言环境难点。
Font属性再次来到一个Font对象,可用以将Font设置为各类大小和体制。清单5-34显示了用于加粗单元格字体的Font对象的演示。
Excel还同意你创造与工作簿相关联的体制,并将那么些样式应用于范围。您能够行使Workbook.Styles创造样式。清单5-35来得了创办样式并将其利用于Range的言传身教。
清单5-35 成立和应用样式的VSTO自定义
private void Sheet1_Startup(object sender, System.EventArgs e)
{
Excel.Range range1 = this.get_Range("$A$15:$F$28", missing);
range1.Value2 = "Hello";
Excel.Style style = Globals.ThisWorkbook.Styles.Add(
"My Style", missing);
style.Font.Bold = true;
style.Borders.LineStyle = Excel.XlLineStyle.xlDash;
style.Borders.ColorIndex = 3;
style.NumberFormat = "General";
range1.Style = "My Style";
}
特殊Excel问题
在.NET中使用Excel对象模型时,须要留意多少个万分的注意事项。
本节将检查八个最关键的情节:使用四个区域设置并使用Excel日期。
自动化可执行文件和COM加载项的Excel区域难题
当使用自动化可执行文件或COM加载项中的托管代码对Excel对象模型进行编制程序时,依据当下线程的区域设置,Excel方法和属性的表现恐怕会迥然分裂。
请注意,使用VSTO构建的文书档案消除方案前边的代码中不会油不过生此题材。
例如,假设要为范围设置公式并且位居斯洛伐克(Slovak)语区域设置中,则Excel供给您使用本地化的斯洛伐克(Slovak)语公式名称和格式:
sheet.get_Range("A1", Type.Missing).Formula = "=SOMME(3; 4)";
那种表现与独立于言语环境的化解方案背后的VBA和VSTO代码差异。
VBA和VSTO总是告诉Excel,该语言环境是United States罗马尼亚语(locale id 1033)。
在缓解方案中的VBA和VSTO代码中,与Excel实行交谈时,您不用考虑区域设置。
您能够编写制定此代码,并使其在法兰西共和国语言环境江苏中华工程集团作:
sheet.get_Range("A1", Type.Missing).Formula = "=SUM(3, 4)";
当托管代码调用到Excel对象模型中时,它会告知Excel它正值运转的区域安装(当前线程的区域安装),那将造成Excel期望您将以该区域设置的本地化格式提供公式和任何值。
Excel还将以该区域设置的本土化格式重临公式和别的值。
Excel期望本地化的字符串,例如日期格式,与Range关联的NumberFormat字符串,与NumberFormat字符串相关联的颜色名称和公式名称。
使用DateTime for Dates
作为3个例证,假诺你不考虑这几个题材,能够考虑下列代码:
sheet.get_Range("A1", Type.Missing).Value2 = "03/11/02";
该值也许由二〇〇一年二月3日,二〇〇一年7月四日,或二零零四年五月1日由Excel解释,具体取决于当前线程的区域安装。
对此日期,您有1个明显的解决格局。 不要将日期作为文字字符串传递给Excel。
相反,使用System.DateTime对象构建日期,并应用Date提姆e的ToOADate方法将其传递给Excel,如代码清单5-36所示。
ToOADate方法将DateTime转换为OLE自动化日期,这是Excel对象模型期望的日期格式。
清单5-36 适当地将日期传递给Excel的VSTO定制
private void Sheet1_Startup(object sender, System.EventArgs e)
{
Excel.Range range1 = this.get_Range("$A$1", missing);
// March 11, 2002
System.DateTime date = new System.DateTime(2002, 3, 11);
range1.Value2 = date.ToOADate();
}
将线程区域切换为英文和后退不引进
您也许会认为与安装或取得Range.NumberFormat和Range.Formula相关的标题标化解方案是保留线程的区域安装,一时半刻将线程的区域安装切换为英语(区域设置ID
1033),执行设置的代码或获得受区域安装影响的品质(如NumberFormat或Formula),然后切换回保存的区域设置。不提议选取此措施,因为它会影响不指望本地交流机的别的加载项。
请考虑以下示例。您的加载项正在法兰西机械上运营。您的加载项将区域设置切换来1033并设置公式值。另二个加载项是拍卖Change事件并展现叁个对话框。该对话框以英文而不是波兰语显示。由此,通过更改线程区域安装,您曾经济体改成了另叁个加载项的作为,并且一般是不行的Office公民。
选取反思来缓解地区难题
相见区域安装难题的COM加载项或自动化可执行文件的提出消除办法(访问受当前语言环境影响的性质(如NumberFormat或Formula属性)时)是透过反射访问那几个属性。反射使您可以钦定Excel的英文区域安装,并编写制定无论当前线程区域设置什么样的代码。清单5-37认证了什么选取反射来安装NumberFormat和Formula属性。
清单5-37 使用反思来消除Excel中的区域难题
static void Main(string[] args)
{
Excel.Application application = new Excel.Application();
application.Visible = true;
object missing = Type.Missing;
Excel.Workbook workbook = application.Workbooks.Add(missing);
Excel.Worksheet sheet = (Excel.Worksheet)workbook.Worksheets.Add(missing,
missing, missing, missing);
Excel.Range range1 = sheet.get_Range("$A$1", missing);
// Set Formula in English (US) using reflection
typeof(Excel.Range).InvokeMember("Formula",
System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.SetProperty,
null, range1,
new object[] {"=SUM(12, 34)" },
System.Globalization.CultureInfo.GetCultureInfo(1033));
// Set NumberFormat in English (US) using reflection
typeof(Excel.Range).InvokeMember("NumberFormat",
System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.SetProperty,
null, rangel,
new object[] {"General" },
System.Globalization.CultureInfo.GetCultureInfo(1033));
}
旧格式或无效的花色库错误
Excel语言环境难题愈加复杂化的第②个难点是,在将语言环境设置为非斯洛伐克语区域安装的电脑上的英文Excel安装中使用Excel对象模型时,恐怕会接到“旧格式或无效类型库”错误。
Excel正在程序文件\ Microsoft Office \ OFFICE11 \
1033中找到二个名为xllex.dll的文件,它找不到。化解此难点的章程是安装xllex.dll文件或安装Office的MUI语言包。您还能复制excel.exe,将其重命名为xllex.dll,并将其复制到1033索引。
VSTO和Excel语言环境难点
文书档案解决方案后的VSTO代码通过采纳位于您和Excel对象模型之间的透唐朝理对象来化解Excel区域安装难题。此代理总是告诉Excel,该语言环境是United States土耳其共和国(The Republic of Turkey)语(locale
id
1033),那使得地使VSTO匹配VBA行为。假如您在文书档案消除方案后边使用VSTO代码,则会为你化解Excel语言环境难点,您不要再进一步担心。假若您正在为Excel或自动化可执行文件构建托管COM加载项,则难题照旧存在。
VSTO对Excel语言环境难点的化解方案有一部分注意事项。
VSTO透南陈理可以稍微放慢代码的速度。它也会促成Excel对象在调节和测试器中反省时显得略有区别。最终,借使你使用Equals运算符将代理的Excel对象(如Application)与未使用的Application对象开展相比,则它们将不会被评估为相等。
假如要绕过一定对象的VSTO透北魏理,能够应用Microsoft.Office.Tools.Excel.ExcelLocale1033Proxy.Unwrap方法,并传递要绕过代理的Excel对象。此措施将去除代理并赶回原始的PIA对象,再度爆出你的区域安装难点。您还是能将VSTO项目标AssemblyInfo.cs文件中的程序集属性ExcelLocale1033安装为false,以便关闭全数Excel消除方案的透明清理。
一旦你导航到另3个PIA的目的,然后重新导航回Excel
PIA,则大概会丢掉透清朝理。例如,假如从Application.CommandBars集合中的Microsoft.Office.Core
PIA命名空间得到CommandBar对象,然后利用CommandBar.Application属性重回到Excel
Application对象,则今后已不见代理和区域安装难点会再度爆发。
最后,假使您从消除方案中的Word
VSTO代码制造了一个新的Excel实例,那么您一贯与Excel
PIA实行交谈,而从未透明的代办对象,并且区域安装难点将继承有效。
将Excel日期转换为Date提姆e
Excel能够以三种格式表示日期:一九零二格式或一九零四格式。
一九零五格式基于八个体系,当转换为贰个数字时,它表示从一九零一年五月十日起的已长逝的运气。1905格式是基于一个种类,当转换为二个数字时,它代表已过的天数自一九零二年七月31日起,一九〇三年格式由最初的Macintosh总结机引入,因为大家稍后描述的壹玖零壹格式的难题。您能够经过检查Workbook.Date一九零三属性来明显工作簿正在利用的格式,如若工作簿使用一九零四格式,则赶回true。
假诺Excel工作簿使用一九〇〇格式,并将日期从该工作簿转换为DateTime直接,则会博得错误的值。由于DateTime期望一九零五年的格式,由数字代表的Excel日期的值是1901年四月24日之后,而不是一九〇三年四月二二十2二十四日事先的经过天数,由此将关门4年和贰个闰年。因而,此代码即使您在工作簿中选取一九〇五格式,将会提交错误的日期时间。
object excelDate = myRange.get_value(Type.Missing);
DateTime possiblyBadDateIfExcelIsIn1904Mode = (DateTime)excelDate;
要拿走一九零四格式的日期为DateTime格式,您必须抬高1905格式日期4年和2个闰天(以弥补一九零三年在一九〇三年而不是一九零三年的0)。
所以,假诺你编写代码,并应用函数Convert-ExcelDateToDate在清单5-3第88中学,你将获取正确的结果,借使运用一九〇五日子系统。
object excelDate = myRange.get_value(Type.Missing);
DateTime goodDate = ConvertExcelDateToDate(excelDate);
清单5-38 将Excel日期转换为DateTime仁同一视新回到
static readonly DateTime march1st1900 = new DateTime(1900, 03, 01);
static readonly DateTime december31st1899 = new DateTime(1899, 12, 31);
static readonly DateTime january1st1904 = new DateTime(1904, 01, 01);
static readonly TimeSpan date1904adjustment = new TimeSpan(4 * 365 + 2, 0, 0,0, 0);
static readonly TimeSpan before1stMarchAdjustment = new TimeSpan(1, 0, 0, 0);
bool date1904 = ActiveWorkbook.Date1904;
object ConvertDateToExcelDate(DateTime date)
{
LanguageSettings languageSettings = Application.LanguageSettings;
int lcid = languageSettings.get_LanguageID(
MsoAppLanguageID.msoLanguageIDUI);
CultureInfo officeUICulture = new CultureInfo(lcid);
DateTimeFormatInfo dateFormatProvider = officeUICulture.
DateTimeFormat;
string dateFormat = dateFormatProvider.ShortDatePattern;
if (date1904)
{
if (date >= january1st1904)
return date - date1904adjustment;
else
return date.ToString(dateFormat, dateFormatProvider);
}
if (date >= march1st1900)
return date;
if (date < march1st1900 && date > december31st1899)
return date - before1stMarchAdjustment;
return date.ToString(dateFormat, dateFormatProvider);
}
DateTime ConvertExcelDateToDate(object excelDate)
{
DateTime date = (DateTime)excelDate;
if (date1904)
return date + date1904adjustment;
if (date < march1st1900)
return date + before1stMarchAdjustment;
return date;
}
清单5-38还对一九零一格式日期举行了校正。 事实申明,当Lotus
1-2-3写成时,程序员错误地觉得1904年是叁个闰年。
当Microsoft写Excel时,他们期待确认保证它们与现有的Lotus
1-2-3电子表格保持包容,使其能够总结自1899年1月二十七日以来的命局,而不是一九〇一年3月二16日。当DateTime为
写的,它的创造者没有准备回溯到1899年1月7日,它是从1901年三月14日开头猜想的。所以为了将1903年11月三日事先的一九零一年格式的Excel日期正确地转移成DateTime,你不可能不添加一天。
最后,Excel不可能表示一九零二年五月5日事先1900年格式的光阴,1904年四月四日事先的日子,以1902年格式。
由此,当你将DateTime转换为Excel日期时,必须传递三个字符串而不是意味date的数字,因为这几个日子无法在Excel中表示为日期(仅看成字符串)。
结论
本章研讨了Excel对象模型中的一些最重要的对象。
大家在连续章节的Excel示例中应用了过多那一个指标。
在第①1章“在Excel中利用XML”中,大家还考虑了部分用于在Excel中运用XML的其余Excel对象模型对象。
本章描述了由Excel的首要性互操作程序集定义的这个目标。
您应该小心到,VSTO扩大了这么些指标(Workbook,Worksheet,Range,Chart,ChartObject和ListObject),以添加一些外加作用,如数据绑定帮忙。
本书第②部分考察了这几个扩大。