C#操作Excel(1)Excel对象模型

Excel对象模型  (.Net Perspective)

本文主要针对在Visual Studio中使用C# 开发关于Excel的应用程序

本文的PDF下载地址:C#操作Excel2007.pdf

来源:Understandingthe Excel Object Model from a .NET Developer's Perspective

Excel对象模型中的四大主要对象:
Application Excel应用程序本身
Workbook  工作表Sheet的集合
Worksheet               一个工作表Sheet
Range                     表示一块区域

所有Excel对象请参考MSDN:

ExcelObject Model Reference

----------------------------------------------华丽分割-------------------------------------------------

1.       Application 

首先讨论Application对象,Application对象的成员大概可以分成5大类

 

  • l  控制Excel的状态与显示
  • l  返回对象
  • l  执行Action
  • l  控制文件操作(handle file manipulation)
  • l  其他

 

 

1.1 Application成员之:控制Excel的状态与显示

Property

Type

Description

Cursor

XlMousePointer (xlDefault, xlIBeam, xlNorthwestArrow, xlWait)

设置/取得 鼠标指针的Appearence

EditDirectlyInCell

Boolean

Gets or sets the ability to edit cells directly in place. If False, you can only edit cells in the formula bar.

FixedDecimal

Boolean

If True, all numeric values use the FixedDecimalPlacesproperty to determine the number of decimal places; otherwise, FixedDecimalPlaces property is ignored (the default value is False).

FixedDecimalPlaces

Long

Determines the number of decimal places to be used for numeric data if the FixedDecimal property is True.

Interactive

Boolean

Gets or sets the ability of the user to interact with Excel via the keyboard and mouse; if you set this property to False, make absolutely sure you set it back to True in your exception handler. Excel won't reset it for you.

MoveAfterReturn

Boolean

如果为真,表示按下回车键后移动到下一个单元格

MoveAfterReturnDirection

xlDirection (xlDown, xlToLeft, xlToRight, xlUp)

设置按下回车键后,单元格focus的移动方向,( 仅在MoveAfterReturn 属性为真时有效) 默认移动方向:xlDown.

ScreenUpdating

Boolean

If True, Excel updates its screen after each method call. To save time, and to make your application look more professional,you can turn off the display while your code is running. Make sure you reset this property to True again once you're done. Excel won't reset it for you.

SheetsInNewWorkbook

Long

Gets or sets the number of sheets Excel automatically places in new workbooks

StandardFont

String

Gets or sets the name of the default font in Excel; doesn't take effect until you restart Excel.

StandardFontSize

Long

Gets or sets the size of the default font in Excel; doesn't take effect until you restart Excel.

