Excel中的条件格式功能是个至极强劲且有利于的功效,通过对应用条件格式成效可以在很大程度上改正表格的宏图和可读性,用户可以钦命单个或许八个单元格区域使用1种只怕两种格式,如此1来,也在大大提升了报表的可操作性。上边将介绍在C#编制程序中如何来设置并应用Excel条件格式。

上一篇作品中介绍了有关设置Excel条件格式,包蕴基于单元格值、自定义公式等选取条件格式、应用数据条标准类型格式、删除条件格式等情节。在本篇文章上将继续介绍C#
设置标准格式的办法。

使用Range对象
Range对象表示电子表格中的单元格范围。范围能够包涵三个单元格,四个一连的单元格,甚至七个不三番五次的单元格。您能够在Excel中选拔时按住Ctrl键选取四个不三番五次的单元格。

闲话Microsoft Excel

金沙注册送58 1

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

从1985年的率先款Excel(只用于Mac系统)诞生到现在,Microsoft
Excel已经三1五虚岁,现时正当而立之年!作用最好强大,但对广阔使用者而言,Microsoft
Excel同时也10分混乱。一位想要完全可行控制和运用Microsoft
Excel的有所机能的话,能够说是不也许实现的天职(Mission
Impossible!)。而实质上对于绝超越1/4人而言,平时活着和行事中能用到的和常用的遵守实在并不多,而且即使如此,Microsoft
Excel也早就帮咱们很好地拍卖了诸多职务了!

正所谓,“过犹不比”,大家未有须求为了利用工具而选拔工具,大家的靶子是缓解难题和完结职分!(题外话:我们的目的是星辰大海~~)因而,大家并不须求驾驭和左右Microsoft
Excel的具备相关知识,而只供给明白那两个大家有不能缺少精晓的就能够了!

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

演示要点概述:

  1. 听新闻说单元格值应用条件格式

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

  3. 运用数据条标准类型格式

  4. 应用Excel条件格式,设置Excel条件格式。删除条件格式

  4.一 删除钦赐数量范围中的条件格式

  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中最中央也最管用的函数之①,相信大家早就已经用得烂熟了!它通过一个简单易行的公式就足以高速增加多量的数码,节省了众多小时的用指尖3个键3个键地敲总结器的年月。可是,SUM函数的通用性也正因为其简要而饱受掣肘,由此大家要介绍的SUMIF(S)等函数该出场了!

若果你有二个巨大的销售数据表,当中囊括销售总额、商家、城市、售出产品和成品销售月份等目的:

金沙注册送58 2

销售数据表

SUM函数能够很容易地加上出总销售额,不过你的经理娘那时只想要纸巾的总销售额,如何做呢?别担心,很简单,我们应用SUMIF函数来总结:

金沙注册送58 3

SUMIF函数

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

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

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

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

接下去,如果你的小业主想要东京的办公椅的总销量,而且还假如由你的同事赵陆负责的(即使第三感应是,“又不是自家负责的,干嘛让本人来总括”。但住户究竟是高管,又怎么好意思怼回去啊?),这又该怎么处理啊?挠头,觉得不或然?放心,有SUMIFS在,没什么不容许!(Nothing
is Impossible!倒霉意思,广告看太多了。)

逆天的SUMIFS函数允许你使用多少个规格,就也正是是抓牢版的SUMIF:

金沙注册送58 4

SUMIFS函数

在SUMIF的末端增添三个S,就如匈牙利(Hungary)语里的单数、复数形式呢!微软真是会造词啊!

那贰次,从需必要和的值初始,逐步丰盛每个需求的筛选标准。最后结出应当是那般的:

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

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

解释一下:简单地说,正是告诉MS
Excel,首先哪些列里有我们须要的数据,然后依据筛选标准筛选出确切的值,最终求和。只可是,条件多了一点点!

