【美高梅开户网址】应用Excel条件格式,助你笑傲Excel江湖

Excel中的条件格式功效是个十二分强大且便于的功效,通过对选择规范格式功能能够在非常的大程度上更上一层楼表格的规划和可读性,用户能够内定单个或许七个单元格区域动用一种或许多样格式,如此1来,也在大大升高了报表的可操作性。上面将介绍在C#编制程序中什么来设置并应用Excel条件格式。

上壹篇小说中介绍了有关设置Excel条件格式,包含基于单元格值、自定义公式等采用条件格式、应用数据条规则类型格式、删除条件格式等剧情。在本篇小说上校继续介绍C#
设置条件格式的主意。

使用Range对象
Range对象表示电子表格中的单元格范围。范围能够包涵二个单元格,四个接二连三的单元格,甚至多个不总是的单元格。您能够在Excel中挑选时按住Ctrl键接纳多个不连续的单元格。

闲话Microsoft Excel

美高梅开户网址 1

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

从1玖八五年的率先款Excel(只用于Mac系统)诞生于今,Microsoft
Excel已经33岁,现时正当而立之年!作用最好强大,但对广阔使用者而言,Microsoft
Excel同时也卓殊混乱。一人想要完全可行控制和利用Microsoft
Excel的全数作用的话,能够说是不只怕成功的任务(Mission
Impossible!)。而实质上对于多数人而言,日常生存和办事中能用到的和常用的意义实在并不多,而且尽管如此,Microsoft
Excel也1度帮大家很好地处理了诸多职分了!

正所谓,“过犹不比”,我们向来不要求为了利用工具而选用工具,大家的对象是缓解难题和到位任务!(题外话:大家的指标是星辰大海~~)由此,大家并不要求明白和驾驭Microsoft
Excel的有着有关文化,而只必要通晓这一个大家有要求掌握的就能够了!

本篇小说就为大家介绍Microsoft
Excel中的二个格外有效的功效和用法,希望能够使大家的办公生活有点轻松1些!(^_^)

以身作则要点概述:

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

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

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

  4. 去除条件格式

  肆.一 删除钦定数量范围中的条件格式

  4.二 删除全体尺码格式

要点概述:

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

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

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

 

获得一定Cell或Cells范围对象
Excel提供了七种到手Range对象的不贰秘籍。
Range对象是您要在Excel工作表中处理单元格或单元格范围时采取的指标。在Application对象的叙说中关系了三种获得Range对象的法子。
Application.ActiveCell在移动窗口中回到活动选取的左上角单元格。
Application.Selection再次来到1个意味活动窗口中移动选取的靶子。如若移动选拔是单元格范围,则足以将Application.Selection转换为Range对象。借使在运动窗口(例如形状或图表)中选用了任何采用,Application.Selection将重临所选对象。

1.SUMIFS:

SUM函数是MS Excel中最基本也最实用的函数之一,相信我们早就已经用得烂熟了!它经过三个不难的公式就能够长足增进大批量的多寡,节省了不可枚举钟头的用手指一个键一个键地敲总括器的年月。不过,SUM函数的通用性也正因为其简要而惨遭制裁,因而大家要介绍的SUMIF(S)等函数该出场了!

若果你有三个巨大的销售数据表,在那之中包罗销售总额、商行、城市、售出产品和产品销售月份等目标:

美高梅开户网址 2

销售数据表

SUM函数能够很简单地抬高出总销售额,不过你的COO那时只想要纸巾的总销售额,怎么做吧?别担心,相当粗略,大家使用SUMIF函数来计算:

美高梅开户网址 3

SUMIF函数

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

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

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

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

接下去,假若你的小业主想要香江的办公椅的总销量,而且还尽管由你的同事赵陆负责的(纵然第三影响是,“又不是本人承担的,干嘛让自家来总括”。但人家毕竟是业主,又怎么好意思怼回去啊?),那又该怎么处理啊?挠头,觉得不容许?放心,有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的括号里,搜索范围、筛选标准的11是不一致等的哦!

