威尼斯人线上娱乐

叁大绝招,应用Excel条件格式

2 5月 , 2019  

Excel中的条件格式功用是个可怜精锐且方便的效益,通过对使用规则格式成效能够在非常大程度上改良表格的宏图和可读性,用户能够内定单个也许四个单元格区域采取壹种或许四种格式,如此一来,也在大大进步了报表的操作性。上边将介绍在C#编制程序中如何来安装并应用Excel条件格式。

上壹篇小说中介绍了关于设置Excel条件格式,包蕴基于单元格值、自定义公式等应用条件格式、应用数据条标准类型格式、删除条件格式等剧情。在本篇小说军长继续介绍C#
设置标准格式的方法。

使用Range对象
Range对象表示原子钟格中的单元格范围。范围能够蕴含一个单元格,几个接二连三的单元格,以致多个不总是的单元格。您能够在Excel中选拔时按住Ctrl键选拔三个不一连的单元格。

闲话Microsoft Excel

威尼斯人线上娱乐 1

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

从1985年的率先款Excel(只用于Mac系统)诞生于今,Microsoft
Excel已经三1三岁,现时正当而立之年!功能最棒庞大,但对广阔使用者来说,Microsoft
Excel同时也不行混乱。一个人想要完全可行调整和使用Microsoft
Excel的有所功效的话,能够说是不大概做到的职分(Mission
Impossible!)。而实质上对于大许多人来讲,平常活着和做事中能用到的和常用的效益实在并不多,而且就算如此,Microsoft
Excel也早已帮大家很好地管理了众多职责了!

正所谓,“过犹比不上”,咱们并不须求为了接纳工具而利用工具,我们的目的是化解难点和产生任务!(题外话:我们的靶子是星辰大海~~)因而,大家并没有需求精通和驾驭Microsoft
Excel的享有相关知识,而只必要驾驭那三个我们有不可缺少了然的就可以了!

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

演示要点概述:

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

  2. 据他们说自定义公式应用条件格式

  3. 行使数据条规范类型格式

  4. 去除条件格式

  四.壹 删除钦点数量范围中的条件格式

  四.二 删除全数条件格式

中央概述:

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

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

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

 

获取特定Cell或Cells范围对象
Excel提供了三种拿走Range对象的措施。
Range对象是你要在Excel工作表中管理单元格或单元格范围时行使的目标。在Application对象的叙说中关系了三种获得Range对象的格局。
Application.ActiveCell在移动窗口中回到活动选用的左上角单元格。
Application.Selection重回叁个表示活动窗口中移动选拔的靶子。倘使运动选取是单元格范围,则能够将Application.Selection调换为Range对象。假设在运动窗口(比如形状或图表)中选用了其他选拔,Application.Selection将重返所选对象。

1.SUMIFS:

威尼斯人线上娱乐 ,SUM函数是MS Excel中最宗旨也最有效的函数之1,相信大家早就已经用得烂熟了!它通过1个轻巧的公式就能够长足增进大批量的多少,节省了众多小时的用指尖贰个键1个键地敲总计器的大运。但是,SUM函数的通用性也正因为其简要而面临掣肘,由此大家要介绍的SUMIF(S)等函数该出场了!

要是你有叁个巨大的出卖数据表,当中囊括发卖总额、商行、城市、售出产品和产品发卖月份等目标:

威尼斯人线上娱乐 2

贩卖数据表

SUM函数能够很轻巧地拉长出总发卖额,可是你的业主那时只想要纸巾的总出售额,如何是好呢?别记挂,非常粗略,我们利用SUMIF函数来总结:

威尼斯人线上娱乐 3

SUMIF函数

先是,设定筛选标准的查究范围(产品列),然后加多筛选规范(具体产品名),最终选项进行求和的值(筛选标准所对应的值)并累加。公式应该是那般的:

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

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

叁大绝招,应用Excel条件格式。解释一下:那些公式告诉Excel将E列中的与D列的准绳“纸巾”相对应的有着数据增进起来。

