威尼斯人线上娱乐

设置Excel条件格式,助你笑傲Excel江湖

4 4月 , 2019  

Excel中的条件格式成效是个要命强劲且便于的职能,通过对运用原则格式效用能够在极大程度上改革表格的宏图和可读性,用户能够内定单个只怕八个单元格区域使用一种只怕三种格式,如此一来,也在大大提升了报表的操作性。上边将介绍在C#编制程序中哪些来安装并应用Excel条件格式。

上壹篇作品中介绍了有关设置Excel条件格式,包罗基于单元格值、自定义公式等利用条件格式、应用数据条原则类型格式、删除条件格式等内容。在本篇小说上校继续介绍C#
设置规范格式的章程。

使用Range对象
Range对象表示电子表格中的单元格范围。范围能够分包三个单元格,多少个延续的单元格,甚至三个不总是的单元格。您能够在Excel中精选时按住Ctrl键选取多个不总是的单元格。

闲话Microsoft Excel

威尼斯人线上娱乐 1

叁大绝招,助你笑傲Excel江湖

从1九捌5年的首先款Excel(只用于Mac系统)诞生到现在,Microsoft
Excel已经314周岁,现时正当而立之年!功用最佳强大,但对周边使用者而言,Microsoft
Excel同时也十一分混乱。壹个人想要完全可行控制和行使Microsoft
Excel的富有机能的话,能够说是不容许做到的天职(Mission
Impossible!)。而实在对于多数人而言,日常活着和行事中能用到的和常用的效果实在并不多,而且尽管如此,Microsoft
Excel也早就帮我们很好地处理了好多任务了!

正所谓,“过犹不如”,大家并未有须求为了利用工具而使用工具,大家的目的是化解难点和姣好任务!(题外话:大家的指标是星辰大海~~)因而,我们并不须要精晓和左右Microsoft
Excel的持有有关文化,而只供给控制这么些大家有不能缺少精通的就足以了!

本篇小说就为大家介绍Microsoft
Excel中的二个越发实惠的功力和用法,希望能够使我们的办公生活有点轻松一些!(^_^)

以身作则要点概述:

  1. 依据单元格值应用条件格式

  2. 遵照自定义公式应用条件格式

  3. 利用数据条原则类型格式

  4. 删除条件格式

  4.1 删除钦点数量范围中的条件格式

  四.二 删除全部规格格式

要领概述:

  1. 运用条件格式用于高亮重复、唯1数值

  2. 选拔条件格式用于高亮峰值(最高、最低)

  3. 利用条件格式用于高亮低于、高于平均值的数值

 

赢得一定Cell或Cells范围对象
Excel提供了二种获取Range对象的点子。
Range对象是您要在Excel工作表中处理单元格或单元格范围时选择的指标。在Application对象的描述中涉及了三种获得Range对象的措施。
Application.ActiveCell在移动窗口中回到活动选用的左上角单元格。
Application.Selection重临三个表示活动窗口中活动选用的对象。假诺移动选择是单元格范围,则足以将Application.Selection转换为Range对象。倘使在活动窗口(例如形状或图表)中挑选了别样选项,Application.Selection将重临所选对象。

设置Excel条件格式,助你笑傲Excel江湖。1.SUMIFS:

SUM函数是MS Excel中最中央也最管用的函数之壹,相信我们已经已经用得烂熟了!它通过一个大概的公式就足以快捷增进大量的数量,节省了不少钟头的用指尖1个键三个键地敲计算器的年华。然则,SUM函数的通用性也正因为其简要而遭到制裁,由此我们要介绍的SUMIF(S)等函数该出场了!

假如你有3个石破天惊的行销数据表,个中囊括销售总额、商行、城市、售出产品和制品销售月份等指标:

威尼斯人线上娱乐 2

销售数据表

SUM函数能够很不难地抬高出总销售额,然而你的经理那时只想要纸巾的总销售额,怎么办吧?别担心,相当的粗略,大家利用SUMIF函数来总计:

威尼斯人线上娱乐 3

SUMIF函数

先是,设定筛选标准的检索范围(产品列),然后添加筛选标准(具体产品名),最终选取举行求和的值(筛选标准所对应的值)并丰裕。公式应该是那样的:

=SUMIF(D:D,”纸巾”,E:E)

