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

Excel中的条件格式作用是个卓殊强硬且便于的效率,通过对应用规范格式功用可以在十分的大程度上改进表格的统一筹划和可读性,用户能够钦命单个恐怕四个单元格区域使用1种恐怕二种格式,如此壹来,也在大大升高了报表的操作性。下边将介绍在C#编制程序中如何来安装并应用Excel条件格式。

上一篇小说中牵线了关于设置Excel条件格式,包蕴基于单元格值、自定义公式等利用条件格式、应用数据条标准类型格式、删除条件格式等剧情。在本篇小说少校继续介绍C#
设置规范格式的不贰诀窍。

使用Range对象
Range对象表示电子表格中的单元格范围。范围能够包罗二个单元格,两个一而再的单元格,甚至多少个不两次三番的单元格。您能够在Excel中采纳时按住Ctrl键选用八个不总是的单元格。

闲话Microsoft Excel

亚洲必赢官网 1

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

从1九捌伍年的首先款Excel(只用于Mac系统)诞生现今,Microsoft
Excel已经33岁,现时正当而立之年!效用最棒强大,但对科学普及使用者而言,Microsoft
Excel同时也尤其混乱。壹人想要完全可行控制和采纳Microsoft
Excel的持有机能的话,能够说是不容许做到的职分(Mission
Impossible!)。而实际上对于大多数人而言,日常生存和做事中能用到的和常用的法力实在并不多,而且固然如此,Microsoft
Excel也早已帮大家很好地拍卖了诸多职务了!

正所谓,“过犹不如”,大家从没供给为了采用工具而采纳工具,大家的靶子是化解难点和到位任务!(题外话:大家的对象是星辰大海~~)因而,大家并不必要了然和摆布Microsoft
Excel的全部相关知识,而只须要通晓那一个咱们有供给明白的就能够了!

本篇作品就为我们介绍Microsoft
Excel中的3个要命管用的成效和用法,希望能够使大家的办公生活有点轻松一些!(^_^)

以身作则要点概述:

  1. 基于单元格值应用条件格式

  2. 依据自定义公式应用条件格式

  3. 采纳数据条规则类型格式

  4. 剔除条件格式

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

  四.2 删除全数准绳格式

要点概述:

  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个简易的公式就足以长足增加多量的多少,节省了见惯不惊时辰的用指头贰个键三个键地敲计算器的时日。可是,SUM函数的通用性也正因为其简单而面临制约,由此我们要介绍的SUMIF(S)等函数该出场了!

只要你有三个庞大的行销数据表,当中囊括销售总额、商行、城市、售出产品和制品销售月份等目的:

亚洲必赢官网 2

销售数据表

SUM函数能够很简单地增进出总销售额,然则你的主管那时只想要纸巾的总销售额,如何做吧?别担心,很简短,大家运用SUMIF函数来总结:

亚洲必赢官网 3

亚洲必赢官网,SUMIF函数

第二,设定筛选标准的寻找范围(产品列),然后添加筛选标准(具体产品名),最后选用举行求和的值(筛选标准所对应的值)并充分。公式应该是如此的:

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

*小提示:公式中拥有的字母、标点、括号都以在英文输入法的半角状态下输入的。

解释一下:这几个公式告诉Excel将E列中的与D列的规则“纸巾”相对应的具有数据增进起来。

接下去,假若你的小业主想要香水之都的办公椅的总销量,而且还借使由你的同事赵6负责的(固然第二感应是,“又不是自家负责的,干嘛让自家来总括”。但住户毕竟是老董娘,又怎么好意思怼回去啊?),那又该怎么处理吧?挠头,觉得不容许?放心,有SUMIFS在,没什么不大概!(Nothing
is Impossible!不佳意思,广告看太多了。)

逆天的SUMIFS函数允许你使用多个原则,就一定于是加强版的SUMIF:

亚洲必赢官网 4

SUMIFS函数

在SUMIF的背后扩张二个S,就像罗马尼亚语里的单数、复数情势呢!微软真是会造词啊!

这一次,从需求求和的值起头,稳步丰盛每种要求的筛选标准。最后结果应该是这么的:

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

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

解释一下:不难地说,正是报告MS
Excel,首先哪些列里有大家需求的数码,然后依据筛选标准筛选出适合的值,最终求和。只不过,条件多了一小点!

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