接下去,假令你的COO想要北京的办公椅的总销量,而且还借使由你的同事赵6负担的(即便第二感应是,“又不是本人背负的,干嘛让笔者来计算”。但住户终归是高管娘,又怎么好意思怼回去呢?),这又该怎么管理吧?挠头,以为不容许?放心,有SUMIFS在,没什么十分小概!(Nothing
is Impossible!不佳意思,广告看太多了。)

逆天的SUMIFS函数允许你使用多少个规范化,就一定于是抓好版的SUMIF:

威尼斯人线上娱乐 4

SUMIFS函数

在SUMIF的背后扩充贰个S,就好像阿尔巴尼亚语里的单数、复数方式吗!微软真是会造词啊!

那2遍,从需供给和的值开始,逐步拉长各类须求的筛选规范。最终结出应当是那般的:

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

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

解释一下:轻松地说,就是报告MS
Excel,首先哪些列里有大家需求的数据,然后依据筛选规范筛选出10分的值,最后求和。只可是,条件多了一丝丝!

*小提醒: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一样式参考格式。解释A1体制参考格式的最简易的秘诀是付许多少个例证。

2.Find/Mid:

Find/Mid函数组合为自个儿在MS
Excel中节约的时刻,也许是有所函数中最多的。它(们)是能够从单元格中提取文本块的个别多少个Excel函数之一。以至足以说它(们)是最管用的函数,因为能够操作它(们)越过数千个单元格而全数同等的公式。

演示代码(供参考)

测试文书档案如下:

威尼斯人线上娱乐 6

C#代码示例(供参考)

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

MID:

威尼斯人线上娱乐 7

MID函数

MS Excel 2015中,Mid函数的概念是:MID
重返文本字符串中从内定地方上马的特定数目标字符,该数额由用户内定。

像Left和Right函数同样,Mid函数也足以从单元格中领到文本。首先,引用单元格从中提取文本。然后,重回从钦点地点上马的急需多少的字符。举例:

威尼斯人线上娱乐 8

MID函数用法示例

经过行使Mid函数,Excel将引用单元格D壹(MS Excel functions are so amazing
cool),找到第3四个字符,然后从那么些地方上马向后,重返前11个字符。
很简短吗!

*小提醒:再次回到结果是从第3五个字符开端的,将要第二伍个字符作为再次来到值的第二个,然后向右数一、二、3…十,再次来到计算十一个字符。

【示例 一 】应用条件格式

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

【示例 1】应用条件格式用于高亮重复、唯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");
        }
    }
}

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

 威尼斯人线上娱乐 10

参考$ A $
一也指的是第3行列A中的单元格。假设在A一体制引用中选用$符号,则它们将被忽略。

FIND:

威尼斯人线上娱乐 11

FIND函数

MS Excel 201陆中,Find函数的概念如下:函数
FIND用于在第四个文本串中定位第叁个文本串,并再次回到第柒个文件串的发端地方的值,该值从第叁个文本串的第多少个字符算起。

读起来某些生硬是或不是?其实很简短。Find函数将在单元格中找到三个字符串,并回到第三个字符的地点数。大家用同一的多少来比喻:

威尼斯人线上娱乐 12

FIND函数用法示例

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

只顾壹:假设给定单元格中的文本字符串不是唯一的,那么Excel将重临文本字符串中找到的第3个实例。比方,=FIND(“c”,D1)得到的结果是3,而忽视掉别的的。

专注2:Find函数区分轻重缓急写,所以只要接纳”Are”而不是”are”的话,结果将重回错误。

那便是说今后让我们选用上面的事例来对FIND/MID的结缘使用举办验证呢!

第一,比方有三个网站:ttp://www.gamersky.com/news/201612/843064.shtml 
(证明一:举这么些网站为例未有别的妄想,只是因为刚刚作者张开了这一个网页在看音信。)
(表明贰:特意删除掉了第1个字母h,实际演示的Excel文书档案中是一对。)

若果你需求从这些网站中领取页面ID号(在本例中为84306四)。
数字从第一多少个字符开首,因而你能够选用= Mid(单元格,叁7,6)重返ID号。