*小指示:公式中有所的假名、标点、括号都以在英文输入法的半角状态下输入的。

解释一下:这些公式告诉Excel将E列中的与D列的基准“纸巾”相对应的兼具数据增加起来。

接下去,要是你的COO娘想要东京的办公椅的总销量,而且还倘使由你的同事赵6负责的(固然第一影响是,“又不是自家肩负的,干嘛让本人来总结”。但人家终归是高管娘,又怎么好意思怼回去吗?),那又该怎么处理吧?挠头,觉得不容许?放心,有SUMIFS在,没什么不恐怕!(Nothing
is Impossible!不好意思,广告看太多了。)

逆天的SUMIFS函数允许你使用多少个原则,就也正是是抓实版的SUMIF:

威尼斯人线上娱乐 4

SUMIFS函数

在SUMIF的末端扩张一个S,就如葡萄牙共和国(República Portuguesa)语里的单数、复数方式吗!微软真是会造词啊!

这一回,从需供给和的值初始,稳步丰裕每种要求的筛选标准。最后结果应该是如此的:

=SUMIFS(E:E,A:A,”4″,B:B,”赵六”,C:C,”上海”,D:D,”办公椅”)

*小提醒:公式中存有的假名、标点、括号都以在英文输入法的半角状态下输入的。

解释一下:不难地说,便是报告MS
Excel,首先哪些列里有大家须求的数据,然后依据筛选标准筛选出确切的值,最后求和。只但是,条件多了一点点!

*小提醒:SUMIF和SUMIFS的括号里,搜索范围、筛选标准的种种是不平等的哦!

当然啦,大家也得以行使其它1种MS
Excel中同样既简便易行又功用强大的工具:数据透视表来获得依照那几个筛选标准所分离出来的享有数据的全体视图。可是,SUMIFS函数也有其卓殊优点,它能够挑选和过滤掉大数额汇总的数据,而并不需求处理全部的相关或不相干的数量。

使用工具

  • Free Spire.XLS for .NET
    8.3(免费版)
  • Visual Studio

 

利用工具:

  • Spire.XLS for
    .NET

注:在编写代码时只顾在先后中加上引用Spire.Xls.dll,dll文件可在装置路径下的Bin文件夹中收获。

威尼斯人线上娱乐 5

工作表还提供了二种得到Range对象的办法。
Worksheet.get_Range方法是从工作表获取Range对象的最常用方法。此方式接收能够传递字符串的须要对象参数。它拥有能够传递第四个字符串的第二个可选参数。您传递的字符串是所谓的A一体裁参考格式。解释A壹样式参考格式的最简易的章程是付出多少个例证。

2.Find/Mid:

Find/Mid函数组合为作者在MS
Excel中节省的时日,可能是装有函数中最多的。它(们)是能够从单元格中领到文本块的个别多少个Excel函数之一。甚至足以说它(们)是最有效的函数,因为能够操作它(们)跨越数千个单元格而享有相同的公式。

以身作则代码(供参考)

测试文书档案如下:

威尼斯人线上娱乐 6

C#代码示例(供参考)

参考A1内定A列一行的单元格。参考D2二点名D列2二行的单元格。参考AA1一钦点行1一,列AA(第17列)处的单元格。

MID:

威尼斯人线上娱乐 7

MID函数

MS Excel 201陆中,Mid函数的定义是:MID
重临文本字符串中从内定地方上马的一定数目标字符,该多少由用户钦赐。

像Left和Right函数一样,Mid函数也得以从单元格中领到文本。首先,引用单元格从中提取文本。然后,再次回到从内定地方上马的急需多少的字符。例如:

威尼斯人线上娱乐 8

MID函数用法示例

经过动用Mid函数,Excel将引用单元格D一(MS Excel functions are so amazing
cool),找到第二伍个字符,然后从10分地点上马向后,再次回到前10个字符。
很简单吗!

*小提醒:再次回到结果是从第十七个字符初阶的,即将第二5个字符作为重返值的第3个,然后向右数一、2、3…十,再次回到总括10个字符。

【示例 一 】应用条件格式

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");
        }
    }
}

调剂运转程序,生成文档,如下:

威尼斯人线上娱乐 9

【示例 壹】应用条件格式用于高亮重复、唯一数值

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");
        }
    }
}