本来啦,我们也能够采纳别的一种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对象的最常用方法。此方式接收能够传递字符串的必备对象参数。它有着能够传递首个字符串的第1个可选参数。您传递的字符串是所谓的A1样式参考格式。解释A1样式参考格式的最简易的点子是付出多少个例子。

2.Find/Mid:

Find/Mid函数组合为自个儿在MS
Excel中节省的岁月,恐怕是持有函数中最多的。它(们)是能够从单元格中提取文本块的少数多少个Excel函数之壹。甚至足以说它(们)是最管用的函数,因为能够操作它(们)跨越数千个单元格而有所同样的公式。

以身作则代码(供参考)

测试文档如下:

美高梅开户网址 6

C#代码示例(供参考)

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

MID:

美高梅开户网址 7

MID函数

MS Excel 201陆中,Mid函数的定义是:MID
再次来到文本字符串中从钦赐地方上马的一定数指标字符,该数量由用户钦命。

像Left和Right函数一样,Mid函数也得以从单元格中提取文本。首先,引用单元格从中提取文本。然后,重返从钦赐地方上马的须要多少的字符。例如:

美高梅开户网址 8

MID函数用法示例

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

*小提示:重临结果是从第1陆个字符初始的,即将第一四个字符作为重回值的第三个,然后向右数一、二、三…拾,重返总结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也指的是第3行列A中的单元格。假使在A一体裁引用中使用$符号,则它们将被忽略。

FIND:

美高梅开户网址 11

FIND函数

MS Excel 二零一四中,Find函数的概念如下:函数
FIND用于在其次个文本串中平昔第1个文本串,并再次回到第二个文本串的起第1人置的值,该值从第一个公文串的第3个字符算起。

读起来有点生硬是或不是?其实很简短。Find函数将在单元格中找到2个字符串,并回到第二个字符的位置数。大家用平等的多寡来比喻:

美高梅开户网址 12

FIND函数用法示例

“are” 在单元格D一里是从第20个字符起头的。

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

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

那正是说以后让大家选择上边包车型地铁事例来对FIND/MID的整合使用进行验证呢!

【美高梅开户网址】应用Excel条件格式,助你笑傲Excel江湖。第一,比如有二个网站:ttp://www.gamersky.com/news/201612/843064.shtml 
(注脚一:举这一个网站为例未有任何企图,只是因为刚刚作者打开了这几个网页在看消息。)
(注脚二:特意删除掉了第三个字母h,实际演示的Excel文书档案中是部分。)

假若你须求从那么些网站中提取页面ID号(在本例中为84306肆)。
数字从第1二十一个字符起始,由此你可以动用= Mid(单元格,三7,陆)重回ID号。

美高梅开户网址 13

FIND_MID组合用法示例

MS
Excel的函数之所以强大,就在于函数能够互为组合使用。上边的例证中,=MID(A壹,叁7,六)中的开头地方三七是怎么得到的吧?有人说,大家得以三个贰个从左到右数过去啊。也有人说,就算网站十分长那岂不是要累死,而且难免不会数错!说的对,所以大家就把数数的劳作付出强大的Excel去做,大家等它的结果就能够了。让大家把上边的公式稍微改变一下:

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

我们观看到,ID号有6人数,并且是从处于最右侧的无比的shtml字符串的左侧第拾三个字符开首的,所以大家就把原来的公式改造成了地点的规范。那下不用大家2个字符贰个字符地数了啊?

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

【示例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

 

 

你能够接纳范围运算符(:)来钦命单元格范围,在那之中第二个A一体裁引用是限量的左上角,后跟贰个冒号运算符,之后是右下角的第2个A一体制引用的限定。参考A①:B1指的是行一,列A和列1,列B的五个单元格。参考A一:AA11是指块中的所有2九八个单元格,其左上角位于第贰列,第A列和下侧右角位于第2一列,AA栏(第贰7列)。

3.LEN函数+条件格式

大家日常索要写一些事物,但因为有字数限制,所以创作的进度并不都以那么兴高采烈——经常一十分的大心字数就跨越限制了。那么借助于MS
Excel我们能够有点子提示自个儿只顾呢?

答案是必然的。大家只需采取LEN函数和“条件格式”就能够很好地拓展字符限制跟踪提示了!