威尼斯人线上娱乐 13

FIND_MID组合用法示例

MS
Excel的函数之所以庞大,就在于函数能够互为组合使用。上边的例子中,=MID(A壹,37,六)中的起头地点三柒是怎么获得的啊?有人说,大家能够二个3个从左到右数过去呀。也有人说,假如网站十分长这岂不是要累死,而且难免不会数错!说的对,所以大家就把数数的办事付出强大的Excel去做,我们等它的结果就能够了。让大家把地点的公式稍微更动一下:

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

咱俩注重到,ID号有5位数,并且是从处于最左侧的绝代的shtml字符串的左手第八个字符开始的,所以大家就把原本的公式改动成了上边的旗帜。那下不用大家三个字符二个字符地数了吗?

MID和FIND的组成能够发挥出巨大的成效,给大家管理多少推动最棒的便利。具体的例证这里就不多列举了,大家先品尝起来呢!须知,“眼过千遍,不比手过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");

            //获取第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

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

测试结果:

 威尼斯人线上娱乐 15

 

 

您能够行使范围运算符(:)来钦点单元格范围,在那之中第1个A1样式引用是限量的左上角,后跟五个冒号运算符,之后是右下角的第一个A壹体制引用的范围。参考A一:B一指的是行一,列A和列一,列B的四个单元格。参考A一:AA1一是指块中的全数2九多少个单元格,其左上角位于第壹列,第A列和下侧右角位于第2一列,AA栏(第三7列)。

3.LEN函数+条件格式

大家平日供给写一些事物,但因为有字数限制,所以创作的进度并不都以那么喜上眉梢——平常一十分大心字数就超越限定了。那么借助于MS
Excel大家能够有艺术提示本人在意呢?

答案是自然的。我们只需利用LEN函数和“条件格式”就能够很好地张开字符限制追踪提醒了!

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

很轻易懂啊!LEN函数相当简单——只回去给定单元格中的字符数。大家依然来看例子吗!

威尼斯人线上娱乐 16

LEN函数用法示例

观望地点那张图纸了呢?都以自己发过的博客园(嘻嘻)。假使本人必要您总结各种单元格的字符数,然后告诉自身那么些单元格里超越了六15个字(符),你会不会想打小编?(笔者躲~~)

再想象一下1旦今后共计有三千个那样的单元格,你又何以急忙精确地看清哪些超过了字数限制,哪些没超过呢?

好呢,让自家来演示一下呢。首先大家选中B列,然后点击“开端”选项卡里面的“条件格式”,在弹出的选项中甄选“优异展示单元格规则”之“大于…”

威尼斯人线上娱乐 17

LEN函数用法示例2

跟着,输入我们的单元格字符数限制数值:(这里以70为例)

威尼斯人线上娱乐 18

LEN函数用法示例三

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

=LEN(A1)

威尼斯人线上娱乐 19

LEN函数用法示例4

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

威尼斯人线上娱乐 20

LEN函数用法示例伍

“条件格式”里的界定标准“大于”也能够被更动为别的的口径选拔,那一点一滴取决于你的切实管理要求。由此,条件格式是那多少个实用的,而且将它与其他功用结合在1块的话更是将大家的工作管理技艺升高到了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”的言传身教方法介绍到此。

如需转发,请注脚出处。

 

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

测试结果:

 威尼斯人线上娱乐 23

 

以上内容是此番关于设置Excel表格条件格式的填补介绍,如需转发,请申明出处。

(本文完)

你能够使用联合运算符(,)来钦定大概是不总是的五个单元格。举例,参考A壹,C4点名了第3个单元格位于第贰列,第A列,第二个单元格位于第伍列第C列的多个单元格的限量。用户能够通过按住Ctrl键来接纳单元格的不总是范围因为他俩选用各个细胞。参考A一,C四,C八,C10是钦命几个分化单元格的另叁个有效的A一样式参考。

结语