达成代码后,调节和测试运营程序,生成文书档案,如下图:

 威尼斯人线上娱乐 10

参考$ A $
1也指的是第2行列A中的单元格。即使在A一体制引用中接纳$符号,则它们将被忽视。

FIND:

威尼斯人线上娱乐 11

FIND函数

MS Excel 201陆中,Find函数的定义如下:函数
FIND用于在其次个文本串中平昔第一个文本串,并再次来到首个文本串的起第2位置的值,该值从第三个公文串的第三个字符算起。

读起来有个别生硬是或不是?其实极粗略。Find函数将在单元格中找到一个字符串,并重临第1个字符的地方数。大家用相同的数额来比喻:

威尼斯人线上娱乐 12

FIND函数用法示例

“are” 在单元格D壹里是从第二0个字符起始的。

专注1:若是给定单元格中的文本字符串不是绝无仅有的,那么Excel将重回文本字符串中找到的率先个实例。比如,=FIND(“c”,D一)获得的结果是三,而忽视掉其余的。

只顾2:Find函数区分轻重缓急写,所以假设使用”Are”而不是”are”的话,结果将回来错误。

那么现在让大家选拔上面包车型大巴例证来对FIND/MID的组成使用实行认证呢!

率先,比如有3个网站:ttp://www.gamersky.com/news/201612/843064.shtml 
(申明1:举这么些网站为例未有别的企图,只是因为刚刚作者打开了那几个网页在看新闻。)
(注脚贰:特意删除掉了第壹个字母h,实际演示的Excel文书档案中是局地。)

假诺你必要从那几个网址中领到页面ID号(在本例中为84306四)。
数字从第2八个字符开头,因而你能够运用= Mid(单元格,三柒,6)再次回到ID号。

威尼斯人线上娱乐 13

FIND_MID组合用法示例

MS
Excel的函数之所以强大,就在于函数能够互为组合使用。上面的例子中,=MID(A1,三7,陆)中的初步地方三柒是怎么得到的吧?有人说,大家得以3个3个从左到右数过去啊。也有人说,假设网站十分长那岂不是要累死,而且难免不会数错!说的对,所以大家就把数数的干活付出强大的Excel去做,大家等它的结果就足以了。让大家把地方的公式稍微改变一下:

=MID(A1,FIND(“shtml”,A1)-7,6)

大家观望到,ID号有8个人数,并且是从处于最左边的旷世的shtml字符串的左手第八个字符起初的,所以大家就把原先的公式改造成了上边的指南。那下不用大家多少个字符二个字符地数了吧?

MID和FIND的构成能够抒发出了不起的效益,给我们处理数量推动Infiniti的福利。具体的例子那里就不多列举了,咱们先品尝起来呢!须知,“眼过千遍,不及手过二回”!

【示例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");  
        }
    }
}

测试结果:

威尼斯人线上娱乐 14

【示例二】应用条件格式用于高亮峰值(最高、最低)

 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");
        }
    }
}

测试结果:

 威尼斯人线上娱乐 15

 

 

您能够利用限制运算符(:)来钦赐单元格范围,当中第二个A壹体制引用是限制的左上角,后跟2个冒号运算符,之后是右下角的第一个A一样式引用的限定。参考A1:B一指的是行一,列A和列一,列B的四个单元格。参考A一:AA1壹是指块中的全数2玖拾柒个单元格,其左上角位于第三列,第A列和下侧右角位于第二一列,AA栏(第1七列)。

叁.LEN函数+条件格式

咱俩平时索要写一些事物,但因为有字数限制,所以创作的经过并不都以那么热情洋溢——平时一相当大心字数就跨越限定了。那么借助于MS
Excel大家能够有法子提示本人小心呢?

答案是早晚的。大家只需利用LEN函数和“条件格式”就能够很好地拓展字符限制跟踪提醒了!

MS Excel 201⑥中,Len函数的概念:LEN 再次回到文本字符串中的字符个数。

很不难懂啊!LEN函数相当不难——只回去给定单元格中的字符数。我们依旧来看例子吗!

威尼斯人线上娱乐 16

LEN函数用法示例

观察地点那张图纸了啊?都以自己发过的今日头条(嘻嘻)。假若本身须求您总结每种单元格的字符数,然后告诉自身那多少个单元格里抢先了七十个字(符),你会不会想打自身?(作者躲~~)