MS Excel 201六中,Len函数的定义:LEN 重临文本字符串中的字符个数。

很不难懂啊!LEN函数格外简单——只回去给定单元格中的字符数。我们如故来看例子吗!

美高梅开户网址 16

LEN函数用法示例

观望上边那张图纸了呢?都以自家发过的腾讯网(嘻嘻)。如果本身供给你计算每一种单元格的字符数,然后告诉小编那1个单元格里超过了70个字(符),你会不会想打作者?(笔者躲~~)

再想象一下要是以往1共有三千个那样的单元格,你又怎么着飞快准确地看清哪些超出了字数限制,哪些没超越呢?

好啊,让自身来演示一下吗。首先大家选中B列,然后点击“开首”选项卡里面包车型大巴“条件格式”,在弹出的选项中接纳“杰出体现单元格规则”之“大于…”

美高梅开户网址 17

LEN函数用法示例二

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

美高梅开户网址 18

LEN函数用法示例三

如上海体育地方所示,点击“分明”后,在B1单元格里输入LEN函数并引述文本单元格:

=LEN(A1)

美高梅开户网址 19

LEN函数用法示例四

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

美高梅开户网址 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一,C4钦赐了第二个单元格位于第2列,第A列,第三个单元格位于第陆列第C列的多个单元格的界定。用户能够由此按住Ctrl键来挑选单元格的不三番五次范围因为她们选取各个细胞。参考A一,C四,C8,C10是点名多个例外单元格的另贰个得力的A1体裁参考。

结语

虽说本篇小说并不曾为你提供Microsoft
Excel在那之中全部与你或你的事体有关的始末,但自身的确希望能够为你提供部分更高级别的应用范例和甄选。笔者相信,了然和左右了这几个用法之后,应该能够为您或你的业务节省下许多难得的日子,并提供更好的数额阅览和剖析参考。

交点运算符(三个空格)能够钦定单元格的交集。例如,参考A一:A⑩A伍:A一四分析为从行5,列A初叶并以行A,列A初叶的交接七个单元。参考A一:A10A5:A一5 A五解说为第伍行的单个单元格,列A.

您仍是能够动用你在A壹样式参考中在工作表中定义的任何名称。例如,要是您定义了指向单元格A壹的名叫foo的名目范围。使用你的名目标某些实用的A壹体制的引用将席卷foo:A2,其引述行1,列A和行2,列A的单元格。引用foo,A5:A6是指第一行,第A列;第肆行,A列;和第5列,列A。

如前所述,get_Range方法运用第3个可选参数,您能够传递第四个A1样式的引用字符串。使用范围运算符有效地结合率先个参数和第三个参数。因而,当调用get_Range(“A1”,“A2”)时,get_Range再次回到的范围等同于调用get_Range(“A1:A2”,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对象的另一种方法是行使Worksheet.Rows或Worksheet.Columns属性。那么些重回二个与任何Range对象差别的界定。例如,如果你使用Column重返的限制并展示范围内的单元格数,则赶回256列数。可是即使你在重回的限定内调用Select方法,Excel将在劳作表中选取具有1陆,772,二17个单元格。思考Rows和Columns再次回到的限制的最不难易行的秘籍是它们的一颦一笑与列和行标题在Excel中的行为相似。

清单5-27展现了选拔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";
}

图5-7  运转结果清单五-27

美高梅开户网址 24

使用Address
给定三个Range对象,你时常索要鲜明它所指的单元格。
get_Address方法再次回到A壹体制或凯雷德1C一样式范围的地点。
您已经明白了A一样式的引用。
卡宴1C一样式的引用辅助与A1体制引用(范围为冒号,联合逗号和交叉空间)探讨的具有同一的运算符。
宝马7系一C一样式的引用分别以PRADO和C最先的行和列号。
所以奥德赛一C一作风的单元格丰田皇冠将是哈弗4C壹。
图5-八显得了大家在本节初级中学结业生升学考试虑的多个地点的限定。

图伍-8  具有三个不一而再区域的限定

 美高梅开户网址 25

图五-第88中学范围的地点以A①体裁和LX570壹C一样式出示:

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