就算如此本篇著作并从未为您提供Microsoft
Excel当中全体与你或你的职业相关的剧情,但小编真的希望可感觉你提供部分更加高档其余利用表率和选拔。作者深信,通晓和垄断了这个用法之后,应该可认为你或你的事情节省下多数保养的大运,并提供越来越好的数据观望和分析参考。

交点运算符(三个空格)能够钦赐单元格的以次充好。举个例子,参考A一:A10A5:A15剖析为从行五,列A开首并以行A,列A开首的交接多个单元。参考A一:A十A五:A1五 A伍讲解为第陆行的单个单元格,列A.

您还足以采纳你在A一体制参考中在办事表中定义的其余名称。比如,借使您定义了指向单元格A1的名称叫foo的名号范围。使用你的名号的有的卓有成效的A一体裁的引用将包涵foo:A二,其引用行一,列A和行贰,列A的单元格。引用foo,A伍:A6是指第一行,第A列;第4行,A列;和第四列,列A。

如前所述,get_Range方法应用第四个可选参数,您能够传递第3个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(“A一:A2”,Type.Missing)。使用Cells属性的更分布的用法是将其与Range的get_Item属性结合使用,该属性将运用行索引和可选的列索引。使用get_Item是一种在不行使A一体制引用的情状下访问特定单元格的措施。所以Cells.get_Item(1,1)相当于get_Range(“A1”,Type.Missing)。

赚取Range对象的另一种艺术是应用Worksheet.Rows或Worksheet.Columns属性。这一个重临1个与别的Range对象不一样的范围。比如,若是你使用Column再次来到的界定并呈现范围内的单元格数,则赶回256列数。不过假设你在回到的限量内调用Select方法,Excel将要做事表中甄选具有1六,77二,21几个单元格。思量Rows和Columns再次回到的范围的最简便的格局是它们的行事与列和行标题在Excel中的行为相似。

清单5-2柒展现了选拔get_Range方法和Cells,Rows和Columns属性的多少个示范。大家接纳范围的Value贰属性将范围中的各类单元格设置为内定的字符串值。程序的运营结果如图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-柒  运维结果清单伍-二柒

威尼斯人线上娱乐 24

使用Address
给定一个Range对象,你时不时索要鲜明它所指的单元格。
get_Address方法重临A1体制或Sportage1C1样式范围的地点。
您曾经驾驭了A1体裁的引用。
Murano一C壹样式的引用支持与A1样式引用(范围为冒号,联合逗号和陆续空间)商讨的具有同1的运算符。
CR-V一C1样式的引用分别以逍客和C开端的行和列号。
所以本田UR-V1C1作风的单元格Cross将是中华V4C壹。
图五-八显示了我们在本节初级中学毕业生升学考试虑的七个方面包车型地铁限量。

图5-捌  具备多个不总是区域的限量

 威尼斯人线上娱乐 25

图5-第88中学范围的地方以A一体裁和PAJERO壹C壹样式显示:

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

获取地址的另二个抉择是收获外部引用依然本地引用。
大家已经在图伍-第88中学展现的地址是本土引用。
外部引用包涵限制所在的专门的学问簿和职业表的名号。
在图伍-第88中学,与A一风格和帕杰罗一C壹风格的外表参考同样。

 