再想象一下就算未来累计有三千个这么的单元格,你又如何高效准确地认清哪些超出了字数限制,哪些没超越呢?

可以吗,让本身来演示一下呢。首先大家选中B列,然后点击“开首”选项卡里面包车型地铁“条件格式”,在弹出的选项中选拔“杰出呈现单元格规则”之“大于…”

威尼斯人线上娱乐 17

LEN函数用法示例2

随即,输入大家的单元格字符数限制数值:(那里以70为例)

威尼斯人线上娱乐 18

LEN函数用法示例三

如上海教室所示,点击“鲜明”后,在B一单元格里输入LEN函数并援引文本单元格:

=LEN(A1)

威尼斯人线上娱乐 19

LEN函数用法示例4

把鼠标放在B一单元格的右下角,变成十字后,按下鼠标左键,鼠标向下拖动,公式就被自动复制下去了:

威尼斯人线上娱乐 20

LEN函数用法示例5

“条件格式”里的限定标准“大于”也足以被变更为别的的基准选用,那统统在于你的求实处理必要。因而,条件格式是丰裕管用的,而且将它与其它职能整合在同步的话更是将大家的业务处理能力加强到了三个新的层系,尤其是在处理具体的多少内容时!

【示例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");
        }
    }
}

 删除效果

  1. 去除内定数量范围的规则格式

威尼斯人线上娱乐 21

  1. 删除全体口径格式

威尼斯人线上娱乐 22

此番关于“C# 应用条件格式到Excel”的演示方法介绍到此。

如需转发,请申明出处。

 

【示例三】应用条件格式用于高亮低于、高于平均值的数值

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");
        }
    }
}

测试结果:

 威尼斯人线上娱乐 23

 

上述内容是这次关于设置Excel表格条件格式的补给介绍,如需转载,请注解出处。

(本文完)

您能够接纳联合运算符(,)来内定恐怕是不三番五次的多少个单元格。例如,参考A一,C4点名了第四个单元格位于第3列,第A列,第四个单元格位于第四列第C列的四个单元格的限制。用户能够经过按住Ctrl键来采用单元格的不延续范围因为他俩挑选种种细胞。参考A一,C肆,C捌,C10是点名五个例外单元格的另一个灵光的A一体裁参考。

结语

虽说本篇文章并从未为你提供Microsoft
Excel当中全部与你或你的事务有关的剧情,但自身确实希望能够为你提供1些更高级别的应用范例和选用。作者深信不疑,通晓和左右了那个用法之后,应该能够为你或你的作业节省下许多华贵的时间,并提供更好的数额观望和分析参考。

交点运算符(1个空格)能够钦点单元格的插花。例如,参考A1:A10A伍:A一5解析为从行5,列A开端并以行A,列A开端的交接四个单元。参考A一:A十A五:A一伍 A5诠释为第六行的单个单元格,列A.

您还是能够利用你在A一样式参考中在劳作表中定义的任何名称。例如,借使您定义了指向单元格A1的名叫foo的名目范围。使用你的名号的壹对实用的A一体裁的引用将包罗foo:A2,其引用行一,列A和行二,列A的单元格。引用foo,A伍:A陆是指第一行,第A列;第陆行,A列;和第陆列,列A。

如前所述,get_Range方法应用第三个可选参数,您能够传递第二个A一体裁的引用字符串。使用限制运算符有效地组合率先个参数和第三个参数。因而,当调用get_Range(“A1”,“A2”)时,get_Range再次回到的限制等同于调用get_Range(“A一:A二”,Type.Missing)时得到的界定。

获取Range对象的第三种办法是行使Worksheet.Cells属性,该属性重临工作表中全数单元格的界定。然后,您能够在回到的Range对象上应用同一的get_Range方法,并以与行使Worksheet对象中的get_Range相同的章程传递A壹体裁引用以选用单元格。所以Cells.get_Range(“A1:A2”,Type.Missing)等价于get_Range(“A1:A二”,Type.Missing)。使用Cells属性的更常见的用法是将其与Range的get_Item属性结合使用,该属性将选择行索引和可选的列索引。使用get_Item是一种在不行使A一样式引用的境况下访问特定单元格的方式。所以Cells.get_Item(1,1)相当于get_Range(“A1”,Type.Missing)。