*小提醒:SUMIF和SUMIFS的括号里,搜索范围、筛选标准的依次是不雷同的哦!

本来啦,大家也足以采纳其它壹种MS
Excel中千篇壹律既简约又功效强大的工具:数据透视表来得到依照这么些筛选标准所分离出来的具备数据的完好视图。可是,SUMIFS函数也有其独特别降价点,它能够选择和过滤掉大数量集中的多少,而并不须要处理全部的相干或不相干的数据。

利用工具

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

 

选拔工具:

  • Spire.XLS for
    .NET

注:在编写制定代码时注意在先后中添加引用Spire.Xls.dll,dll文件可在设置路径下的Bin文件夹中得到。

金沙注册送58 5

工作表还提供了三种得到Range对象的法子。
Worksheet.get_Range方法是从工作表获取Range对象的最常用方法。此办法接收能够传递字符串的须求对象参数。它富有能够传递第三个字符串的第一个可选参数。您传递的字符串是所谓的A壹体制参考格式。解释A一体裁参考格式的最简便易行的方法是交给多少个例证。

2.Find/Mid:

Find/Mid函数组合为自身在MS
Excel中节省的大运,恐怕是负有函数中最多的。它(们)是能够从单元格中领取文本块的个别多少个Excel函数之壹。甚至足以说它(们)是最实用的函数,因为能够操作它(们)跨越数千个单元格而富有同样的公式。

以身作则代码(供参考)

测试文书档案如下:

金沙注册送58 6

C#代码示例(供参考)

参考A1点名A列1行的单元格。参考D2二点名D列2二行的单元格。参考AA1壹钦点行11,列AA(第37列)处的单元格。

MID:

金沙注册送58 7

MID函数

MS Excel 201六中,Mid函数的概念是:MID
再次来到文本字符串中从钦定地方上马的一定数目的字符,该数据由用户钦命。

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

金沙注册送58 8

MID函数用法示例

通过使用Mid函数,Excel将引用单元格D一(MS Excel functions are so amazing
cool),找到第1多少个字符,然后从11分地方上马向后,重返前13个字符。
一点也不细略吗!

*小提醒:重回结果是从第叁多少个字符开头的,即将第贰五个字符作为重返值的第3个,然后向右数1、二、三…10,重临计算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");
        }
    }
}

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

金沙注册送58 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");
        }
    }
}

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

 金沙注册送58 10

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

FIND:

金沙注册送58 11

FIND函数

MS Excel 201陆中,Find函数的定义如下:函数
FIND用于在其次个文本串中一向第三个文本串,并赶回第3个文本串的起第伍人置的值,该值从第三个公文串的首先个字符算起。

读起来有点生硬是还是不是?其实相当的粗略。Find函数将在单元格中找到八个字符串,并再次来到第多少个字符的地方数。我们用同样的多寡来比喻:

金沙注册送58 12

FIND函数用法示例

“are” 在单元格D一里是从第30个字符伊始的。

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

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

这正是说今后让我们接纳上面包车型大巴事例来对FIND/MID的组成使用进行表达呢!

先是,比如有三个网址:ttp://www.gamersky.com/news/201612/843064.shtml 
(申明一:举这一个网站为例未有另国企图,只是因为刚刚作者打开了那么些网页在看资讯。)
(表明二:特意删除掉了第一个字母h,实际演示的Excel文书档案中是有的。)

如若你须求从那几个网站中领取页面ID号(在本例中为84306四)。
数字从第二八个字符发轫,因此你能够使用= Mid(单元格,3七,陆)重返ID号。

金沙注册送58 13

FIND_MID组合用法示例

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

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

小编们观察到,ID号有陆个人数,并且是从处于最右侧的独一无贰的shtml字符串的左边第伍个字符起初的,所以大家就把原来的公式改造成了上边的典范。这下不用大家多少个字符1个字符地数了啊?