本来啦,我们也能够选拔其它1种MS
Excel中同样既简约又功能强大的工具:数据透视表来获得依照这一个筛选标准所分离出来的有着数据的全体视图。可是,SUMIFS函数也有其与众差异优点,它能够选用和过滤掉大数据汇总的数据,而并不需求处理全数的相干或不相干的数量。

选取工具

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

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

行使工具:

  • Spire.XLS for
    .NET

注:在编辑代码时只顾在程序中增进引用Spire.Xls.dll,dll文件可在安装路径下的Bin文件夹中获得。

亚洲必赢官网 5

工作表还提供了两种获得Range对象的措施。
Worksheet.get_Range方法是从工作表获取Range对象的最常用方法。此措施接收能够传递字符串的必需对象参数。它有着可以传递第二个字符串的第2个可选参数。您传递的字符串是所谓的A一样式参考格式。解释A1体制参考格式的最不难易行的措施是提交多少个例子。

2.Find/Mid:

Find/Mid函数组合为本身在MS
Excel中节省的时日,恐怕是具备函数中最多的。它(们)是足以从单元格中领到文本块的少数多少个Excel函数之一。甚至足以说它(们)是最实惠的函数,因为能够操作它(们)跨越数千个单元格而具备同等的公式。

演示代码(供参考)

测试文书档案如下:

亚洲必赢官网 6

C#代码示例(供参考)

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

MID:

亚洲必赢官网 7

MID函数

MS Excel 201陆中,Mid函数的定义是:MID
重回文本字符串中从钦命地点上马的一定数指标字符,该数量由用户内定。

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

亚洲必赢官网 8

MID函数用法示例

通过使用Mid函数,Excel将引用单元格D一(MS Excel functions are so amazing
cool),找到第贰四个字符,然后从1贰分地方上马向后,再次回到前十个字符。
很简短吗!

*小提醒:重临结果是从第十五个字符初步的,即将第二伍个字符作为再次回到值的第三个,然后向右数1、二、3…10,重回计算10个字符。

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

调节运转程序,生成文书档案,如下:

亚洲必赢官网 9

【示例 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 $
1也指的是第一行列A中的单元格。假诺在A一样式引用中使用$符号,则它们将被忽略。

FIND:

亚洲必赢官网 11

FIND函数

MS Excel 2015中,Find函数的概念如下:函数
FIND用于在第二个文本串中固定第一个文本串,并赶回第叁个公文串的前奏地方的值,该值从第壹个文件串的首先个字符算起。

读起来有点生硬是或不是?其实非常粗略。Find函数将在单元格中找到八个字符串,并再次来到第1个字符的地方数。大家用平等的多少来比喻:

亚洲必赢官网 12

FIND函数用法示例

“are” 在单元格D1里是从第一0个字符开首的。

只顾一:假使给定单元格中的文本字符串不是唯一的,那么Excel将回来文本字符串中找到的第3个实例。比如,=FIND(“c”,D一)得到的结果是3,而忽略掉其余的。

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

这便是说未来让大家采纳上面的例子来对FIND/MID的结缘使用进行表明呢!

先是,比如有三个网站:ttp://www.gamersky.com/news/201612/843064.shtml 
(评释一:举这些网站为例未有其余企图,只是因为刚刚笔者打开了那么些网页在看信息。)
(表明二:特意删除掉了第多少个字母h,实际演示的Excel文书档案中是1对。)

假使你需求从那一个网站中领取页面ID号(在本例中为843064)。
数字从第叁8个字符起头,由此你能够选拔= Mid(单元格,3七,陆)再次来到ID号。

亚洲必赢官网 13

FIND_MID组合用法示例

MS
Excel的函数之所以强大,就在于函数能够互为组合使用。上面包车型地铁事例中,=MID(A壹,37,6)中的起头地点三七是怎么得到的啊?有人说,大家能够3个三个从左到右数过去啊。也有人说,若是网站不长那岂不是要累死,而且难免不会数错!说的对,所以大家就把数数的办事付出强大的Excel去做,大家等它的结果就能够了。让大家把地点的公式稍微改变一下:

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

咱俩着眼到,ID号有多人数,并且是从处于最右侧的无比的shtml字符串的左手第多少个字符开端的,所以大家就把原本的公式改造成了上边的典范。那下不用大家三个字符二个字符地数了吗?

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

测试结果:

亚洲必赢官网 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一样式引用的限制。参考A一:B一指的是行一,列A和列一,列B的多少个单元格。参考A一:AA1一是指块中的全体2玖几个单元格,其左上角位于第3列,第A列和下侧右角位于第二一列,AA栏(第2七列)。

3.LEN函数+条件格式

我们平日须求写一些事物,但因为有字数限制,所以创作的历程并不都以那么开心——平常一相当大心字数就超越限定了。那么借助于MS
Excel大家能够有点子提示本身小心呢?

答案是任天由命的。我们只需选用LEN函数和“条件格式”就足以很好地实行字符限制跟踪提醒了!

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

很不难懂吗!LEN函数十二分简单——只回去给定单元格中的字符数。大家照旧来看例子吗!

亚洲必赢官网 16

LEN函数用法示例

看到上面那张图片了吧?都以自己发过的博客园(嘻嘻)。若是小编须求你总结各样单元格的字符数,然后告诉自身那多少个单元格里超越了73个字(符),你会不会想打本身?(笔者躲~~)

再想象一下假使未来一共有3000个那样的单元格,你又何以快速准确地判断哪些超出了字数限制,哪些没超越呢?

好呢,让自家来演示一下吧。首先大家选中B列,然后点击“起头”选项卡里面包车型大巴“条件格式”,在弹出的选项中选用“优良显示单元格规则”之“大于…”

亚洲必赢官网 17

LEN函数用法示例二

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

亚洲必赢官网 18

LEN函数用法示例三

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

=LEN(A1)

亚洲必赢官网 19

LEN函数用法示例四

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

亚洲必赢官网 20

LEN函数用法示例伍

“条件格式”里的范围条件“大于”也得以被变更为别的的标准选拔,那统统在于你的现实性处理须要。由此,条件格式是老大管用的,而且将它与别的职能整合在同步的话更是将大家的作业处理能力增强到了1个新的层系,越发是在处理具体的数码内容时!

【示例三】删除条件格式

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一,C四钦命了第壹个单元格位于第二列,第A列,第3个单元格位于第5列第C列的三个单元格的范围。用户能够透过按住Ctrl键来抉择单元格的不总是范围因为她俩选拔种种细胞。参考A一,C四,C八,C十是点名五个例外单元格的另3个卓有成效的A1体裁参考。

结语

固然本篇小说并不曾为你提供Microsoft
Excel在这之中全体与您或你的政工有关的内容,但本身确实希望能够为您提供1些更高级别的采纳范例和挑选。笔者信任,驾驭和掌握了那几个用法之后,应该能够为您或你的事剧情省下许多贵重的岁月,并提供更好的多寡观看和剖析参考。

交点运算符(2个空格)能够钦赐单元格的鱼龙混杂。例如,参考A1:A拾A伍:A15剖析为从行五,列A开始并以行A,列A伊始的交接多少个单元。参考A一:A十A5:A15 A五解说为第伍行的单个单元格,列A.

你仍是能够应用你在A一体制参考中在干活表中定义的别的名称。例如,假如您定义了指向单元格A一的名称叫foo的名目范围。使用你的名号的片段可行的A一体裁的引用将包蕴foo:A贰,其引用行一,列A和行贰,列A的单元格。引用foo,A5:A6是指第二行,第A列;第4行,A列;和第5列,列A。

如前所述,get_Range方法应用第1个可选参数,您能够传递第三个A一样式的引用字符串。使用限制运算符有效地结合率先个参数和第三个参数。由此,当调用get_Range(“A1”,“A2”)时,get_Range重回的范围等同于调用get_Range(“A1:A二”,Type.Missing)时收获的限量。

取得Range对象的第三种情势是使用Worksheet.Cells属性,该属性重临工作表中全部单元格的限量。然后,您能够在回来的Range对象上利用同样的get_Range方法,并以与使用Worksheet对象中的get_Range相同的措施传送A1体裁引用以挑选单元格。所以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对象的另一种艺术是使用Worksheet.Rows或Worksheet.Columns属性。那个重返1个与其它Range对象区别的界定。例如,若是您使用Column再次回到的限制并显示范围内的单元格数,则赶回256列数。不过假设您在回到的限定内调用Select方法,Excel将在劳作表中选取具有16,772,二拾六个单元格。挂念Rows和Columns重临的界定的最简便易行的法子是它们的行为与列和行标题在Excel中的行为相似。