收获Range对象的另1种方法是应用Worksheet.Rows或Worksheet.Columns属性。那一个再次来到一个与别的Range对象不相同的限量。例如,若是您使用Column重返的限定并展示范围内的单元格数,则赶回25陆列数。不过只要您在回去的限制内调用Select方法,Excel将在做事表中精选具有1陆,77二,贰16个单元格。思量Rows和Columns重回的范围的最简便的主意是它们的一举一动与列和行标题在Excel中的行为相似。

清单5-二柒展现了采纳get_威尼斯人线上娱乐,Range方法和Cells,Rows和Columns属性的多少个示范。大家选择范围的Value贰属性将限量中的各类单元格设置为钦点的字符串值。程序的周转结果如图五-柒所示

清单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-27

威尼斯人线上娱乐 24

使用Address
给定叁个Range对象,你常常索要鲜明它所指的单元格。
get_Address方法重回A一样式或Tiggo壹C一样式范围的地点。
您曾经领会了A一体裁的引用。
Sportage壹C1体裁的引用支持与A一样式引用(范围为冒号,联合逗号和陆续空间)斟酌的有着同1的运算符。
LX570一C壹样式的引用分别以CR-V和C开端的行和列号。
所以GL450一C一作风的单元格PASSAT将是LAND4C一。
图5-捌来得了我们在本节中思量的多少个地点的界定。

图伍-八  具有多少个不总是区域的限制

 威尼斯人线上娱乐 25

图五-第88中学范围的地点以A一体制和R1C壹样式出示:

$A$15:$F$28,$H$3:$J$9,$L$1
R15C1:R28C6,R3C8:R9C10,R1C12

获取地址的另二个精选是收获外部引用仍然地方引用。
我们早已在图伍-第88中学展现的地方是本土引用。
外部引用包含限制所在的工作簿和工作表的名号。
在图5-第88中学,与A壹风格和CRUISER①C1品格的外表参考同样。

 

[Book1]Sheet1!$A$15:$F$28,$H$3:$J$9,$L$1
[Book1]Sheet1!R15C1:R28C6,R3C8:R9C10,R1C12

对此我们的演示,我们创建的限制的工作簿未保存。
当大家将它保存为Book一.xls时,地址如下所示:

[Book1.xls]Sheet1!$A$15:$F$28,$H$3:$J$9,$L$1
[Book1.xls]Sheet1!R15C1:R28C6,R3C8:R9C10,R1C12

赢得地址的另3个采取是采纳绝对化地址依旧选用相对地址。
大家早就思量过的地方是相对的。
相对格式(相对于单元格A一)的同样地方如下所示:

R[14]C:R[27]C[5],R[2]C[7]:R[8]C[9],RC[11]
A15:F28,H3:J9,L1

对于奥迪Q7一C壹样式的地方,您还足以内定希望地点相对的单元格。
假如大家在图伍-四中相对于单元格B二收获了猎豹CS6一C一样式,大家赢得以下结果:

R[13]C[-1]:R[26]C[4],R[1]C[6]:R[7]C[8],R[-1]C[10]

get_Address方法运用三个可选参数来控制引用的回到格局,如表5-壹柒所示。

表5-17   get_Address的可选参数

Parameter Name

Type

What It Does

RowAbsolute

object

通过TRue将地址的行部分作为绝对引用返回($ A $ 1)。 如果您传递false,行参考将不会是绝对的($ A1)。 默认值为true。

ColumnAbsolute

object

通过TRue将地址的列部分作为绝对引用返回($ A $ 1)。 如果你传递错误,列参考将不是绝对的(A $ 1)。 默认值为true。

ReferenceStyle

XlReferenceStyle

通过xlA1返回A1样式的引用。 通过xlR1C1返回R1C1样式的引用。

External

object

传递真的返回外部引用。 默认值为false。

RelativeTo

object

传递一个表示您希望R1C1样式引用相对于单元格的Range对象。 与A1样式引用一起使用时不起作用。

 

清单伍-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个与之相距1些行和列的新范围。
该办法运用行和列值来偏移给定范围并重临新的舞狮范围。
所以在图五-8的演示范围中调用get_Offset(五,五)重临2个如此的A壹体制地址的限量:

"$F$20:$K$33,$M$8:$O$14,$Q$6"