获得地址的另一个挑选是得到外部引用如故本地引用。
我们曾经在图伍-第88中学呈现的地址是本地引用。
外部引用包含限制所在的工作簿和工作表的称谓。
在图伍-8中,与A一风格和Tiguan一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

获取地址的另一个选项是利用相对化地址依旧采用相对地址。
咱们已经思考过的地点是纯属的。
相对格式(相对于单元格A1)的同壹地方如下所示:

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

对于陆风X八一C一样式的位置,您还是可以钦命希望地点绝对的单元格。
要是大家在图5-4中相对于单元格B2取得了Sportage一C1样式,我们赢得以下结果:

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

get_Address方法应用多个可选参数来决定引用的回来格局,如表伍-壹柒所示。

表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样式引用一起使用时不起作用。

 

清单5-28体现了使用示例范围的get_Address的多少个示范。

清单5-28  使用get_Address的VSTO自定义

private void Sheet1_Startup(object sender, System.EventArgs e)
{
  Excel.Range range1 = this.get_Range(
    "$A$15:$F$28,$H$3:$J$9,$L$1", missing);

  System.Text.StringBuilder sb = new System.Text.StringBuilder();
  sb.AppendLine("A1-Style Addresses:");
  sb.AppendFormat("Default: {0}\n", range1.get_Address(
    missing, missing, Excel.XlReferenceStyle.xlA1,
    missing, missing));

  sb.AppendFormat("Relative rows: {0}\n",
    range1.get_Address(false, missing,
    Excel.XlReferenceStyle.xlA1, missing, missing));

  sb.AppendFormat("Row & Column Relative: {0}\n",
    range1.get_Address(false, false,
    Excel.XlReferenceStyle.xlA1, missing, missing));

  sb.AppendFormat("External: {0}\n", range1.get_Address(
    missing, missing, Excel.XlReferenceStyle.xlA1,
    true, missing));

  sb.AppendLine();
  sb.AppendLine("R1C1-Style Addresses:");
  sb.AppendFormat("Default: {0}\n", range1.get_Address(
    missing, missing, Excel.XlReferenceStyle.xlR1C1,
    missing, missing));

  sb.AppendFormat("Row & Column Relative to C5: {0}\n",
    range1.get_Address(false, false,
    Excel.XlReferenceStyle.xlR1C1, missing,
    this.get_Range("C5", missing)));

  sb.AppendFormat("External: {0}", range1.get_Address(
    missing, missing, Excel.XlReferenceStyle.xlR1C1,
    true, missing));

  MessageBox.Show(sb.ToString());
}

行使运算符方法创制新的范围
我们谈论了足以在地方字符串中利用的多少个“运算符”,包蕴联合运算符(逗号)和交集运算符(空格)。
您仍是能够通过Application.Union和Application.Intersection方法运用这一个操作符。

也得以由此使用get_Offset方法取三个范围并赢得一个与之相距一些行和列的新范围。
该办法运用行和列值来偏移给定范围并赶回新的舞狮范围。
所以在图5-捌的言传身教范围中调用get_Offset(5,五)再次回到多少个那样的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
当3个范围内设有多个不一连的单元格范围时,每种不一而再的限制称为多个区域。
如若Range中有八个不接二连三的区域,请使用Areas属性通过Areas集合访问每个地区(作为Range)。
Areas集合具有1个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只会重回单元格的界定中的第一个区域。

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

你还可以动用“行”和“列”属性来鲜明首个区域中的行和列的总额。那几个属性重返特殊范围,您能够将其正是对应于与范围相关联的行或列题目。当大家从图5-第88中学的示例范围获得Rows.Count时,它回到1四,Columns.Count重返6.那是有道理的,因为大家挑选的首先个区域(A一伍:F2八)跨越陆列和1四行。

要拿走第一个区域右下角的行和列地点,能够利用清单五-32所示的一定为难的表明式。清单伍-3二还表明了使用get_Item,它使用行和列索引(相对于给定范围的顶部),并回到该行和列索引处的单元格(作为限制)。当您取得二个Rows或Columns范围时,这么些限制是1维的,在那种情景下,称为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属性再次回到叁个范围,该限制将扩张为带有全体单元格,直到空白行和空白列。那些扩大的限定被号称三个区域。所以,例如,你或然有三个范围,它富含一个表格中的多少个单元格,以得到包括整体表格的限制(借使该表由空白的行和列组成),您将接纳较小范围的CurrentRegion属性重返整个案子

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