清单5-二七出示了动用get_Range方法和Cells,Rows和Columns属性的多少个示范。大家选择范围的Value二属性将限制中的各类单元格设置为钦定的字符串值。程序的运行结果如图五-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";
}

图五-柒  运转结果清单伍-2七

亚洲必赢官网 24

使用Address
给定1个Range对象,你时不时索要鲜明它所指的单元格。
get_Address方法重回A1体裁或ENCORE一C1样式范围的地方。
您曾经理解了A1样式的引用。
昂科威壹C一体制的引用帮衬与A一体制引用(范围为冒号,联合逗号和交叉空间)钻探的装有同壹的运算符。
卡宴一C一体制的引用分别以福特Explorer和C伊始的行和列号。
所以ENCORE1C1风格的单元格Camaro将是LX5704C一。
图5-八显得了大家在本节初级中学毕业生升学考试虑的几个方面的限定。

图5-八  具有多个不延续区域的限定

 亚洲必赢官网 25

图伍-第88中学范围的地方以A1体裁和PRADO壹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

获取地址的另3个精选是选用相对化地址依旧利用相对地址。
大家早已思索过的地址是纯属的。
相对格式(相对于单元格A1)的平等地方如下所示:

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

对于Murano1C一样式的地方,您仍是能够钦点希望地点相对的单元格。
假设大家在图5-四中相对于单元格B二拿到了奥德赛一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样式引用一起使用时不起作用。

 

清单伍-2八来得了应用示例范围的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(伍,五)重回一个那样的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集合具有一个Areas.Count属性和三个Areas.get_Item方法,它将叁个象征依据壹的目录的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方法接受所需的行索引和可选的列索引。
当范围是单元格的壹维数组时,能够不难列索引,因为在那种情况下,它唯有1列或一列的单元格,所以称为RowIndex的参数真的像数组索引1样。
就算限制有三个区域,则必须首先得到要拍卖的区域,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
给定三个Range对象,您能够采纳Row和Column属性来规定其首先个区域的左上角的行和列号。行和列号作为int值重临。

您还足以接纳“行”和“列”属性来规定第贰个区域中的行和列的总额。那些属性重临特殊范围,您能够将其视为对应于与限定相关联的行或列标题。当我们从图五-第88中学的示例范围得到Rows.Count时,它回到14,Columns.Count再次回到陆.那是有道理的,因为我们选用的第三个区域(A一伍:F2八)跨越陆列和1肆行。

要收获第一个区域右下角的行和列地方,能够选取清单五-3二所示的十二分难堪的表达式。清单5-32还证实了使用get_Item,它使用行和列索引(相对于给定范围的顶部),并赶回该行和列索引处的单元格(作为限制)。当你收获三个Rows或Columns范围时,这一个限制是壹维的,在那种地方下,称为RowIndex的参数像数组索引一样。

清单5-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属性重回贰个限制,该限量将扩大为含有全部单元格,直到空白行和空白列。那个扩充的界定被称为叁个区域。所以,例如,你只怕有二个限量,它含有2个表格中的多少个单元格,以获得包罗全部表格的限定(借使该表由空白的行和列组成),您将利用较小范围的CurrentRegion属性重回整个案子

get_End方法是对与Range相关联的区域起效果的章程。
get_End方法接受XlDirection枚举的积极分子:xlDown,xlUp,xlToLeft或xlToRight。当xlUp传递的办法再次回到与Range范围左上角的单元格相同的列中的最上边的单元格。当通过xlDown时,它回到与Range的左上角单元格相同的列中的最下边包车型地铁单元格。当通过xlToLeft时,它回到与Range的左上角单元格相同行中的最右侧的单元格。当通过xlToRight时,它将回来与Range的左上角单元格相同行中的最右侧的单元格。

选择Range
你能够行使范围上的选拔情势使范围当前增选。记住,拨打选拔会改变用户的当下挑选,这不是壹件很好的业务,没有很好的理由。不过,在1些景况下,您愿意将用户的注意力吸引到一点意况下,在选拔范围的景况下得以做到那或多或少。