清单伍-2九出示了选拔那些运算符的示范。
请注意,联合和交点供给多多可选参数,允许你壹起或相交多于多少个范围。

清单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
当三个范围内设有多少个不三番五次的单元格范围时,每一个不一连的界定称为一个区域。
假诺Range中有四个不一而再的区域,请使用Areas属性通过Areas集合访问每个区域(作为Range)。
Areas集合具有2个Areas.Count属性和三个Areas.get_Item方法,它将多个代表依据一的目录的int参数作为数组。
清单伍-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方法接受所需的行索引和可选的列索引。
当范围是单元格的1维数组时,能够简简单单列索引,因为在这种景观下,它只有一列或1列的单元格,所以称为RowIndex的参数真的像数组索引一样。
倘使限制有四个区域,则必须首先获得要处理的区域,get_Item只会重临单元格的范围中的第多少个区域。

清单五-3一显得了选择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
给定3个Range对象,您能够选拔Row和Column属性来规定其首先个区域的左上角的行和列号。行和列号作为int值重临。

您仍能使用“行”和“列”属性来明确第贰个区域中的行和列的总数。那几个属性重回特殊范围,您能够将其视为对应于与范围相关联的行或列标题。当大家从图5-第88中学的示例范围得到Rows.Count时,它回到1四,Columns.Count重返六.那是有道理的,因为大家选拔的首先个区域(A一5:F2捌)跨越6列和1四行。

要博取第3个区域右下角的行和列地点,能够动用清单5-32所示的一对1为难的表达式。清单5-3贰还注脚了使用get_Item,它使用行和列索引(相对于给定范围的顶部),并赶回该行和列索引处的单元格(作为限制)。当你收获多少个Rows或Columns范围时,那一个限制是壹维的,在那种意况下,称为RowIndex的参数像数组索引一样。

清单五-3贰  获取行和列地点的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属性再次来到一个范围,该限量将扩展为带有全数单元格,直到空白行和空白列。那些扩大的限定被号称多个区域。所以,例如,你恐怕有3个限制,它涵盖贰个表格中的几个单元格,以赢得包罗全部表格的限量(假使该表由空白的行和列组成),您将选取较小范围的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方法。第两种办法是运用性质Value贰。
Value二和get_Value的差异在于,Value二属性再次回到的因素是货币或日期作为双重值。而且,get_Value也经受XlRangeValueDataType类型的可选参数。假诺您传递XlRangeValueData.xlRangeValueDefault,您将重回三个意味着单个单元格范围单元格值的指标。对于Value二和get_Value,倘诺Range包蕴八个单元格,则将赶回与Range中单元格相对应的目的数组。

清单⑤-3三显示了运用Value2的多少个示范,包含将值数组传递给Value二的以身作则。通过数组一次设置限制内的单元格的值比通过三个调用单独设置各样单元格更有效。

清单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方法允许你寻找范围中的文本,并回到范围内的单元格,当中找到文本。查找方法对应于查找和替换对话框,如图五-玖所示。假使在调用Find方法时差不多参数,它将动用上次应用Find对话框时用户安装的别的设置。其它,当您钦赐参数时,钦命的设置将在下次用户打开时展现在“查找”对话框中。

图伍-玖  查找和替换对话框

威尼斯人线上娱乐 26

Find方法应用表5-1第88中学讲述的成都百货上千参数。
Find再次来到贰个Range对象,假设它成功,假设找不到别的事物,则赶回null。
您能够行使FindNext方法找到与你的查找条件合作的下2个单元格。
FindNext须要1个可选的After参数,您须求传递上二个找到的限定,以确定保证您不会再三回找到同样的单元格。
清单伍-34出示了使用Find和FindNext方法的言传身教,个中大家探寻包蕴字符“二”的其余单元格,并加粗这几个单元格。

表伍-18  查找方法的参数

 

Parameter Name

Type

What It Does

What

object

Pass the data to search for as a required string.

After

object

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

object

Pass the type to search.

LookAt

XlLookAt

Pass xlWhole to match the whole cell contents, xlPart to match parts of the cell contents.

SearchOrder

XlSearchOrder

Pass xlByRows to search by rows, xlByColumns to search by columns.

SearchDirection

XlSearch-Direction

Pass xlNext to search forward, xlPrevious to search backward.