MID和FIND的整合能够发挥出巨大的效率,给我们处理多少拉动最棒的便民。具体的例证这里就不多列举了,我们先品尝起来呢!须知,“眼过千遍,不比手过二遍”!

【示例贰】应用数据条类型的原则格式

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

测试结果:

金沙注册送58 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");
        }
    }
}

测试结果:

 金沙注册送58 15

 

 

您能够应用范围运算符(:)来内定单元格范围,当中第一个A1样式引用是限量的左上角,后跟1个冒号运算符,之后是右下角的第二个A1体裁引用的限定。参考A壹:B1指的是行1,列A和列1,列B的多少个单元格。参考A一:AA11是指块中的全部2玖七个单元格,其左上角位于第二列,第A列和下侧右角位于第贰1列,AA栏(第壹柒列)。

三.LEN函数+条件格式

我们平常索要写一些事物,但因为有字数限制,所以创作的进度并不都以那么畅快——日常1非常的大心字数就当先限定了。那么借助于MS
Excel大家能够有方法提醒自个儿只顾呢?

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

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

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

金沙注册送58 16

LEN函数用法示例

看样子地点那张图纸了啊?都是自己发过的新浪(嘻嘻)。若是自个儿供给您总计每一个单元格的字符数,然后告诉本人那八个单元格里抢先了七十二个字(符),你会不会想打小编?(作者躲~~)

再想象一下比方未来计算有两千个如此的单元格,你又怎么着火速准确地认清哪些超出了字数限制,哪些没抢先呢?

好啊,让笔者来演示一下吗。首先我们选中B列,然后点击“早先”选项卡里面包车型大巴“条件格式”,在弹出的选项中采纳“优良映现单元格规则”之“大于…”

金沙注册送58 17

LEN函数用法示例二

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

金沙注册送58 18

LEN函数用法示例3

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

=LEN(A1)

金沙注册送58 19

LEN函数用法示例四

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

金沙注册送58 20

LEN函数用法示例伍

“条件格式”里的限制标准“大于”也足以被变更为别的的准绳选取,那全然取决于你的切切实实处理必要。由此,条件格式是10分有效的,而且将它与任何功效结合在1齐的话更是将大家的作业处理能力进步到了2个新的层次,特别是在处理具体的数额内容时!

【示例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. 删去钦命数量范围的准绳格式

金沙注册送58 21

  1. 剔除全部标准格式

金沙注册送58 22

金沙注册送58 ,此番关于“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");
        }
    }
}

测试结果:

 金沙注册送58 23

 

上述内容是本次关于设置Excel表格条件格式的补给介绍,如需转发,请申明出处。

(本文完)

您能够动用联合运算符(,)来内定大概是不总是的五个单元格。例如,参考A一,C4点名了第三个单元格位于第一列,第A列,第一个单元格位于第4列第C列的多少个单元格的限定。用户能够透过按住Ctrl键来摘取单元格的不总是范围因为他们选取各个细胞。参考A1,C4,C捌,C十是内定多少个例外单元格的另1个得力的A1体裁参考。

结语

虽说本篇小说并不曾为您提供Microsoft
Excel个中全数与你或你的作业有关的内容,但本人实在希望能够为你提供部分更高级其他使用范例和甄选。笔者相信,驾驭和驾驭了那么些用法之后,应该能够为您或你的思想政治工作节省下许多弥足爱抚的光阴,并提供更好的数量观望和剖析参考。

交点运算符(五个空格)能够内定单元格的混杂。例如,参考A1:A十A5:A一5剖析为从行伍,列A开首并以行A,列A发轫的交接七个单元。参考A一:A十A5:A1伍 A5演说为第伍行的单个单元格,列A.

你还是能选择你在A1体裁参考中在工作表中定义的别的名称。例如,借使您定义了指向单元格A壹的名称叫foo的名称范围。使用你的名称的局地有效的A一样式的引用将席卷foo:A二,其引用行一,列A和行二,列A的单元格。引用foo,A伍:A六是指第二行,第A列;第4行,A列;和第四列,列A。