[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

得到地址的另一个选择是选用绝对化地址如故接纳相对地址。
大家早就思量过的地址是相对的。
相对格式(相对于单元格A一)的1致地方如下所示:

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

对此CRUISER1C一样式的地址,您仍是能够钦点希望地点相对的单元格。
要是我们在图伍-四中相对于单元格B二获取了XC60一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方法取一个限量并获得二个与之相距一些行和列的新范围。
该办法运用行和列值来偏移给定范围并再次回到新的舞狮范围。
所以在图五-八的演示范围中调用get_Offset(伍,5)重返3个这么的A1体制地址的界定:

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

清单5-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
当2个限制内部存款和储蓄器在八个不一而再的单元格范围时,每一个不总是的限量称为八个区域。
假若Range中有多少个不延续的区域,请使用Areas属性通过Areas集结访问每个地区(作为Range)。
Areas会集具备二个Areas.Count属性和一个Areas.get_Item方法,它将二个意味着依据1的目录的int参数作为数组。
清单5-30呈现了一个迭代示例范围(有七个区域)并打字与印刷每个地方的地址的言传身教。

清单伍-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维数组时,能够回顾列索引,因为在那种气象下,它唯有壹列或一列的单元格,所以称为RowIndex的参数真的像数组索引同样。
假若限制有四个区域,则必须首先获得要管理的区域,get_Item只会回来单元格的限制中的第三个区域。

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

您还足以运用“行”和“列”属性来规定第2个区域中的行和列的总额。那么些属性重返特殊范围,您能够将其视为对应于与范围相关联的行或列标题。当大家从图5-第88中学的示例范围得到Rows.Count时,它回到1四,Columns.Count重回陆.那是有道理的,因为大家挑选的首先个区域(A1五:F2八)超过陆列和1肆行。

要博得第二个区域右下角的行和列地方,能够应用清单5-3贰所示的一定为难的表达式。清单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属性重回1个限制,该限量将增添为带有全部单元格,直到空白行和空白列。这些扩充的界定被誉为几个区域。所以,比如,你大概有2个限制,它含有贰个表格中的多少个单元格,以拿到包罗整体表格的限定(借使该表由空白的行和列组成),您将接纳十分的小范围的CurrentRegion属性重返整个案子

get_End方法是对与Range相关联的区域起成效的法子。
get_End方法接受XlDirection枚举的积极分子:xlDown,xlUp,xlToLeft或xlToRight。当xlUp传递的艺术重回与Range范围左上角的单元格一样的列中的最上边的单元格。当通过xlDown时,它回到与Range的左上角单元格一样的列中的最上面包车型客车单元格。当通过xlToLeft时,它回到与Range的左上角单元格一样行中的最左边的单元格。当通过xlToRight时,它将重临与Range的左上角单元格同样行中的最左侧的单元格。

选择Range
您能够运用限制上的精选形式使范围当前挑选。记住,拨打选拔会转移用户的近来甄选,那不是一件很好的事务,未有很好的说辞。可是,在有个别情况下,您希望将用户的专注力吸引到一点意况下,在增选范围的图景下能够产生这点。

编辑Range的值
一般说来选拔二种艺术来获取和设置限定内的值。第3种情势是行使get_Value和set_Value方法。第壹种艺术是应用性质Value二。
Value贰和get_Value的分化在于,Value二属性重临的要素是货币或日期作为双重值。而且,get_Value也经受XlRangeValueDataType类型的可选参数。假若您传递XlRangeValueData.xlRangeValueDefault,您将回到三个象征单个单元格范围单元格值的目的。对于Value贰和get_Value,假如Range包括多少个单元格,则将重回与Range中单元格相对应的对象数组。

清单伍-3叁来得了采纳Value二的多少个示范,包蕴将值数组传递给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提供了1部分复制,清除和删除范围的方法。复制方法应用Destination参数,您能够传递复制范围的目标地。
Clear方法清除限制内的单元格的剧情和格式。
ClearContents只清除限制内单元格的值,而ClearFormats仅清除格式。删除方法删除单元格的界定,并作为参数移动单元格替换已删除的单元格的主旋律。该方向作为XlDeleteShiftDirection枚举的积极分子传递:xlShiftToLeft或xlShiftUp。

在Range内查找文本
Find方法允许你寻觅范围中的文本,并重返范围内的单元格,个中找到文本。查找方法对应于查找和替换对话框,如图5-玖所示。假如在调用Find方法时大概参数,它将选择上次选取Find对话框时用户安装的其它设置。其余,当您内定参数时,钦赐的设置就要下次用户打开时展现在“查找”对话框中。

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

威尼斯人线上娱乐 26

Find方法运用表5-1第88中学描述的众多参数。
Find再次来到二个Range对象,假设它成功,要是找不到其余东西,则赶回null。
您能够动用FindNext方法找到与您的搜寻条件万分的下一个单元格。
FindNext要求三个可选的After参数,您供给传递上3个找到的界定,以确认保障您不会再二遍找到同样的单元格。
清单伍-3肆展现了选拔Find和FindNext方法的演示,个中咱们索求包罗字符“2”的别的单元格,并加粗这个单元格。

表5-1八  查找方法的参数

 

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

格式化壹多元单元格
Excel提供了二种格局和品质来格式化1两种单元格。最管用的是NumberFormat属性,您能够将其设置为格式化与“格式化单元格”对话框的“自定义”连串中的字符串相对应的字符串。比方,您可以将NumberFormat设置为“常规”,不安装一定的数字格式。将NumberFormat设置为m
/ d /
yyyy设置日期格式,0%将格式设置为百分比格式。当使用NumberFormat时,如若您正在营造调控台应用程序或加载项,请务必思虑本章前边的“特殊Excel问题”1节中商量的区域设置难题,因为读取和装置此字符串也许会在不一致的周转时形成难题语言境况。假诺你在职业簿或模板项目前边使用VSTO代码,则无需忧郁语言情形难题。

Font属性再次回到一个Font对象,可用以将Font设置为各个大小和体制。清单伍-3四出示了用来加粗单元格字体的Font对象的言传身教。

Excel还允许你成立与工作簿相关联的体裁,并将这一个样式应用于范围。您能够使用Workbook.Styles创制样式。清单伍-35来得了创建样式并将其选择于Range的言传身教。

清单5-3伍 创立和行使样式的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创设的文书档案消除方案前边的代码中不会并发此主题材料。
举例,假设要为范围设置公式并且位居塞尔维亚共和国语区域设置中,则Excel要求你使用本地化的乌Crane语公式名称和格式:

 

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

这种作为与单身于言语情形的减轻方案背后的VBA和VSTO代码区别。
VBA和VSTO总是告诉Excel,该语言意况是United States阿尔巴尼亚语(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
用作二个例子,借让你不思虑那个难题,能够思虑下列代码:

sheet.get_Range("A1", Type.Missing).Value2 = "03/11/02";

该值或然由二〇〇三年一月七日,二零零四年7月4日,或200三年3月十七日由Excel解释,具体取决于当前线程的区域安装。

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

清单五-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
十3三),推行设置的代码或获得受区域设置影响的天性(如NumberFormat或Formula),然后切换回保存的区域安装。不建议利用此办法,因为它会潜移默化不愿意本地交流机的别的加载项。

请思索以下示例。您的加载项正在法兰西机械上运维。您的加载项将区域设置切换来103三并设置公式值。另一个加载项是拍卖Change事件并突显三个对话框。该对话框以英文而不是塞尔维亚语展现。因而,通过改换线程区域安装,您已经转移了另一个加载项的表现,并且一般是稀松的Office公民。

选用反思来消除地区难点
相见区域安装难点的COM加载项或自动化可实行文件的建议化解办法(访问受当前语言情形影响的品质(如NumberFormat或Formula属性)时)是由此反射访问那些属性。反射令你能够钦点Excel的英文区域安装,并编制无论当前线程区域设置什么样的代码。清单伍-三七表达了什么行使反射来设置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语言遭受难点更为复杂化的第三个难题是,在将语言景况设置为非印度语印尼语区域设置的微型Computer上的英文Excel安装中使用Excel对象模型时,只怕会收取“旧格式或无效类型库”错误。
Excel正在程序文件\ Microsoft Office \ OFFICE11 \
103三中找到3个名称叫xllex.dll的公文,它找不到。化解此问题的格局是安装xllex.dll文件或安装Office的MUI语言包。您仍是能够复制excel.exe,将其重命名字为xllex.dll,并将其复制到十33索引。

VSTO和Excel语言遭受难题
文档化解方案后的VSTO代码通过利用位于您和Excel对象模型之间的晶莹代理对象来消除Excel区域设置难题。此代理总是告诉Excel,该语言蒙受是U.S.立陶宛共和国(Republic of Lithuania)语(locale
id
拾3三),那实惠地使VSTO相配VBA行为。要是你在文书档案消除方案后边使用VSTO代码,则会为您消除Excel语言意况难题,您不要再进一步担忧。尽管你正在为Excel或自动化可实施文件营造托管COM加载项,则难点还是存在。

VSTO对Excel语言情状难点的解决方案有一些注意事项。
VSTO透南陈理能够稍微放慢代码的进度。它也会促成Excel对象在调节和测试器中检查时显得略有差别。最终,即使您使用Equals运算符将代理的Excel对象(如Application)与未采取的Application对象开始展览相比,则它们将不会被评估为相等。

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

固然您导航到另2个PIA的靶子,然后再次导航回Excel
PIA,则恐怕会丢掉透武周理。举个例子,要是从Application.CommandBars集结中的Microsoft.Office.Core
PIA命名空间获得CommandBar对象,然后选择CommandBar.Application属性重临到Excel
Application对象,则以后已遗失代理和区域设置难点会再次发生。

末段,假诺您从化解方案中的Word
VSTO代码创造了3个新的Excel实例,那么你平昔与Excel
PIA举行交谈,而从不透明的代办对象,并且区域安装难点将再而三有效。

将Excel日期调换为DateTime
Excel能够以三种格式表示日期:壹9零伍格式或一九零伍格式。
一九零一格式基于三个类别,当调换为2个数字时,它代表从一九零1年十二月二十一日起的已辞世的运气。一玖零三格式是凭借八个连串,当转变为二个数字时,它表示已过的天数自一九零1年10月1013日起,一9零零年格式由最初的Macintosh计算机引进,因为我们稍后描述的1903格式的难点。您能够因此检查Workbook.Date一九零叁属性来鲜明专门的学问簿正在使用的格式,假若工作簿使用1905格式,则赶回true。

假诺Excel职业簿使用一9零二格式,并将日期从该专业簿转换为DateTime直接,则会获得错误的值。由于DateTime期望一玖零四年的格式,由数字代表的Excel日期的值是190肆年一月八日现在,而不是1901年11月17日在此以前的经过天数,因而将闭馆4年和三个闰年。由此,此代码若是您在专门的学业簿中选取一九零伍格式,将会付给错误的日期时间。

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

要获得一九〇〇格式的日期为DateTime格式,您必须抬高1901格式日期四年和三个闰天(以弥补一九零三年在一9〇四年而不是一9〇三年的0)。
所以,要是您编写代码,并应用函数Convert-ExcelDateToDate在清单伍-3第88中学,你将得到正确的结果,假设选拔一玖〇二日子系统。

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

清单5-3八  将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一-二-三写成时,程序员错误地感觉一玖〇四年是三个闰年。
当Microsoft写Excel时,他们盼望确定保障它们与存活的Lotus一-2-叁钟表格保持包容,使其能够总结自189玖年1月二四日以来的运气,而不是19零肆年五月二十二日。当Date提姆e为
写的,它的创办者未有策动回溯到189玖年三月三十日,它是从一玖〇五年二月112日启幕盘算的。所以为了将一九零三年十二月三日事先的一9〇〇年格式的Excel日期正确地改形成DateTime,你必须增加一天。

末尾,Excel不可能表示1904年八月二1010日事先一玖〇二年格式的光阴,1九零3年10月5日事先的日子,以1901年格式。
由此,当你将DateTime调换为Excel日期时,必须传递一个字符串而不是意味着date的数字,因为那一个日子不可能在Excel中表示为日期(仅看成字符串)。

结论
本章切磋了Excel对象模型中的一些最重大的目的。
大家在持续章节的Excel示例中运用了成都百货上千那么些目的。
在第三一章“在Excel中央银行使XML”中,大家还思虑了部分用来在Excel中采纳XML的别的Excel对象模型对象。

本章描述了由Excel的重大互操作程序集定义的这一个目的。
您应该注意到,VSTO扩充了这一个目的(Workbook,Worksheet,Range,Chart,ChartObject和ListObject),以增添一些外加作用,如数据绑定帮衬。
本书第一有个别调查了这么些扩充。

 


相关文章

发表评论

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

网站地图xml地图