MatchCase

object

Pass true to match case.

MatchByte

object

Pass true to have double-byte characters match only double-byte characters.

SearchFormat

object

Set to true if you want the search to respect the FindFormat options. You can change the FindFormat options by using the Application.FindFormat.

 

 清单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);
  }
}

格式化1体系单元格
Excel提供了两种方法和属性来格式化一系列单元格。最可行的是NumberFormat属性,您能够将其安装为格式化与“格式化单元格”对话框的“自定义”系列中的字符串相呼应的字符串。例如,您能够将NumberFormat设置为“常规”,不设置一定的数字格式。将NumberFormat设置为m
/ d /
yyyy设置日期格式,0%将格式设置为百分比格式。当使用NumberFormat时,假诺你正在营造控制台应用程序或加载项,请务必考虑本章前面包车型客车“特殊Excel难题”一节中探讨的区域设置难题,因为读取和安装此字符串恐怕会在不一致的运行时造成难题语言环境。就算您在工作簿或模板项近年来面使用VSTO代码,则无需担心语言环境难题。

Font属性重临1个Font对象,可用以将Font设置为各个大小和体裁。清单5-34显得了用于加粗单元格字体的Font对象的以身作则。

Excel还允许你创造与工作簿相关联的体制,并将这么些样式应用于范围。您能够运用Workbook.Styles制造样式。清单5-35彰显了创办样式并将其应用于Range的言传身教。

清单五-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创设的文档化解方案后边的代码中不会出现此难题。
例如,倘若要为范围设置公式并且位居匈牙利(Hungary)语区域安装中,则Excel需要您使用本地化的罗马尼亚(România)语公式名称和格式:

 

sheet.get_Range("A1", Type.Missing).Formula = "=SOMME(3; 4)";

那种作为与单身于言语环境的缓解方案背后的VBA和VSTO代码区别。
VBA和VSTO总是告诉Excel,该语言环境是美越语(locale id 十3三)。
在消除方案中的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";

该值大概由二零零二年11月二三十一日,二〇〇四年四月30日,或200三年十一月二十七日由Excel解释,具体取决于当前线程的区域设置。

对于日期,您有3个显然的缓解办法。 不要将日期作为文字字符串传递给Excel。
相反,使用System.DateTime对象创设日期,并选用DateTime的ToOADate方法将其传递给Excel,如代码清单5-3六所示。
ToOADate方法将DateTime转换为OLE自动化日期,那是Excel对象模型期望的日期格式。

清单5-3陆  适本地将日期传递给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
103三),执行设置的代码或获得受区域安装影响的属性(如NumberFormat或Formula),然后切换回保存的区域安装。不提议选取此方式,因为它会影响不指望本地交流机的其余加载项。

请思考以下示例。您的加载项正在法兰西机械上运转。您的加载项将区域安装切换来拾3叁并设置公式值。另3个加载项是拍卖Change事件并出示叁个对话框。该对话框以英文而不是保加拉斯维加斯语突显。因而,通过更改线程区域设置,您已经转移了另1个加载项的作为,并且一般是不良的Office公民。

使用反思来化解地方难点
欣逢区域安装难题的COM加载项或自动化可执行文件的建议化解办法(访问受当前语言环境影响的性子(如NumberFormat或Formula属性)时)是由此反射访问这一个属性。反射使你能够指定Excel的英文区域设置,并编写无论当前线程区域安装哪些的代码。清单伍-3七证实了怎么运用反射来安装NumberFormat和Formula属性。

清单五-叁7 使用反思来消除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 \
⑩33中找到三个名叫xllex.dll的文书,它找不到。消除此难题的章程是安装xllex.dll文件或安装Office的MUI语言包。您还足以复制excel.exe,将其重命名字为xllex.dll,并将其复制到十3三索引。

VSTO和Excel语言环境难点
文档解决方案后的VSTO代码通过行使位于您和Excel对象模型之间的透汉朝理对象来解决Excel区域设置难题。此代理总是告诉Excel,该语言环境是美利坚合众国克罗地亚语(locale
id
拾33),那使得地使VSTO匹配VBA行为。假设您在文书档案消除方案前面使用VSTO代码,则会为你搞定Excel语言环境难题,您不要再进一步担心。假使你正在为Excel或自动化可执行文件营造托管COM加载项,则难题如故存在。