如前所述,get_Range方法运用第二个可选参数,您能够传递第一个A1样式的引用字符串。使用限制运算符有效地组合率先个参数和第2个参数。由此,当调用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对象的另1种艺术是行使Worksheet.Rows或Worksheet.Columns属性。那么些再次回到2个与别的Range对象不相同的限量。例如,倘使您使用Column重临的限定并呈现范围内的单元格数,则赶回256列数。不过只要您在回到的界定内调用Select方法,Excel将在工作表中挑选具有1陆,77二,216个单元格。挂念Rows和Columns再次回到的限定的最简便易行的不贰法门是它们的作为与列和行标题在Excel中的行为相似。

清单五-二7体现了运用get_Range方法和Cells,Rows和Columns属性的多少个示范。大家运用限制的Value2属性将范围中的每一个单元格设置为钦命的字符串值。程序的运作结果如图五-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  运营结果清单⑤-二七

金沙注册送58 24

使用Address
给定五个Range对象,你日常索要显著它所指的单元格。
get_Address方法重回A1样式或奥迪Q3壹C一样式范围的地点。
您已经了然了A一体裁的引用。
途乐一C一体裁的引用扶助与A1样式引用(范围为冒号,联合逗号和6续空间)切磋的拥有同壹的运算符。
途达壹C一样式的引用分别以本田UR-V和C初步的行和列号。
所以科雷傲一C1作风的单元格Cruze将是兰德CR-V4C一。
图5-8突显了大家在本节初级中学毕业生升学考试虑的三个方面包车型客车限量。

图5-捌  具有多个不总是区域的限定

 金沙注册送58 25

图5-第88中学范围的地方以A一样式和Tiggo1C1样式显得:

$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

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

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

赢得地址的另叁个取舍是采纳相对化地址依旧选拔相对地址。
大家早就考虑过的地方是纯属的。
相对格式(相对于单元格A1)的同样地方如下所示:

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

对此奥德赛壹C1样式的地方,您仍能内定希望地点相对的单元格。
借使大家在图5-四中相对于单元格B2取得了Qashqai一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所示。

表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方法取3个限制并获得三个与之相距一些行和列的新范围。
该办法运用行和列值来偏移给定范围并回到新的偏移范围。
所以在图5-捌的演示范围中调用get_Offset(5,伍)重临2个这么的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
当三个限制内设有四个不总是的单元格范围时,每种不接二连三的界定称为三个区域。
借使Range中有八个不总是的区域,请使用Areas属性通过Areas集合访问每个地区(作为Range)。
Areas集合具有八个Areas.Count属性和2个Areas.get_Item方法,它将一个象征依照一的目录的int参数作为数组。
清单五-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
给定三个Range对象,您能够利用Row和Column属性来规定其首先个区域的左上角的行和列号。行和列号作为int值重返。

您还足以应用“行”和“列”属性来规定第3个区域中的行和列的总和。这么些属性再次回到特殊范围,您能够将其就是对应于与范围相关联的行或列标题。当大家从图5-第88中学的示例范围得到Rows.Count时,它回到1肆,Columns.Count重返陆.那是有道理的,因为我们选择的率先个区域(A一伍:F28)跨越6列和1四行。

要收获第二个区域右下角的行和列地点,可以选取清单5-32所示的一对1狼狈的表明式。清单5-3二还表明了选取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属性重临二个限量,该限量将扩大为涵盖全数单元格,直到空白行和空白列。这些增添的界定被称作三个区域。所以,例如,你恐怕有三个限量,它含有二个报表中的多少个单元格,以赢得包括整体表格的限定(假如该表由空白的行和列组成),您将选择较小范围的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方法。第两种方法是使用质量Value2。
Value二和get_Value的区分在于,Value二属性重返的因素是通货或日期作为双重值。而且,get_Value也承受XlRangeValueDataType类型的可选参数。假设您传递XlRangeValueData.xlRangeValueDefault,您将赶回2个表示单个单元格范围单元格值的指标。对于Value二和get_Value,若是Range包涵三个单元格,则将回到与Range中单元格相对应的对象数组。

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