编辑Range的值
见惯司空选拔二种方式来得到和设置限制内的值。第二种方法是选拔get_Value和set_Value方法。第三种方式是选取品质Value二。
Value2和get_Value的分别在于,Value2属性重临的要素是通货或日期作为双重值。而且,get_Value也经受XlRangeValueDataType类型的可选参数。假设您传递XlRangeValueData.xlRangeValueDefault,您将再次来到3个表示单个单元格范围单元格值的指标。对于Value2和get_Value,倘使Range包蕴三个单元格,则将回来与Range中单元格相对应的靶子数组。

清单五-3三彰显了运用Value二的多少个示范,包蕴将值数组传递给Value贰的演示。通过数组3遍设置限制内的单元格的值比通过多个调用单独设置各类单元格更有效。

清单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-玖所示。若是在调用Find方法时简短参数,它将选拔上次应用Find对话框时用户设置的任何设置。其余,当你钦赐参数时,钦赐的安装将在下次用户打开时显得在“查找”对话框中。

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

亚洲必赢官网 26

Find方法运用表5-1第88中学讲述的累累参数。
Find重回三个Range对象,若是它成功,假使找不到任何事物,则赶回null。
您能够运用FindNext方法找到与您的搜寻条件格外的下多少个单元格。
FindNext必要二个可选的After参数,您供给传递上一个找到的限制,以确定保障您不会再三遍找到同样的单元格。
清单五-34来得了采纳Find和FindNext方法的以身作则,个中大家探寻包含字符“2”的别的单元格,并加粗这一个单元格。

表伍-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提供了两种艺术和总体性来格式化一文山会海单元格。最得力的是NumberFormat属性,您能够将其安装为格式化与“格式化单元格”对话框的“自定义”类别中的字符串相对应的字符串。例如,您可以将NumberFormat设置为“常规”,不设置一定的数字格式。将NumberFormat设置为m
/ d /
yyyy设置日期格式,0%将格式设置为百分比格式。当使用NumberFormat时,假若你正在营造控制台应用程序或加载项,请务必想念本章后边的“特殊Excel难题”1节中研讨的区域安装难题,因为读取和装置此字符串大概会在差异的运营时造成难题语言环境。借使你在工作簿或模板项近来面使用VSTO代码,则无需担心语言环境难点。

Font属性再次来到一个Font对象,可用以将Font设置为种种大小和体裁。清单5-34突显了用于加粗单元格字体的Font对象的示范。

Excel还同意你创建与工作簿相关联的体裁,并将那几个样式应用于范围。您能够动用Workbook.Styles创建样式。清单伍-3伍呈现了创制样式并将其使用于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营造的文书档案消除方案后边的代码中不会合世此题材。
例如,假若要为范围设置公式并且位居罗马尼亚(罗曼ia)语区域设置中,则Excel要求你使用本地化的德语公式名称和格式:

 

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

这种作为与单身于言语环境的缓解方案背后的VBA和VSTO代码差异。
VBA和VSTO总是告诉Excel,该语言环境是United States波兰语(locale id 103三)。
在解决方案中的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";

该值也许由二〇〇三年一月10日,2000年二月三十一日,或200三年10月十九日由Excel解释,具体取决于当前线程的区域安装。

对于日期,您有一个显然的化解形式。 不要将日期作为文字字符串传递给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相关的难点的缓解方案是保留线程的区域设置,近来将线程的区域安装切换为匈牙利(Hungary)语(区域安装ID
拾3③),执行设置的代码或获得受区域设置影响的性能(如NumberFormat或Formula),然后切换回保存的区域设置。不提议采用此情势,因为它会影响不期望当地调换机的别样加载项。

请考虑以下示例。您的加载项正在法国机械上运转。您的加载项将区域设置切换来⑩33并安装公式值。另一个加载项是拍卖Change事件并展现二个对话框。该对话框以英文而不是乌克兰语突显。由此,通过更改线程区域安装,您曾经变更了另3个加载项的表现,并且1般是倒霉的Office公民。

行使反思来缓解地点难题
遭遇区域设置难题的COM加载项或自动化可执行文件的建议化解方法(访问受当前语言环境影响的习性(如NumberFormat或Formula属性)时)是经过反射访问那么些属性。反射使你可以钦赐Excel的英文区域设置,并编制无论当前线程区域安装哪些的代码。清单5-叁7认证了什么样使用反射来设置NumberFormat和Formula属性。