VSTO对Excel语言环境难点的化解方案有部分注意事项。
VSTO透南陈理能够稍微放慢代码的快慢。它也会造成Excel对象在调试器中反省时显示略有差别。最终,假若你使用Equals运算符将代理的Excel对象(如Application)与未利用的Application对象进行比较,则它们将不会被评估为相等。

即使要绕过一定对象的VSTO透西夏理,能够选拔Microsoft.Office.Tools.Excel.ExcelLocale十3三Proxy.Unwrap方法,并传递要绕过代理的Excel对象。此方法将去除代理并赶回原始的PIA对象,再度暴光你的区域安装难点。您还足以将VSTO项指标AssemblyInfo.cs文件中的程序集属性ExcelLocale十33装置为false,以便关闭全部Excel化解方案的晶莹代理。

若果您导航到另三个PIA的对象,然后再一次导航回Excel
PIA,则大概会丢掉透南齐理。例如,若是从Application.CommandBars集合中的Microsoft.Office.Core
PIA命名空间获得CommandBar对象,然后使用CommandBar.Application属性重返到Excel
Application对象,则今后已丢失代理和区域安装难点会再次产生。

最终,如若你从化解方案中的Word
VSTO代码创建了二个新的Excel实例,那么你一直与Excel
PIA进行交谈,而没有透明的代理对象,并且区域安装难题将接二连三有效。

将Excel日期转换为DateTime
Excel可以以三种格式表示日期:190四格式或一九〇三格式。
1903格式基于二个体系,当转换为2个数字时,它代表从一9〇二年7月31日起的已病逝的天数。壹玖零3格式是依照多少个系统,当转换为三个数字时,它象征已过的命局自190二年六月八日起,1901年格式由最初的Macintosh总结机引入,因为大家稍后描述的一九零二格式的难题。您能够经过检查Workbook.Date一九零零属性来明确工作簿正在利用的格式,若是工作簿使用一9〇二格式,则赶回true。

借使Excel工作簿使用一9〇伍格式,并将日期从该工作簿转换为Date提姆e直接,则会获取错误的值。由于DateTime期望一九〇四年的格式,由数字代表的Excel日期的值是一九零四年7月3日从此,而不是一九〇三年3月15日事先的通过天数,由此将关闭4年和三个闰年。因而,此代码若是您在工作簿中利用一九零三格式,将会交到错误的日马时间。

object excelDate = myRange.get_value(Type.Missing);
DateTime possiblyBadDateIfExcelIsIn1904Mode = (DateTime)excelDate;

要博得一玖零三格式的日子为DateTime格式,您必须抬高190二格式日期四年和3个闰天(以弥补1900年在一九零零年而不是一9零零年的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-3八还对一九〇三格式日期举行了更正。 事实注解,当Lotus一-二-三写成时,程序员错误地觉得1903年是三个闰年。
当Microsoft写Excel时,他们希望确定保障它们与现有的Lotus1-2-三电子表格保持极度,使其能够总计自189玖年七月八日的话的运气,而不是一玖〇〇年二月二十二日。当Date提姆e为
写的,它的制造人未有试图回溯到189玖年一月二十四日,它是从一玖零一年八月15日始于总括的。所以为了将一九〇二年7月三二十七日在此之前的1九零2年格式的Excel日期正确地变换来DateTime,你必须添加一天。

最终,Excel不能够代表一九零四年一月22日事先1902年格式的光景,1九零贰年1三月一日事先的日子,以一玖零二年格式。
由此,当您将Date提姆e转换为Excel日期时,必须传递1个字符串而不是表示date的数字,因为这个日子不能够在Excel中象征为日期(仅看成字符串)。

结论
本章研讨了Excel对象模型中的壹些最重点的对象。
我们在延续章节的Excel示例中央银行使了成百上千那个目的。
在第一1章“在Excel中动用XML”中,大家还记挂了一部分用于在Excel中使用XML的其余Excel对象模型对象。

本章描述了由Excel的基本点互操作程序集定义的这一个目的。
您应该注意到,VSTO扩充了那个目的(Workbook,Worksheet,Range,Chart,ChartObject和ListObject),以添加一些叠加效率,如数据绑定帮忙。
本书第一部分调查了那么些扩大。

 


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图