清单5-33 使用Value2的VSTO定制

private void Sheet1_Startup(object sender, System.EventArgs e)
{
  Excel.Range range1 = this.get_Range("$A$15:$F$28", missing);
  range1.Value2 = "Test";

  int rowCount = range1.Rows.Count;
  int columnCount = range1.Columns.Count;

  object[,] array = new object[rowCount, columnCount];

  for (int i = 0; i < rowCount; i++)
  {
    for (int j = 0; j < columnCount; j++)
    {
      array[i, j] = i * j;
    }
  }

  range1.Value2 = array;
}

复制,清除和删除Range
Excel提供了1部分复制,清除和删除范围的格局。复制方法运用Destination参数,您能够传递复制范围的目标地。
Clear方法清除限制内的单元格的始末和格式。
ClearContents只清除限制内单元格的值,而ClearFormats仅清除格式。删除方法删除单元格的界定,并作为参数移动单元格替换已去除的单元格的势头。该方向作为XlDeleteShiftDirection枚举的成员传递:xlShiftToLeft或xlShiftUp。

在Range内查找文本
Find方法允许你寻找范围中的文本,并赶回范围内的单元格,其中找到文本。查找方法对应于查找和替换对话框,如图五-九所示。假若在调用Find方法时大约参数,它将运用上次选择Find对话框时用户安装的别的设置。其余,当您钦定参数时,钦赐的安装将在下次用户打开时显得在“查找”对话框中。

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

金沙注册送58 26

Find方法应用表伍-1第88中学描述的好多参数。
Find再次回到一个Range对象,假若它成功,假若找不到别的东西,则赶回null。
您能够利用FindNext方法找到与您的追寻条件相当的下3个单元格。
FindNext须要三个可选的After参数,您必要传递上四个找到的界定,以确定保障您不会再1次找到同样的单元格。
清单5-34显得了动用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);
  }
}

格式化壹密密麻麻单元格
Excel提供了两种办法和性质来格式化1密密麻麻单元格。最得力的是NumberFormat属性,您能够将其安装为格式化与“格式化单元格”对话框的“自定义”种类中的字符串相对应的字符串。例如,您能够将NumberFormat设置为“常规”,不设置一定的数字格式。将NumberFormat设置为m
/ d /
yyyy设置日期格式,0%将格式设置为百分比格式。当使用NumberFormat时,假使你正在营造控制台应用程序或加载项,请务必思考本章前边的“特殊Excel难点”壹节中斟酌的区域设置难点,因为读取和设置此字符串或然会在不相同的周转时造成难点语言环境。如若你在工作簿或模板项如今边使用VSTO代码,则无需担心语言环境难题。

Font属性再次来到一个Font对象,可用来将Font设置为各类大小和体制。清单5-3四出示了用于加粗单元格字体的Font对象的演示。

Excel还同意你创设与工作簿相关联的体裁,并将这几个样式应用于范围。您能够应用Workbook.Styles创造样式。清单五-35来得了创制样式并将其接纳于Range的演示。

清单伍-35 创造和动用样式的VSTO自定义

private void Sheet1_Startup(object sender, System.EventArgs e)
{
  Excel.Range range1 = this.get_Range("$A$15:$F$28", missing);
  range1.Value2 = "Hello";

  Excel.Style style = Globals.ThisWorkbook.Styles.Add(
    "My Style", missing);

  style.Font.Bold = true;
  style.Borders.LineStyle = Excel.XlLineStyle.xlDash;
  style.Borders.ColorIndex = 3;
  style.NumberFormat = "General";

  range1.Style = "My Style";
}