清单伍-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语言环境难题更是复杂化的第二个难点是,在将语言环境设置为非塞尔维亚共和国(Republic of Serbia)语区域设置的微处理器上的英文Excel安装中使用Excel对象模型时,大概会接到“旧格式或无效类型库”错误。
Excel正在程序文件\ Microsoft Office \ OFFICE11 \
103三中找到三个名字为xllex.dll的文件,它找不到。消除此难点的法子是安装xllex.dll文件或安装Office的MUI语言包。您仍可以够复制excel.exe,将其重命名叫xllex.dll,并将其复制到103三索引。

VSTO和Excel语言环境难点
文书档案化解方案后的VSTO代码通过选取位于您和Excel对象模型之间的透西楚理对象来化解Excel区域设置难点。此代理总是告诉Excel,该语言环境是U.S.A.立陶宛语(locale
id
1033),那实惠地使VSTO匹配VBA行为。假若您在文书档案化解方案前边使用VSTO代码,则会为你化解Excel语言环境难点,您不要再进一步担心。假诺你正在为Excel或自动化可执行文件营造托管COM加载项,则难题照旧存在。

VSTO对Excel语言环境难题的解决方案有部分注意事项。
VSTO透宋朝理能够稍微放慢代码的进度。它也会造成Excel对象在调节和测试器中检查时显示略有差异。最终,如若您使用Equals运算符将代理的Excel对象(如Application)与未采取的Application对象举办比较,则它们将不会被评估为相等。

假设要绕过一定对象的VSTO透汉朝理,能够采取Microsoft.Office.Tools.Excel.ExcelLocale103叁Proxy.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日期转换为DateTime
Excel能够以三种格式表示日期:一九〇二格式或壹九零1格式。
一九零二格式基于3个连串,当转换为八个数字时,它表示从一九零2年七月7日起的已长逝的天命。一玖零三格式是依照贰个系列,当转换为一个数字时,它代表已过的造化自1九零零年5月15日起,一九零二年格式由最初的Macintosh总计机引入,因为我们稍后描述的一九〇三格式的题目。您能够经过检查Workbook.Date一九〇5属性来明确工作簿正在使用的格式,如若工作簿使用1903格式,则赶回true。

要是Excel工作簿使用1九零三格式,并将日期从该工作簿转换为DateTime直接,则会拿走错误的值。由于DateTime期望1九零肆年的格式,由数字代表的Excel日期的值是一⑨零一年二月三日过后,而不是一九零壹年10月113日事先的通过天数,因而将关门肆年和二个闰年。因而,此代码借使你在工作簿中运用一九零零格式,将会付出错误的日龙时间。

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

要取得一玖〇伍格式的日子为DateTime格式,您必须抬高一9零四格式日期四年和贰个闰天(以弥补1九零伍年在一玖〇一年而不是1901年的0)。
所以,尽管你编写代码,并动用函数Convert-ExcelDateToDate在清单五-3第88中学,你将获得不错的结果,要是利用1903日期系统。

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

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

清单五-38还对1905格式日期举办了校正。 事实表明,当莲花汽车1-贰-叁写成时,程序员错误地认为一玖零零年是一个闰年。
当Microsoft写Excel时,他们盼望确认保证它们与现有的Lotus1-贰-三电子表格保持包容,使其能够总计自189玖年十月16日的话的运气,而不是一九〇二年14月十五日。当DateTime为
写的,它的成立人未有打算回溯到189玖年3月二日,它是从一九〇二年3月二八日初叶总计的。所以为了将1903年7月二三二十七日以前的一九〇三年格式的Excel日期正确地变换来DateTime,你不可能不添加一天。

末尾,Excel不能够代表一玖零4年1月七日此前一九零四年格式的光阴,1900年七月四日事先的日期,以一九〇三年格式。
因而,当您将DateTime转换为Excel日期时,必须传递多少个字符串而不是意味着date的数字,因为这几个日子不能够在Excel中意味为日期(仅作为字符串)。

结论
本章研讨了Excel对象模型中的1些最首要的对象。
大家在后续章节的Excel示例中应用了许多这个指标。
在第3壹章“在Excel中选用XML”中,大家还考虑了部分用来在Excel中运用XML的别的Excel对象模型对象。

本章描述了由Excel的根本互操作程序集定义的那些目的。
您应该专注到,VSTO扩张了这几个目的(Workbook,Worksheet,Range,Chart,ChartObject和ListObject),以添加1些附加功能,如数据绑定帮忙。
本书第一有些考察了那个增添。

 

网站地图xml地图