选择Range
美高梅开户网址,你能够运用限制上的取舍格局使范围当前甄选。记住,拨打选取会变动用户的脚下选用,那不是一件很好的业务,未有很好的说辞。不过,在少数情状下,您希望将用户的集中力吸引到一些意况下,在挑选范围的景观下可以形成那点。

编辑Range的值
普通使用三种艺术来赢得和装置限定内的值。第三种格局是运用get_Value和set_Value方法。第一种艺术是采用品质Value2。
Value贰和get_Value的分裂在于,Value二属性再次回到的成分是货币或日期作为双重值。而且,get_Value也接受XlRangeValueDataType类型的可选参数。假若你传递XlRangeValueData.xlRangeValueDefault,您将回到二个代表单个单元格范围单元格值的靶子。对于Value二和get_Value,假诺Range包涵几个单元格,则将再次来到与Range中单元格绝对应的对象数组。

清单5-3三显示了运用Value2的多少个示范,包蕴将值数组传递给Value2的言传身教。通过数组一次设置限定内的单元格的值比通过多少个调用单独设置每一个单元格更使得。

清单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对话框时用户安装的其余设置。其余,当您钦命参数时,钦点的装置将在下次用户打开时展现在“查找”对话框中。

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

美高梅开户网址 26

Find方法应用表5-1第88中学讲述的无数参数。
Find重回3个Range对象,固然它成功,就算找不到其余交事务物,则赶回null。
您能够选拔FindNext方法找到与您的搜寻条件合营的下二个单元格。
FindNext供给二个可选的After参数,您要求传递上2个找到的限量,以确定保证您不会再二次找到同样的单元格。
清单五-3肆展示了动用Find和FindNext方法的示范,当中大家探寻包罗字符“二”的别样单元格,并加粗这么些单元格。

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

格式化1星罗棋布单元格
Excel提供了三种格局和总体性来格式化一多元单元格。最管用的是NumberFormat属性,您能够将其设置为格式化与“格式化单元格”对话框的“自定义”体系中的字符串相呼应的字符串。例如,您可以将NumberFormat设置为“常规”,不安装一定的数字格式。将NumberFormat设置为m
/ d /
yyyy设置日期格式,0%将格式设置为百分比格式。当使用NumberFormat时,假使你正在营造控制台应用程序或加载项,请务必思索本章后边的“特殊Excel难点”1节中探讨的区域设置难题,因为读取和安装此字符串大概会在分裂的运作时造成难题语言环境。若是您在工作簿或模板项近日面使用VSTO代码,则无需担心语言环境难题。

Font属性再次回到1个Font对象,可用于将Font设置为种种大小和样式。清单5-3四出示了用于加粗单元格字体的Font对象的示范。

Excel还允许你创立与工作簿相关联的样式,并将这个样式应用于范围。您可以利用Workbook.Styles成立样式。清单五-3伍来得了创制样式并将其行使于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供给你使用本地化的菲律宾语公式名称和格式:

 

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

那种作为与独立于言语环境的缓解方案背后的VBA和VSTO代码分化。
VBA和VSTO总是告诉Excel,该语言环境是美利坚合众国斯洛伐克语(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";

该值可能由2004年五月一日,2003年1月二八日,或200三年二月22日由Excel解释,具体取决于当前线程的区域安装。

对此日期,您有多少个强烈的消除措施。 不要将日期作为文字字符串传递给Excel。
相反,使用System.DateTime对象创设日期,并选取DateTime的ToOADate方法将其传递给Excel,如代码清单五-3陆所示。
ToOADate方法将DateTime转换为OLE自动化日期,那是Excel对象模型期望的日期格式。

清单五-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
十33),执行设置的代码或取得受区域安装影响的性质(如NumberFormat或Formula),然后切换回保存的区域安装。不提议使用此办法,因为它会潜移默化不指望本地调换机的其它加载项。