特殊Excel问题
在.NET中使用Excel对象模型时,要求小心多少个奇特的注意事项。
本节将检查五个最重点的内容:使用八个区域安装并使用Excel日期。

自动化可执行文件和COM加载项的Excel区域难点
当使用自动化可执行文件或COM加载项中的托管代码对Excel对象模型实行编程时,依照当下线程的区域设置,Excel方法和总体性的行为可能会迥然不一致。
请注意,使用VSTO营造的文书档案解决方案前面包车型地铁代码中不会并发此题材。
例如,假若要为范围设置公式并且位居保加伯明翰语区域安装中,则Excel供给你使用本地化的法语公式名称和格式:

 

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

那种行为与单身于言语环境的消除方案背后的VBA和VSTO代码不相同。
VBA和VSTO总是告诉Excel,该语言环境是花旗国韩语(locale id 拾3三)。
在解决方案中的VBA和VSTO代码中,与Excel进行交谈时,您不用怀想区域安装。
您能够编制此代码,并使其在法兰西共和国语言环境福建中华工程公司作:

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

当托管代码调用到Excel对象模型中时,它会告知Excel它正在运行的区域设置(当前线程的区域设置),那将促成Excel期望您将以该区域设置的本土壤化学格式提供公式和其余值。
Excel还将以该区域安装的本地化格式再次来到公式和其他值。
Excel期望本地化的字符串,例如日期格式,与Range关联的NumberFormat字符串,与NumberFormat字符串相关联的水彩名称和公式名称。

使用DateTime for Dates
作为一个例子,假诺您不记挂这些难题,能够设想下列代码:

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

该值也许由2001年十一月二二十七日,二零零四年1月二二十八日,或2003年4月五日由Excel解释,具体取决于当前线程的区域设置。

对于日期,您有3个妇孺皆知的缓解办法。 不要将日期作为文字字符串传递给Excel。
相反,使用System.DateTime对象构建日期,并选择Date提姆e的ToOADate方法将其传递给Excel,如代码清单5-36所示。
ToOADate方法将DateTime转换为OLE自动化日期,那是Excel对象模型期望的日子格式。

清单5-3陆  适本地将日期传递给Excel的VSTO定制

 

private void Sheet1_Startup(object sender, System.EventArgs e)
{
  Excel.Range range1 = this.get_Range("$A$1", missing);

  // March 11, 2002
  System.DateTime date = new System.DateTime(2002, 3, 11);
  range1.Value2 = date.ToOADate();
}

将线程区域切换为英文和后退不引进
你或许会以为与安装或得到Range.NumberFormat和Range.Formula相关的难点的缓解方案是保留线程的区域设置,权且将线程的区域安装切换为保加格拉茨语(区域设置ID
十3三),执行设置的代码或取得受区域安装影响的属性(如NumberFormat或Formula),然后切换回保存的区域安装。不提议使用此办法,因为它会潜移默化不期望本地调换机的别的加载项。

请思索以下示例。您的加载项正在法兰西机械上运维。您的加载项将区域安装切换来十33并安装公式值。另1个加载项是处理Change事件并展现一个对话框。该对话框以英文而不是罗马尼亚语显示。由此,通过更改线程区域安装,您已经济体改变了另2个加载项的作为,并且1般是不良的Office公民。

使用反思来化解地区难点
赶上区域安装难题的COM加载项或自动化可执行文件的提议化解方法(访问受当前语言环境影响的本性(如NumberFormat或Formula属性)时)是透过反射访问这么些属性。反射使您能够内定Excel的英文区域设置,并编写制定无论当前线程区域安装哪些的代码。清单伍-叁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语言环境难点更为复杂化的第三个难题是,在将语言环境设置为非英语区域安装的微处理器上的英文Excel安装中使用Excel对象模型时,或许会接到“旧格式或无效类型库”错误。
Excel正在程序文件\ Microsoft Office \ OFFICE11 \
拾3叁中找到二个名字为xllex.dll的文本,它找不到。解决此难点的主意是安装xllex.dll文件或安装Office的MUI语言包。您还是能复制excel.exe,将其重命名称为xllex.dll,并将其复制到103叁索引。