StartupPath (read-only

String

Returns the complete path of the folder containing the Excel startup add-ins.

TemplatesPath (read-only)

String

Returns the complete path of the folder containing templates; this value represents one of the Windows special folders.

 

上面列出的属性中,比较重要的是:ScreenUpdating

它的含义是:是否在任一函数执行完成后更新Excel的界面显示。如果你在进行大数据量的计算,这一功能尽量关闭,因为这可以提高你的任务执行速度。

ScreenUpdating在C#中的使用方法是:(执行完任务记得重新开启该功能)

 

[csharp] view plaincopy
  1. // C#  
  2. try  
  3. {  
  4.    ThisApplication.ScreenUpdating = false;  
  5.    // Do your work that updates the screen.  
  6. }  
  7.    
  8. finally  
  9. {  
  10.    ThisApplication.ScreenUpdating = true;  
  11. }  
  12.    

 

下面再介绍几个有关属性:

Property

Type

Description

DisplayAlerts

Boolean

If True (the default value), Excel displays warning messages while your code runs, as necessary--when deleting a sheet, for example. Set to False to bypass warnings. Excel acts as if you had selected the default value for each alert.

DisplayFormulaBar

Boolean

If True (the default value), Excel displays the standard formula bar for editing cells; set to False to hide the editing bar.

DisplayFullScreen

Boolean

If True, Excel runs in full-screen mode (which has a different effect from simply maximizing the Excel window); the default value is False.

 

1.2 Application成员之: who return objects

Excel库包含很多类,但是在Visual Studio中提供给开发人员的只有Excel.Application,Workbook等,那么我们怎么获得其他很多有用的类型呢?

      比如,我想获得当前活动的单元格(cell),怎么办?不用担心,Application对象提供很多属性能够返回其他很多类型的对象的引用。下面具体来看一下:

Property

Type

Description

ActiveCell

Range

Returns a reference to the currently active cell in the active window (the window that's on top). If there's no active window, this property raises an error.

ActiveChart

Chart

Returns a reference to the currently active chart. An embedded chart is only considered active when it's selected or activated.

ActiveSheet

Object

Returns a reference to the active sheet in the active workbook.

ActiveWindow

Window

Returns a reference to the active window (the window that's on top); returns Nothing if there are no active windows.

Charts

Sheets

Returns a collection of Sheet objects (the parent for bothChart and Worksheet objects) containing references to each of the charts in the active workbook.

Selection

Object

Returns the selected object within the application. Might be a Range, a Worksheet, or any other object—also applies to the Window class, in which case the selection is generally a Range object. If no object is currently selected, returns Nothing.

Sheets

Sheets

Returns a collection of Sheet objects containing references to each of the sheets in the active workbook.

Workbooks

Workbooks

Returns a collection of Workbook objects containing references to all the open workbooks.

上面的属性中,Workbooks属性无疑是最常用的。通过这个属性,我们可以打开或者创建一个workbook,下面我们具体看一下该属性的一些行为。

1.    创建workbook

 

[csharp] view plaincopy
  1. Excel.Workbook wb = ThisApplication.Workbooks.Add(Type.Missing);  
  

 

2.    关闭workbook

 

[csharp] view plaincopy
  1. ThisApplication.Workbooks.Close();  

 

3.    打开一个存在的workbook

 

[csharp] view plaincopy
  1. Excel.Workbook wb = ThisApplication.Workbooks.Open(   
  2.     "C:\\YourPath\\Yourworkbook.xls",   
  3.     Type.Missing, Type.Missing, Type.Missing, Type.Missing,   
  4.        Type.Missing, Type.Missing, Type.Missing, Type.Missing,   
  5.     Type.Missing, Type.Missing, Type.Missing, Type.Missing,   
  6. Type.Missing, Type.Missing);  

 

4.    用Excel的方式打开XML文件,数据库文件或者TXT文件

OpenXML,OpenDatabase,OpenText

 

5.    通过名字或者索引引用workbook

 

[csharp] view plaincopy
  1. Excel.Workbook wb = ThisApplication.Workbooks[1];  
  2. wb = ThisApplication.Workbooks["Book1"];//在workbook未保存的情况下  
  3. wb = ThisApplication.Workbooks["Book1.xls"];//在workbook已经保存的情况下  

1.3 Application成员之: Execute Actions

这类成员包括Calculate,CheckSpelling,Evaluate,Sendmaid,Undo,Quit。。。实在是太多了,请参考原文。

 

1.4 Application成员之: Handles File Manipulation

l  缺省文件路径            DefaultFilePath

 

[csharp] view plaincopy
  1. // C#  
  2. // When the workbook opens:  
  3. ThisApplication.get_Range("DefaultFilePath", Type.Missing).  
  4.     Value2 = ThisApplication.DefaultFilePath;  
  5.    
  6. // When you save the DefaultFilePath property:  
  7. ThisApplication.DefaultFilePath =   
  8.     ThisApplication.get_Range("DefaultFilePath", Type.Missing).  
  9.     Value2.ToString();  

 

l  默认的保存文件格式 DefaultSaveFormat

下图展示了Excel支持的保存文件格式

 

[csharp] view plaincopy
  1. // 例1  
  2. // When the workbook opens, convert the enumerated value   
  3. // into a string:  
  4. //获得默认的保存格式属性DefaultSaveFormat  
  5. ThisApplication.get_Range("DefaultSaveFormat", Type.Missing).  
  6.     Value2 = ThisApplication.DefaultSaveFormat.ToString();  
  7.    
  8.    
  9. //例2.设置该属性,相对比较复杂  
  10. // 步骤1.Retrieve the name of the new save format, as a string:  
  11. string  strSaveFormat = ThisApplication.  
  12.   get_Range("DefaultSaveFormat", Type.Missing).  
  13.   Value2.ToString();  
  14.    
  15. //步骤2  
  16. Excel.Range rng = ThisApplication.  
  17.     get_Range("xlFileFormat", Type.Missing);  
  18. Excel.Range rngFind = rng.Find(strSaveFormat,   
  19.     Type.Missing, Type.Missing, Type.Missing, Type.Missing,   
  20.     Excel.XlSearchDirection.xlNext, Type.Missing, Type.Missing,   
  21. Type.Missing);  
  22.    
  23. // In C#, use the get_Offset method instead of the Offset property:  
  24. int intSaveFormat =   
  25. Convert.ToInt32(rngFind.get_Offset(0, 1).Value2);  
  26.    
  27. //步骤3.  
  28. ThisApplication.DefaultSaveFormat =   
  29.   Excel.XlFileFormat) intSaveFormat;  

 

l  RecentFiles属性

 

[csharp] view plaincopy
  1. // 列出最近打开的文档<strong>  
  2. </strong>private void ListRecentFiles()  
  3. {  
  4.     Excel.Range rng = (Excel.Range)ThisApplication.  
  5.         get_Range("RecentFiles", Type.Missing).Cells[1, 1];  
  6.    
  7.     for (int i = 1; i <= ThisApplication.RecentFiles.Count; i++)  
  8.     {  
  9.         rng.get_Offset(i - 1, 0).Value2 =   
  10.             ThisApplication.RecentFiles[i].Name;  
  11.     }   
  12. }  

 

 

l  FileDialog属性

Using this dialog box, you cantake advantage of all the file handling capabilities provided by MicrosoftOffice.

The FileDialog property requires that you select aparticular use of the dialog box by passing it one of themsoFileDialogType enumerated values:

msoFileDialogFilePicker

msoFileDialogFolderPicker

msoFileDialogOpen, or 

msoFileDialogSaveAs

You can then interact with the FileDialog object returned by the property.

使用该属性需要引用Microsoft.Office.Core 命名空间

 

[csharp] view plaincopy
  1. // C#  
  2. using Office = Microsoft.Office.Core;  

 

执行打开文件对话框的show()函数,将显示该对话框。用户点击OK,则该函数返回-1,若点击Cancel,则该函数返回0。

 

[csharp] view plaincopy
  1. // 打开FileDialog,选择一个文件打开  
  2. dlg = ThisApplication.get_FileDialog(  
  3.     Office.MsoFileDialogType.msoFileDialogOpen);  
  4. dlg.Filters.Clear();  
  5. dlg.Filters.Add("Excel Files", "*.xls;*.xlw", Type.Missing);  
  6. dlg.Filters.Add("All Files", "*.*", Type.Missing);  
  7. if(dlg.Show() != 0)  
  8.     dlg.Execute();  
1.5 Application成员之: 其他

 

大致包括以下几类:(具体请参考MSDN)

 

  • WorksheetFunctionClass
  • WindowClass & Window Collection
  • NameClass & Name Collection
  • ApplicationEvent

 

------------------------------------华丽分割------------------------------------

 

2. Workbook

该类提供约90个属性。很多是开发者想象不到的属性,比如:

 

  • AutoUpdateFrequency 返回一个共享的workbook的自动更新间隔时间
  • Date1904 返回true表示当前使用的是data 1904 时间系统
  • PasswordEncryptionAlgorithm允许你设置加密算法。

 

下面给出最常使用的Workbook属性

 

  •   Name,Fullname ,Path
[csharp] view plaincopy
  1. ThisApplication.get_Range("WorkbookName", Type.Missing).  
  2.     Value2 = ThisWorkbook.Name;  
  3. ThisApplication.get_Range("WorkbookPath", Type.Missing).  
  4.     Value2 = ThisWorkbook.Path;  
  5. ThisApplication.get_Range("WorkbookFullName", Type.Missing).  
  6.     Value2 = ThisWorkbook.FullName;  

 

 

 

  • Password(给EXCEL文件加密)
[csharp] view plaincopy
  1. private void SetPassword()  
  2. {  
  3.     Password frm = new Password();  
  4.    
  5.     if (frm.ShowDialog() == DialogResult.OK)  
  6.         ThisWorkbook.Password = frm.Value;  
  7.     frm.Dispose();  
  8. }  

 

 

  • PrecisionAsDisplayed
[csharp] view plaincopy
  1. private void TestPrecisionAsDisplayed(  
  2.     bool IsPrecisionAsDisplayedOn)  
  3. {  
  4.     ThisWorkbook.PrecisionAsDisplayed =   
  5.         IsPrecisionAsDisplayedOn;  
  6. }  

 

 

 

  • ReadOnly  (boolean)    返回当前打开的文件是否是只读的
  •   Saved        (boolean)    设置/获取 saved state

 

Working with Styles 

 

[csharp] view plaincopy
  1. // 风格设置  
  2. private void ApplyStyle()  
  3. {  
  4.     const String STYLE_NAME = "PropertyBorder";  
  5.     // Get the range containing all the document properties.  
  6.     Excel.Range rng = GetDocPropRange();  
  7.     Excel.Style sty;  
  8.     try  
  9.     {  
  10.         sty = ThisWorkbook.Styles[STYLE_NAME];  
  11.     }  
  12.     catch  
  13.     {  
  14.         sty = ThisWorkbook.Styles.Add(STYLE_NAME, Type.Missing);  
  15.     }  
  16.    
  17.     sty.Font.Name = "Verdana";  
  18.     sty.Font.Size = 12;  
  19.     sty.Font.Color = ColorTranslator.ToOle(Color.Blue);  
  20.     sty.Interior.Color = ColorTranslator.ToOle(Color.LightGray);  
  21.     sty.Interior.Pattern = Excel.XlPattern.xlPatternSolid;  
  22.     rng.Style = STYLE_NAME;  
  23.     rng.Columns.AutoFit();  
  24. }  
  25.    
  26.    
  27. private Excel.Range GetDocPropRange()  
  28. {  
  29.     Excel.Range rng =   
  30.         ThisApplication.get_Range("DocumentProperties", Type.Missing);  
  31.    
  32.     Excel.Range rngStart =   
  33.         (Excel.Range) rng.Cells[1, 1];  
  34.    
  35.     Excel.Range rngEnd =   
  36.         rng.get_End(Excel.XlDirection.xlDown).get_Offset(0, 1);  
  37.    
  38.     return ThisApplication.get_Range(rngStart, rngEnd);  
  39. }  
  40.    

 

设置风格后的样子:

当然,设置Style后也可以清除Style

 

[csharp] view plaincopy
  1. // C#  
  2. private void ClearStyle()  
  3. {  
  4.     // Get the range containing all the document properties, and  
  5.     // clear the style.  
  6.     GetDocPropRange().Style = "Normal";  
  7. }  

 

Working with Sheets

 

[csharp] view plaincopy
  1. // C# 列出所有Sheet  
  2. private void ListSheets()  
  3. {  
  4.     int i = 0;  
  5.    
  6.     Excel.Range rng =   
  7.         ThisApplication.get_Range("Sheets", Type.Missing);  
  8.     foreach (Excel.Worksheet sh in ThisWorkbook.Sheets)  
  9.     {  
  10.         rng.get_Offset(i, 0).Value2 = sh.Name;  
  11.         i = i + 1;  
  12.     }  
  13. }  

 

 

----------------------------------------------华丽分割-----------------------------------------------

3. WorkSheet

当你阅读到这里的时候,你已经了解了大部分关于worksheet的概念。尽管Worksheet类提供了大量属性,方法,事件;但其实它们的实现方法基本与Application和Workbook中的实现方法相同。这一节着重介绍之前没有讨论的内容。

3.1 There is no Sheet Class.. 

什么?没有Sheet类?

      我们知道,Workbook对象有一个属性叫做Sheets,它是一个Workbook中Sheet的集合,但Excel中确实没有叫做Sheet的类。取而代之的是,Sheets集合中的每一个元素都是一个WorkSheet对象或者Chart对象。你可以这样去想: Worksheet以及Chart类都是specialized instances of an internal Sheet Class

 

3.2  Working with Protection

通常,protection特性用于防止用户修改worksheet中的对象。一旦你使能了worksheet的protection功能,那么用户将无法编辑&修改该sheet。在用户界面,你可以选择Tools | Protection | ProtectSheet(Excel2007下面是 审阅 | 更改 | 保护工作表)来使能protection。如下图所示:

 

你也可以定义允许用户编辑的区域:

通过以上两个对话框,你就可以锁定sheet,同时允许用户编辑指定的选项以及区域(edit specificfeatures and ranges)。

当然,上述的内容也可以让C#帮我们完成。

 

[csharp] view plaincopy
  1. // C#  
  2. WorksheetObject.Protect(Password, DrawingObjects, Contents,   
  3.   Scenarios, UserInterfaceOnly, AllowFormattingCells,   
  4.   AllowFormattingColumns, AllowFormattingRows,   
  5.   AllowInsertingColumns, AllowInsertingRows,   
  6.   AllowInsertingHyperlinks, AllowDeletingColumns,   
  7.   AllowDeletingRows, AllowSorting, AllowFiltering,   
  8.   AllowUsingPivotTables);  

 

 

上面的Protect方法有很多参数,分别对应保护的内容。

 

  • Password  对应密码,当你要撤销保护时需要指定密码
  • DrawingObjects    保护Shapes on the worksheet
  • Contents         保护cells,即所有单元格内容
  • Scenarios        保护情景
  • UserInterfaceOnly      允许通过代码修改,不允许通过用户界面修改AllowFormattingCells AllowFormattingColumns….后面不再赘述

 

下面这个例子,设置了密码,同时只允许Sorting

 

[csharp] view plaincopy
  1. // C#  
  2. ((Excel.Worksheet)ThisApplication.Sheets[1]).Protect(  
  3.     "MyPassword", Type.Missing, Type.Missing, Type.Missing,   
  4.     Type.Missing, Type.Missing, Type.Missing, Type.Missing,   
  5.     Type.Missing, Type.Missing, Type.Missing, Type.Missing,   
  6.     Type.Missing, true, Type.Missing, Type.Missing);  

 

下面的代码展示如何去保护(提示让用户输入密码)

 

[csharp] view plaincopy
  1. // C#  
  2. ((Excel.Worksheet)ThisApplication.Sheets[1]).  
  3.   Unprotect(GetPasswordFromUser());  

 

除此之外,Protection还提供了AllowEditRanges属性,可以让你指定可编辑的范围。AllowEditRanges属性是AllowEditRange对象的集合,每一个对象都提供了一些有用的属性,比如:

 

  • l  Range       get/set range of the editable area
  • l  Title          get/set the title of the editableregion
  • l  Users         get/set a collection of UserAccessobject

 

下面这个例子演示了Protection的功能,当你点击Protect时,你只能编辑阴影区域,点击Unprotect可以去保护。

代码如下:(对应点击图中的链接(Protect,Unprotect)执行的代码)

 

[csharp] view plaincopy
  1. // C#  
  2.    
  3. private void ProtectSheet()  
  4. {       
  5.     Excel.Worksheet ws =  
  6.       (Excel.Worksheet)ThisApplication.ActiveSheet;  
  7.    
  8.     Excel.AllowEditRanges ranges = ws.Protection.AllowEditRanges;  
  9.     ranges.Add("Information",   
  10.         ThisApplication.get_Range("Information", Type.Missing),   
  11.         Type.Missing);  
  12.     ranges.Add("Date",   
  13.         ThisApplication.get_Range("Date", Type.Missing), Type.Missing);  
  14.    
  15.     ws.Protect(Type.Missing, Type.Missing, Type.Missing,   
  16.         Type.Missing, Type.Missing,Type.Missing, Type.Missing,   
  17.         Type.Missing,Type.Missing, Type.Missing, Type.Missing,   
  18.         Type.Missing,Type.Missing,Type.Missing,  
  19.         Type.Missing,Type.Missing);  
  20. }  
  21.    
  22. private void UnprotectSheet()  
  23. {  
  24.     Excel.Worksheet ws =   
  25.         (Excel.Worksheet) ThisApplication.Sheets["Worksheet Class"];  
  26.     ws.Unprotect(Type.Missing);  
  27.    
  28.     // Delete all protection ranges, just to clean up.  
  29.     // You must loop through this using the index,   
  30.     // backwards. This collection doesn't provide   
  31.     // an enumeration method, and it doesn't handle  
  32.     // being resized as you're looping in a nice way.  
  33.     Excel.AllowEditRanges ranges = ws.Protection.AllowEditRanges;  
  34.     for (int i = ranges.Count; i >= 1; i--)  
  35.     {  
  36.         ranges[i].Delete();  
  37.     }  
  38. }  
3.3  Object Properties

 

Worksheet类提供了一些属性(that return objects),下面介绍两个有用属性:

Comments以及Outline

3.3.1  Comments (批注)

在Excel2007中,选中一块区域或者单元格后,点击右键,可以插入批注。插入批注后的样子如下图所示

Worksheet类提供Comments属性,通过该属性,你可以访问该工作表内的所有批注。Comments类没有多少属性,你可能会使用Visible属性来控制批注的显示与隐藏,Delete属性来删除批注,或者你可能会发现Text方法比较有用,因为可以通过它来给批注增加内容或者重写批注。

下面是一个及其简单的例子,来控制显示批注

 

[csharp] view plaincopy
  1. // C#  
  2. private void ShowOrHideComments(bool show)  
  3. {  
  4.     // Show or hide all the comments:  
  5.     Excel.Worksheet ws =   
  6.         (Excel.Worksheet) ThisApplication.Sheets["Worksheet Class"];  
  7.    
  8.     for (int i = 1; i <= ws.Comments.Count; i++)  
  9.     {  
  10.         ws.Comments[i].Visible = show;  
  11.     }  
  12. }  
3.3.2 Outline

 

Outline的功能是把row划分成组,使得Excel的显示更有层次感与结构气息。

例如,下面两张图片

左图:创建Outline                            右图:折叠后效果

tline属性本身是一个Outline对象,它自身属性不多,主要有以下几个:

 

  • l  AutomaticStyles         告诉Excel是否应用automatic style to outline
  • l  SummaryColumn       get or set the location of the summarycolumns, (两个选项:  xlSummaryOnLeft  xlSummaryOnRight)
  • l  SummaryRow            get or set the location of thesummary rows,(两个选项:  xlSummaryAbove  xlSummaryBelow)
  • l  ShowLevels                允许你折叠/扩展outline groups to the row level and/or column levelyou want.

 

经过上面的介绍,你应该对Outline有了基本的了解,下面开始使用C#操作Outline。

首先是创建Group,创建Group是简单的,你可以调用range对象的Group()方法;调用Ungroup()方法移除Group。

 

[csharp] view plaincopy
  1. // C#  
  2. private void WorkWithGroups()  
  3. {  
  4.     Excel.Worksheet ws =   
  5.         (Excel.Worksheet) ThisApplication.ActiveSheet;  
  6.    
  7.     // Set worksheet-level features for the outline.  
  8.     // In this case, summary rows are below  
  9.     // the data rows (so Excel knows where to put  
  10.     // the summary rows), and we don't want Excel  
  11.     // to format the summary rows--that's already been done.  
  12.     ws.Outline.SummaryRow = Excel.XlSummaryRow.xlSummaryBelow;  
  13.     ws.Outline.AutomaticStyles = false;  
  14.    
  15.     // Group the two named ranges. Each of these  
  16.     // ranges extends across entire rows.  
  17.     ThisApplication.get_Range("Data2001", Type.Missing).  
  18.         Group(Type.Missing, Type.Missing, Type.Missing, Type.Missing);  
  19.     ThisApplication.get_Range("Data2002", Type.Missing).  
  20.         Group(Type.Missing, Type.Missing, Type.Missing, Type.Missing);  
  21.     ThisApplication.get_Range("AllData", Type.Missing).  
  22.         Group(Type.Missing, Type.Missing, Type.Missing, Type.Missing);  
  23.    
  24.     // The range of rows from 24 to 27 doesn't have   
  25.     // a named range, so you can work with that   
  26.     // range directly.  
  27.     Excel.Range rng = (Excel.Range)ws.Rows["24:27", Type.Missing];  
  28.     rng.Group(Type.Missing, Type.Missing, Type.Missing,   
  29.     Type.Missing);  
  30.    
  31.     // Collapse to the second group level.  
  32.     ws.Outline.ShowLevels(2, Type.Missing);  
  33. }  

 

对于unnamed range,方法如下:

 

[csharp] view plaincopy
  1. // C#  
  2. Excel.Range rng = (Excel.Range)ws.Rows["24:27", Type.Missing];  
  3. rng.Group(Type.Missing, Type.Missing,   
  4.            Type.Missing, Type.Missing);  

 

在前面的图片中点击Clear Groups link将清除Groups,对应代码如下:

 

[csharp] view plaincopy
  1. // C#  
  2. private void ClearGroups()  
  3. {  
  4.     Excel.Worksheet ws =   
  5.         (Excel.Worksheet) ThisWorkbook.Sheets["Worksheet Class"];  
  6.    
  7.     // Specify RowLevels and/or ColumnLevels parameters:  
  8.     ws.Outline.ShowLevels(3, Type.Missing);  
  9.    
  10.     Excel.Range rng = (Excel.Range) ws.Rows["24:27", Type.Missing];  
  11.     rng.Ungroup();  
  12.    
  13.     ThisApplication.get_Range("Data2001", Type.Missing).Ungroup();  
  14.     ThisApplication.get_Range("Data2002", Type.Missing).Ungroup();  
  15.     ThisApplication.get_Range("AllData", Type.Missing).Ungroup();  
  16. }  

 

OK,通过上面的技巧,你就可以创建&移除groups了。同时你也可以控制工作表上显示的group的层次了!

 

----------------------------------------------华丽分割-----------------------------------------------

 

4. Range

Range 对象将是你在开发关于Excel的应用程序中最经常使用的,在你操作任何Excel中的区域之前,你都要使用一个Range对象来表示该区域,然后通过Range对象的方法和属性来操作该区域。

Range对象是如此的重要,以至于本文上述所有的例子几乎都存在Range对象。通常,一个Range对象可以代表一个单元格,一行,一列,一块区域(containing oneor more blocks of cells)甚至是一组在不同sheets中的单元格。

不幸的是,由于Range对象太大,成员太多,故不可能对其成员进行逐一描述。所以,下面从三个比较重要的方面介绍Range对象

 

  • l  在代码中引用ranges
  • l  在代码中操作ranges
  • l  使用Range对象完成特定任务
4.1Managing The Selection

 

      Work with current selection 等价于修改当前选中Range的属性和行为,不过你最好避免这么做。因为 ,selection within Excel代表着用户的选择。如果你修改了它,那么将导致用户失去对“当前选择”的控制。关于selection,第一准则是:you should call the Selectmethod only if your intent is to change the user’s selection.

例如,下面的代码将清除用户当前选中单元格旁边的单元格的内容

 

[csharp] view plaincopy
  1. // C#  
  2. ThisApplication.ActiveCell.CurrentRegion.Select();  
  3. ((Excel.Range)ThisApplication.Selection).ClearContents();  
 

 

4.2  Referring to a Range in Code

1)    基本的引用Range方法

1.   引用ActiveCell

 

[csharp] view plaincopy
  1. rng = ThisApplication.ActiveCell;  

 

2.   使用get_Range方法,指定Range范围

 

[csharp] view plaincopy
  1. // C#  
  2. rng = ws.get_Range("A1", Type.Missing);  
  3. rng = ws.get_Range("A1:B12", Type.Missing);  

 

3.   使用Cells属性

 

[csharp] view plaincopy
  1. // C#  
  2. rng = (Excel.Range)ws.Cells[1, 1];  

 

4.   指定Range的角,同时可以直接引用该Range的Cells Rows Columns属性

 

[csharp] view plaincopy
  1. // C#  
  2. rng = ws.get_Range("A1", "C5");  
  3. rng = ws.get_Range("A1", "C5").Cells;  
  4. rng = ws.get_Range("A1", "C5").Rows;  
  5. rng = ws.get_Range("A1", "C5").Columns;  

 

5.   引用一个带名字的Range

 

[csharp] view plaincopy
  1. // C#  
  2. rng = ThisApplication.Range("SomeRangeName", Type.Missing);  

 

6.   引用特定的行或者列

 

[csharp] view plaincopy
  1. // C#  
  2. rng = (Excel.Range)ws.Rows[1, Type.Missing];  
  3. rng = (Excel.Range)ws.Rows["1:3", Type.Missing];  
  4. rng = (Excel.Range)ws.Columns[3, Type.Missing];  

 

7.   使用Application对象的Selection方法获取选中Cells对应的Range

执行下面代码,将在调试窗口看到:"$C$3"

 

[csharp] view plaincopy
  1. // C#  
  2. System.Diagnostics.Debug.WriteLine(  
  3.     ((Excel.Range)ThisApplication.Selection).  
  4.     get_Address(  Type.Missing, Type.Missing,   
  5.                         Excel.XlReferenceStyle.xlA1,   
  6.                  Type.Missing, Type.Missing)  
  7. );  
  8.    

 

8.   两个Range合并为一个Range

 

[csharp] view plaincopy
  1. // 简单的合并方法  
  2. rng = ThisApplication.get_Range("A1:D4, F2:G5", Type.Missing);  
  3.    
  4. // 相对复杂的合并方法  
  5. rng1 = ThisApplication.get_Range("A1", "D4");  
  6. rng2 = ThisApplication.get_Range("F2", "G5");  
  7. // Note that the Union method requires you to supply thirty  
  8. // parameters:   
  9. rng = ThisApplication.Union(rng1, rng2,   
  10.     Type.Missing, Type.Missing, Type.Missing, Type.Missing,  
  11.     Type.Missing, Type.Missing, Type.Missing, Type.Missing,  
  12.     Type.Missing, Type.Missing, Type.Missing, Type.Missing,  
  13.     Type.Missing, Type.Missing, Type.Missing, Type.Missing,  
  14.     Type.Missing, Type.Missing, Type.Missing, Type.Missing,  
  15.     Type.Missing, Type.Missing, Type.Missing, Type.Missing,   
  16.     Type.Missing, Type.Missing, Type.Missing, Type.Missing);  

 

9.   Range的Offset属性

 

[csharp] view plaincopy
  1. // adds content to the area under the cell at row 1, column 1  
  2. rng = (Excel.Range) ws.Cells[1, 1];  
  3. for (int i = 1; i <= 5; i++)  
  4. {  
  5.     rng.get_Offset(i, 0).Value2 = i.ToString();//参数1代表Row,2代表Col  
  6. }  

 

 

10,11,12....100#$%^&**(&%$...太多了,不能一一介绍

经过上面的介绍,是不是有一点晕呢?下面通过一个小例子来演示一下Range的功能吧。

      在使用Excel中,我们可能希望在选中一个单元格后使整行加粗显示,即实现选中效果,但是Excel中没有对该功能的支持。但是,通过代码不难实现该功能,首先看一下实际效果吧。

可以看到,选中的单元格所在行变成了Bold显示。

其实现代码如下:

 

[csharp] view plaincopy
  1. // C#  
  2. private int LastBoldedRow = 0;  
  3. private void BoldCurrentRow(Excel.Worksheet ws)   
  4. {  
  5.     // Keep track of the previously bolded row.  
  6.    
  7.     // Work with the current active cell.  
  8.     Excel.Range rngCell = ThisApplication.ActiveCell;  
  9.    
  10.     // Bold the current row.  
  11.     rngCell.EntireRow.Font.Bold = true;  
  12.    
  13.     // Make sure intRow isn't 0 (meaning that   
  14.     // this is your first pass through here).  
  15.     if (LastBoldedRow != 0)   
  16.     {  
  17.         // If you're on a different  
  18.         // row than the last time through here,  
  19.         // make the old row not bold.  
  20.         if (rngCell.Row != LastBoldedRow)   
  21.         {  
  22.             Excel.Range rng =   
  23.                 (Excel.Range)ws.Rows[LastBoldedRow, Type.Missing];  
  24.             rng.Font.Bold = false;  
  25.         }  
  26.     }  
  27.     // Store away the new row number   
  28.     // for next time.  
  29.     LastBoldedRow = rngCell.Row;  
  30. }  
例子中的workbook通过SheetSelectionChange事件监听器调用BoldCurrentRow方法。

 

下面的代码verifies that the new selection is within the correct range using the Intersect method ofthe Application object

 

[csharp] view plaincopy
  1. // C#  
  2. protected void ThisWorkbook_SheetSelectionChange(  
  3.   System.Object sh, Excel.Range Target)  
  4. {  
  5.     // Don't forget that the Intersect method requires  
  6.     // thirty parameters.  
  7.     if (ThisApplication.Intersect(Target,   
  8.         ThisApplication.get_Range("BoldSelectedRow", Type.Missing),   
  9.         Type.Missing, Type.Missing, Type.Missing, Type.Missing,   
  10.         Type.Missing, Type.Missing, Type.Missing, Type.Missing,   
  11.         Type.Missing, Type.Missing, Type.Missing, Type.Missing,   
  12.         Type.Missing, Type.Missing, Type.Missing, Type.Missing,   
  13.         Type.Missing, Type.Missing, Type.Missing, Type.Missing,   
  14.         Type.Missing, Type.Missing, Type.Missing, Type.Missing,   
  15.         Type.Missing, Type.Missing, Type.Missing, Type.Missing)   
  16.         != null)  
  17.     {  
  18.         // The selection is within the range where you're making  
  19.         //the selected row bold.  
  20.         BoldCurrentRow((Excel.Worksheet) sh);  
  21.     }  
  22. }  
4.3  Working with Ranges

 

      一旦你获得了一个Range的引用,你能做什么呢?答案是: Endless,as you can imagine。下面介绍两个典型的场景。

4.3.1 Autimatically Filling Ranges

自动填充功能   (AutoFill方法用于向一个范围中填充递增或者递减的值)

首先看一下:XlAutoFillType  枚举类型

 

  • l  xlFillDays
  • l   xlFillFormats
  • l   xlFillSeries
  • l  xlFillWeekdays,
  • l  xlGrowthTrend
  • l   xlFillCopy
  • l   xlFillDefault
  • l   xlFillMonths
  • l   xlFillValues
  • l   xlFillYears
  • l  xlLinearTrend

 

 

[csharp] view plaincopy
  1. // 实现图示自动填充的C#代码  
  2. private void AutoFill()  
  3. {  
  4.     Excel.Range rng = ThisApplication.get_Range("B1", Type.Missing);  
  5.     rng.AutoFill(ThisApplication.get_Range("B1:B5", Type.Missing),   
  6.         Excel.XlAutoFillType.xlFillDays);  
  7.    
  8.     rng = ThisApplication.get_Range("C1", Type.Missing);  
  9.     rng.AutoFill(ThisApplication.get_Range("C1:C5", Type.Missing),   
  10.         Excel.XlAutoFillType.xlFillMonths);  
  11.    
  12.     rng = ThisApplication.get_Range("D1", Type.Missing);  
  13.     rng.AutoFill(ThisApplication.get_Range("D1:D5", Type.Missing),   
  14.         Excel.XlAutoFillType.xlFillYears);  
  15.    
  16.     rng = ThisApplication.get_Range("E1:E2", Type.Missing);  
  17.     rng.AutoFill(ThisApplication.get_Range("E1:E5", Type.Missing),   
  18.         Excel.XlAutoFillType.xlFillSeries);  

 

 

4.3.2 Searching Within Ranges

Range类的Find方法允许你在Range中进行搜索。当然你也可以再Excel界面中使用Ctrl+F打开搜索对话框,如下图所示

下表列出了Range.Find方法的参数

What (required)

Object

The data to find; can be a string or any Excel data type.

After

Range

The range after which you want the search to start (this cell won't be included in the search); if you don't specify this cell, the search begins in the upper-left corner of the range.

LookIn

XlFindLookin (xlValue, xlComments, xlFormulas)

The type of information to be searched; cannot be combined using the Or operator.

LookAt

XlLookAt (xlWhole, xlPart)

Determines whether the search matches entire cells, or partial cells.

SearchOrder

XlSearchOrder (xlByRows, xlByColumns)

Determines the order for the search; xlByRows (the default) causes the search to go across and then down, and xlByColumns causes the search to go down and then across.

SearchDirection

XlSearchDirection (xlNext, xlPrevious)

Determines the direction of the search; the default is xlNext.

MatchCase

Boolean

Determines whether the search is case-sensitive.

MatchByte

Boolean

Determines whether double-byte characters match only double-byte characters (True) or equivalent single-byte characters (False); only applies if you've installed double-byte support.

下面还是通过一个例子来学习Range.Find的用法。首先贴图:

 

不难看出,我们要搜索apples。下面是其实现的代码:

 

[csharp] view plaincopy
  1. // C#  
  2. private void DemoFind()  
  3. {  
  4.     //得到range对象  
  5.     Excel.Range rng = ThisApplication.get_Range("Fruits", Type.Missing);  
  6.     Excel.Range rngFound;  
  7.    
  8.     // Keep track of the first range you find.  
  9.     Excel.Range rngFoundFirst = null;  
  10.    
  11.     // You should specify all these parameters  
  12.     // every time you call this method, since they  
  13.     // can be overriden in the user interface.  
  14.     rngFound = rng.Find("apples", Type.Missing,   
  15.         Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart,   
  16.         Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext,   
  17.         false, Type.Missing, Type.Missing);  
  18.    
  19.     while (rngFound != null)  
  20.     {  
  21.         if (rngFoundFirst == null )   
  22.         {  
  23.             rngFoundFirst = rngFound;  
  24.         }  
  25.         else if (GetAddress(rngFound) == GetAddress(rngFoundFirst))  
  26.         {  
  27.             break;  
  28.         }  
  29.         rngFound.Font.Color = ColorTranslator.ToOle(Color.Red);  
  30.         rngFound.Font.Bold = true;  
  31.         rngFound = rng.FindNext(rngFound);  
  32.     }  
  33. }  

 

若要取消查找后的显示效果:

[csharp] view plaincopy
  1. // 取消查找结构的显示  
  2. private void ResetFind()  
  3. {  
  4.     Excel.Range rng = ThisApplication.  
  5.         get_Range("Fruits", Type.Missing);  
  6.    
  7.     rng.Font.Color = ColorTranslator.ToOle(Color.Black);  
  8.     rng.Font.Bold = false;  
  9. }  

 

-----------------------------------------华丽分割-----------------------------------

OK,终于写完了。本文主要介绍了Excel的几大对象,主要介绍的是一些API。后面将会通过实例,结合 VS2010,用C#来实现对Excel的操作。感谢阅读。

 

-------------------------------------------------------------------------------------

本文的PDF版本下载:点此下载

转载于:https://www.cnblogs.com/gc2013/p/3934957.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝牙适配器 能同时接多少个设备_便携音箱也能有立体环绕声,JVC智能蓝牙颈挂音箱体验...

说起音箱&#xff0c;相信音乐爱好者是很熟悉了&#xff0c;而随着蓝牙技术的不断发展&#xff0c;便携式蓝牙音箱开始受到越来越多用户的喜爱&#xff0c;它能够让我们摆脱线材束缚&#xff0c;随时随地畅享音乐。虽然便携式蓝牙音箱小巧易携带&#xff0c;音质方面也在不断提…

LeetCode 1156. 单字符重复子串的最大长度

文章目录1. 题目2. 解题1. 题目 如果字符串中的所有字符都相同&#xff0c;那么这个字符串是单字符重复的字符串。 给你一个字符串 text&#xff0c;你只能交换其中两个字符一次或者什么都不做&#xff0c;然后得到一些单字符重复的子串。 返回其中最长的子串的长度。 示例 …

☆☆在Eclipse中编译NDK的so文件(普通安卓项目转换为NDK项目的设定)

1 将Native的编译链接配置加入项目中 2 进行编译 3 项目支持Native后&#xff0c;在首尾分别新增了两个编译过程 转载于:https://www.cnblogs.com/YangBinChina/p/3937287.html

小案例:利用图床自动化批量上传图片并获取图片链接

一、前言&#xff1a; 用python爬虫写了一个小脚本&#xff0c;用来自动上传图片到图床&#xff0c;然后返回链接&#xff0c;我们只需直接复制链接就可以。&#xff08;需要安装Requests库&#xff09;因为不同图床需要提交的POST表单不一致&#xff0c;所以在这里我用ImgURL…

LeetCode 497. 非重叠矩形中的随机点(前缀和+二分查找)

文章目录1. 题目2. 解题1. 题目 给定一个非重叠轴对齐矩形的列表 rects&#xff0c;写一个函数 pick 随机均匀地选取矩形覆盖的空间中的整数点。 提示&#xff1a; 整数点是具有整数坐标的点。 矩形周边上的点包含在矩形覆盖的空间中。 第 i 个矩形 rects [i] [x1&#xff0…

win10蓝屏提示重新启动_电脑蓝屏五大要素,秒判蓝屏问题及处理!

电脑蓝屏是个老生常谈的问题&#xff0c;而蓝屏问题也是电脑问题中最为复杂的问题之一&#xff0c;别说电脑小白&#xff0c;就是电脑老鸟有时候面对蓝屏都会犯怵&#xff01;简单来说&#xff0c;电脑蓝屏就好像人类突然晕倒&#xff0c;或者最严重的情况直接死亡&#xff0c;…

LeetCode 528. 按权重随机选择(前缀和+二分查找)

文章目录1. 题目2. 解题1. 题目 给定一个正整数数组 w &#xff0c;其中 w[i] 代表下标 i 的权重&#xff08;下标从 0 开始&#xff09;&#xff0c;请写一个函数 pickIndex &#xff0c;它可以随机地获取下标 i&#xff0c;选取下标 i 的概率与 w[i] 成正比。 例如&#xf…

boss直聘改回系统头像_BOSS 直聘找工作,消息却已读不回?| 在线求职5条避坑指南...

前几天在半撇私塾的求职群里&#xff0c;一个同学反馈&#xff1a;在 BOSS 直聘求职的时候&#xff0c;为什么总是被「已读不回」呢&#xff1f;就连逛豆瓣的上班小组&#xff0c;都能遇到这样的反馈&#xff1a;为什么会出现「已读不回」的情况呢&#xff1f;关于这个问题的答…

解决问题:Python调用cmd命令,出现中文乱码

一、前言&#xff1a; Python如何使用OS模块调用cmd 在os模块中提供了两种调用 cmd 的方法&#xff0c;os.popen() 和 os.system() os.system(cmd) 是在执行command命令时需要打开一个终端&#xff0c;并且无法保存command命令的执行结果。 os.popen(cmd,mode) 打开一个与c…

LeetCode 587. 安装栅栏 / LintCode 1152. 安装栅栏(凸包检测:排序+叉积正负判断+正反扫描+去重)

文章目录1. 题目2. 解题1. 题目 在一个二维的花园中&#xff0c;有一些用 (x, y) 坐标表示的树。 由于安装费用十分昂贵&#xff0c;你的任务是先用最短的绳子围起所有的树。 只有当所有的树都被绳子包围时&#xff0c;花园才能围好栅栏。 你需要找到正好位于栅栏边界上的树的…

arduino读取水位传感器的数据显示在基于i2c的1602a上_XSB-IC-S2智能水位监测仪-老友网...

XSB-IC-S2智能水位监测仪 多功能本身就是智能仪器仪表的一个特点。例如&#xff0c;为了设计速度较快和结构较复杂的数字系统&#xff0c;仪器生产厂家制造了具有脉冲发生器、频率合成器和任意波形发生器等功能的函数发生器。这种多功能的综合型产品不但在性能上(如准确度)比专…

七夕小案例:用代码给心爱的她画一个爱心

一、爱心示例&#xff1a; 二、开始写代码&#xff1a; /* * Hi。宝贝&#xff01; * 这么久了。还没和宝贝说过我的工作呢&#xff01; * 我是个前端工程师。俗称程序员。网页相关。 * 如这个页面。就是个什么也没有的网页。 * 我的工作就是给这种空白的页面加点儿东西。 * 嗯…

小案例:13行python代码实现对微信进行推送消息

一、前言&#xff1a; Python可以实现给QQ邮箱、企业微信、微信等等软件推送消息&#xff0c;今天咱们实现一下Python直接给微信推送消息。 这里咱们使用了一个第三方工具pushplus 二、单人推送 实现步骤&#xff1a; 1、用微信注册一个此网站的账号 2、将token复制出来&am…

python书籍_Python书籍大汇总——入门到实战

学习Python的朋友们越来越多&#xff0c;当当网和京东上面的Python类编程书籍&#xff0c;也从几年前寥寥无几到现在多的不知道选哪本才好了的地步。无论是自学还是参加培训班跟着老师学习&#xff0c;我们都需要几本实用的Python书&#xff0c;系统全面的掌握Python编程的相关…

LeetCode 87. 扰乱字符串(记忆化递归 / DP)

文章目录1. 题目2. 解题2.1 记忆化递归2.2 动态规划1. 题目 给定一个字符串 s1&#xff0c;我们可以把它递归地分割成两个非空子字符串&#xff0c;从而将其表示为二叉树。 下图是字符串 s1 “great” 的一种可能的表示形式。 great/ \gr eat/ \ / \ g r e a…

问题总结:一个 list 使用 for 遍历,边循环边删除的问题

一、需求&#xff1a; 对一个 list 数据类型写一个循环删除的程序 二、问题 来&#xff0c;我们来看看代码跟效果&#xff1a; # 初始化一个 list 列表&#xff0c;为了下边的方便比较&#xff0c;我就使用跟 list 索引来做 list 的元素 datas [0,1,2,3,4]# 打印元素组&am…

cpu使用率_漫话性能:CPU使用率

序言CPU 使用率是最直观和最常用的系统性能指标&#xff0c;更是我们在排查性能问题时&#xff0c;通常会关注的第一个指标。节拍率为了维护 CPU 时间&#xff0c;Linux 通过事先定义的节拍率&#xff08;内核中表示为 HZ&#xff09;&#xff0c;触发时间中断&#xff0c;并使…

谁动了我的产品

2014年3月中旬离开了自己奋斗三年的公司&#xff0c;这是一家海关政府公司&#xff0c;三年里无论是做项目需求分析、项目开发、项目测试、项目上线实施、项目上线跟踪、收集反馈、做项目版本修改&#xff0c;我和我的团队都在一个有非常明确目标、有非常明确思路的过程中&…

LeetCode 352. 将数据流变为多个不相交区间(map二分查找)

文章目录1. 题目2. 解题1. 题目 给定一个非负整数的数据流输入 a1&#xff0c;a2&#xff0c;…&#xff0c;an&#xff0c;…&#xff0c;将到目前为止看到的数字总结为不相交的区间列表。 例如&#xff0c;假设数据流中的整数为 1&#xff0c;3&#xff0c;7&#xff0c;2&…

windows键按了没反应_windows快捷键使用 - 小怜

1、总的参考图&#xff1a;2、ctrl的组合使用&#xff1a;1与shift键结合&#xff1a;2 ctrl shift del # 快速清除浏览器缓存记录3 ctrl shift N # 浏览器当中&#xff0c;快速打开无痕新窗口。chrome内核的应该都可以&#xff0c;chrome和新…