请思量以下示例。您的加载项正在法兰西共和国机械上运转。您的加载项将区域安装切换成拾3三并安装公式值。另2个加载项是处理Change事件并展现一个对话框。该对话框以英文而不是土耳其共和国(The Republic of Turkey)语展现。因而,通过更改线程区域设置,您曾经转移了另2个加载项的一举一动,并且一般是不成的Office公民。

动用反思来缓解地点难题
遇见区域设置难题的COM加载项或自动化可执行文件的建议解决方法(访问受当前语言环境影响的习性(如NumberFormat或Formula属性)时)是透过反射访问那一个属性。反射使您能够内定Excel的英文区域设置,并编写制定无论当前线程区域安装哪些的代码。清单5-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 \
103三中找到1个名称叫xllex.dll的文件,它找不到。消除此难点的方法是安装xllex.dll文件或安装Office的MUI语言包。您仍是可以复制excel.exe,将其重命名称叫xllex.dll,并将其复制到十3三索引。

VSTO和Excel语言环境难点
文档解决方案后的VSTO代码通过接纳位于您和Excel对象模型之间的透南梁理对象来消除Excel区域设置难点。此代理总是告诉Excel,该语言环境是U.S.匈牙利(Hungary)语(locale
id
拾33),那使得地使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文件中的程序集属性ExcelLocale103三安装为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四格式或一九〇一格式。
一九〇〇格式基于二个种类,当转换为二个数字时,它表示从一九零四年3月十八日起的已作古的天数。一九零三格式是依照三个体系,当转换为1个数字时,它代表已过的命宫自一9零零年三月3日起,1903年格式由最初的Macintosh计算机引入,因为我们稍后描述的1905格式的难点。您可以经过检查Workbook.Date一九零伍属性来分明工作簿正在使用的格式,若是工作簿使用一9零贰格式,则赶回true。

借使Excel工作簿使用一九〇〇格式,并将日期从该工作簿转换为DateTime直接,则会取得错误的值。由于Date提姆e期望一玖零一年的格式,由数字代表的Excel日期的值是19零一年八月1二十五日过后,而不是一九〇二年5月三日事先的通过天数,因而将关门四年和一个闰年。因而,此代码若是你在工作簿中运用一九〇一格式,将会付出错误的日猪时间。

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

要博得19零伍格式的日子为DateTime格式,您必须抬高一九零零格式日期四年和3个闰天(以弥补一9〇伍年在一九〇一年而不是一玖〇5年的0)。
所以,若是你编写代码,并动用函数Convert-ExcelDateToDate在清单伍-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;
}

清单伍-3八还对一玖零一格式日期进行了纠正。 事实申明,当Lotus一-2-三写成时,程序员错误地认为190四年是二个闰年。
当Microsoft写Excel时,他们盼望确认保证它们与存活的Lotus一-二-三电子表格保持包容,使其能够总计自189九年八月2十七日的话的运气,而不是一九〇四年10月二10日。当DateTime为
写的,它的创造者未有打算回溯到1899年十月30日,它是从一9〇四年三月123日伊始计算的。所以为了将一玖〇〇年七月三5日事先的一玖〇伍年格式的Excel日期正确地更换成DateTime,你无法不添加一天。

末尾,Excel不能够表示一九零二年二月十四日事先一9零四年格式的日子,1902年17月10日在此以前的日子,以1900年格式。
因而,当你将DateTime转换为Excel日期时,必须传递三个字符串而不是意味着date的数字,因为这个日子不能够在Excel中意味为日期(仅看成字符串)。

结论
本章斟酌了Excel对象模型中的壹些最珍视的靶子。
我们在持续章节的Excel示例中使用了众多那个指标。
在第1壹章“在Excel中应用XML”中,大家还思索了1些用以在Excel中接纳XML的别的Excel对象模型对象。

本章描述了由Excel的首要互操作程序集定义的那个目的。
您应该小心到,VSTO扩大了那一个目的(Workbook,Worksheet,Range,Chart,ChartObject和ListObject),以添加1些增大作用,如数据绑定支持。
本书第一片段调查了那一个扩充。

 

发表评论

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

网站地图xml地图