VSTO和Excel语言环境难题
文书档案化解方案后的VSTO代码通过利用位于您和Excel对象模型之间的晶莹代理对象来化解Excel区域设置难点。此代理总是告诉Excel,该语言环境是美利坚合作国乌克兰语(locale
id
十33),那实惠地使VSTO匹配VBA行为。如若你在文书档案解决方案前边使用VSTO代码,则会为您消除Excel语言环境难题,您不用再进一步担心。借使您正在为Excel或自动化可执行文件营造托管COM加载项,则难题依旧存在。

VSTO对Excel语言环境难点的消除方案有部分注意事项。
VSTO透西晋理能够稍微放慢代码的快慢。它也会招致Excel对象在调节和测试器中反省时显示略有分裂。最终,要是你使用Equals运算符将代理的Excel对象(如Application)与未选取的Application对象举行相比,则它们将不会被评估为相等。

万一要绕过一定对象的VSTO透孙吴理,能够应用Microsoft.Office.Tools.Excel.ExcelLocale1033Proxy.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能够以二种格式表示日期:一玖〇〇格式或1玖零伍格式。
一九〇〇格式基于一个系统,当转换为一个数字时,它代表从1905年四月1日起的已作古的天数。一九零四格式是依据一个系统,当转换为三个数字时,它象征已过的大运自一9〇二年三月15日起,一玖零零年格式由最初的Macintosh总括机引入,因为我们稍后描述的一玖零零格式的题材。您能够通过检查Workbook.Date一九〇二属性来分明工作簿正在接纳的格式,假若工作簿使用1905格式,则赶回true。

假若Excel工作簿使用1900格式,并将日期从该工作簿转换为DateTime直接,则会博得错误的值。由于DateTime期望1902年的格式,由数字代表的Excel日期的值是一玖零一年7月116日过后,而不是1九零贰年11月三日事先的通过天数,因而将关门四年和1个闰年。由此,此代码就算你在工作簿中应用一九零二格式,将会付出错误的日牛时间。

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

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

清单五-3八还对一九〇三格式日期举行了改正。 事实注解,当Lotus壹-二-3写成时,程序员错误地认为一玖零4年是3个闰年。
当Microsoft写Excel时,他们盼望确认保证它们与存活的Lotus1-贰-三电子表格保持包容,使其能够计算自189九年1十月二17日来说的气数,而不是一玖零二年五月二二十八日。当DateTime为
写的,它的创造者未有总结回溯到189九年1月七日,它是从1九零四年5月二十四日早先盘算的。所以为了将一九零零年三月30日事先的一九零四年格式的Excel日期正确地更换来DateTime,你无法不添加1天。

末段,Excel不能代表一玖〇5年一月八日事先1903年格式的光景,一玖〇〇年十二月七日事先的日期,以一9〇三年格式。
由此,当您将DateTime转换为Excel日期时,必须传递多少个字符串而不是意味date的数字,因为那几个日子不可能在Excel中象征为日期(仅作为字符串)。

结论
本章斟酌了Excel对象模型中的一些最主要的目的。
我们在持续章节的Excel示例中利用了重重这个目的。
在第二1章“在Excel中选用XML”中,大家还思考了有的用以在Excel中央银行使XML的其余Excel对象模型对象。

本章描述了由Excel的机要互操作程序集定义的那几个目的。
您应该小心到,VSTO扩张了那个指标(Workbook,Worksheet,Range,Chart,ChartObject和ListObject),以添加1些叠加成效,如数据绑定支持。
本书第三局地调查了那一个扩大。

 

相关文章

网站地图xml地图