新浪博客

Range对象基本操作应用示例(1)

2012-04-20 11:53阅读:
Range对象可能是VBA代码中最常用的对象,Range对象可以是某一单元格、某一单元格区域、某一行、某一列、或者是多个连续或非连续的区域组成的区域。下面介绍Range对象的一些属性和方法。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-01] 赋值给某单元格
[示例05-01-01]
Sub test1()
Worksheets('Sheet1').Range('A5').Value = 22
MsgBox '工作表Sheet1内单元格A5中的值为' _
& Worksheets('Sheet1').Range('A5').Value
End Sub
[示例05-01-02]
Sub test2()
Worksheets('Sheet1').Range('A1').Value = _
Worksheets('Sheet1').Range('A5').Value
MsgBox '现在A1单元格中的值也为' & _
Worksheets('Sheet1').Range('A5').Value
End Sub
[示例05-01-03]
Sub test3()
MsgBox '用公式填充单元格,本例为随机数公式'
Range('A1:H8').Formula = '=Rand()'
End Sub
[示例05-01-04]
Sub test4()
Worksheets(1).Cells(1, 1).Value = 24
MsgBox '现在单元格A1的值为24'
End Sub
[示例05-01-05]
Sub test5()
MsgBox '给单元格设置公式,求B2至B5单元格区域之和'
ActiveSheet.Cells(2, 1).Formula = '=Sum(B1:B5)'

End Sub
[示例05-01-06]
Sub test6()
MsgBox '设置单元格C5中的公式.'
Worksheets(1).Range('C5:C10').Cells(1, 1).Formula = '=Rand()'
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-02] 引用单元格
Sub Random()
Dim myRange As Range
'设置对单元格区域的引用
Set myRange = Worksheets('Sheet1').Range('A1:D5')
'对Range对象进行操作
myRange.Formula = '=RAND()'
myRange.Font.Bold = True
End Sub
示例说明:可以设置Range对象变量来引用单元格区域,然后对该变量所代表的单元格区域进行操作。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-03] 清除单元格
[示例05-03-01]清除单元格中的内容(ClearContents方法)
Sub testClearContents()
MsgBox '清除指定单元格区域中的内容'
Worksheets(1).Range('A1:H8').ClearContents
End Sub
[示例05-03-02]清除单元格中的格式(ClearFormats方法)
Sub testClearFormats()
MsgBox '清除指定单元格区域中的格式'
Worksheets(1).Range('A1:H8').ClearFormats
End Sub
[示例05-03-03]清除单元格中的批注(ClearComments方法)
Sub testClearComments()
MsgBox '清除指定单元格区域中的批注'
Worksheets(1).Range('A1:H8').ClearComments
End Sub
[示例05-03-04]清除单元格中的全部,包括内容、格式和批注(Clear方法)
Sub testClear()
MsgBox '彻底清除指定单元格区域'
Worksheets(1).Range('A1:H8').Clear
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-04] Range和Cells
Sub test()
'设置单元格区域A1:J10的边框线条样式
With Worksheets(1)
.Range(.Cells(1, 1), _
.Cells(10, 10)).Borders.LineStyle = xlThick
End With
End Sub
示例说明:可用 Range(cell1, cell2) 返回一个 Range 对象,其中cell1和cell2为指定起始和终止位置的Range对象。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-05] 选取单元格区域(Select方法)
Sub testSelect()
'选取单元格区域A1:D5
Worksheets('Sheet1').Range('A1:D5').Select
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-06] 基于所选区域偏离至另一区域(Offset属性)
[示例05-06-01]
Sub testOffset()
Worksheets('Sheet1').Activate
Selection.Offset(3, 1).Select
End Sub
示例说明:可用Offset(row, column)(其中row和column为行偏移量和列偏移量)返回相对于另一区域在指定偏移量处的区域。如上例选定位于当前选定区域左上角单元格的向下三行且向右一列处单元格区域。
[示例05-06-02] 选取距当前单元格指定行数和列数的单元格
Sub ActiveCellOffice()
MsgBox '显示距当前单元格第3列、第2行的单元格中的值'
MsgBox ActiveCell.Offset(3, 2).Value
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-07] 调整区域的大小(Resize属性)
Sub ResizeRange()
Dim numRows As Integer, numcolumns As Integer
Worksheets('Sheet1').Activate
numRows = Selection.Rows.Count
numcolumns = Selection.Columns.Count
Selection.Resize(numRows + 1, numcolumns + 1).Select
End Sub
示例说明:本示例调整所选区域的大小,使之增加一行一列。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-08] 选取多个区域(Union方法)
Sub testUnion()
Dim rng1 As Range, rng2 As Range, myMultiAreaRange As Range
Worksheets('sheet1').Activate
Set rng1 = Range('A1:B2')
Set rng2 = Range('C3:D4')
Set myMultiAreaRange = Union(rng1, rng2)
myMultiAreaRange.Select
End Sub
示例说明:可用 Union(range1, range2, ...) 返回多块区域,即该区域由两个或多个连续的单元格区域所组成。如上例创建由单元格区域A1:B2和C3:D4组合定义的对象,然后选定该定义区域。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-09] 激活已选区域中的单元格
Sub ActivateRange()
MsgBox '选取单元格区域B2:D6并将C4选中'
ActiveSheet.Range('B3:D6').Select
Range('C5').Activate
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-10] 选取指定条件的单元格(SpecialCells方法)
Sub SelectSpecialCells()
MsgBox '选择当前工作表中所有公式单元格'
ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas).Select
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-11] 选取矩形区域(CurrentRegion属性)
'选取包含当前单元格的矩形区域
'该区域周边为空白行和空白列
Sub SelectCurrentRegion()
MsgBox '选取包含当前单元格的矩形区域'
ActiveCell.CurrentRegion.Select
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-12] 选取当前工作表中已用单元格(UsedRange属性)
'选取当前工作表中已使用的单元格区域
Sub SelectUsedRange()
MsgBox '选取当前工作表中已使用的单元格区域' _
& vbCrLf & '并显示其地址'
ActiveSheet.UsedRange.Select
MsgBox ActiveSheet.UsedRange.Address
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-13] 选取最边缘单元格(End属性)
'选取最下方的单元格
Sub SelectEndCell()
MsgBox '选取当前单元格区域内最下方的单元格'
ActiveCell.End(xlDown).Select
End Sub
示例说明:可以改变参数xlDown以选取最左边、最右边、最上方的单元格。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-14]设置当前单元格的前一个单元格和后一个单元格的值
Sub SetCellValue()
MsgBox '将当前单元格中前面的单元格值设为''我前面的单元格''' & vbCrLf _
& '后面的单元格值设为''我后面的单元格'''
ActiveCell.Previous.Value = '我前面的单元格'
ActiveCell.Next.Value = '我后面的单元格'
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-15]确认所选单元格区域中是否有公式(HasFormula属性)
Sub IfHasFormula()
If Selection.HasFormula = True Then
MsgBox '所选单元格中都有公式'
Else
MsgBox '所选单元格中,部分单元格没有公式'
End If
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-16] 公式单元格操作
[示例05-16-01]获取与运算结果单元格有直接关系的单元格
Sub CalRelationCell()
MsgBox '选取与当前单元格的计算结果相关的单元格'
ActiveCell.DirectPrecedents.Select
End Sub
[示例05-16-02]追踪公式单元格
Sub Cal1()
MsgBox '选取计算结果单元格相关的所有单元格'
ActiveCell.Precedents.Select
End Sub
Sub TrackCell()
MsgBox '追踪运算结果单元格'
ActiveCell.ShowPrecedents
End Sub
Sub DelTrack()
MsgBox '删除追踪线'
ActiveCell.ShowPrecedents Remove:=True
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-17] 复制单元格(Copy方法)
Sub CopyRange()
MsgBox '在单元格B7中写入公式后,将B7的內容复制到C7:D7內'
Range('B7').Formula = '=Sum(B3:B6)'
Range('B7').Copy Destination:=Range('C7:D7')
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-18]获取单元格行列值(Row属性和Column属性)
Sub RangePosition()
MsgBox '显示所选单元格区域的行列值'
MsgBox '第 ' & Selection.Row & '行 ' & Selection.Column & '列'
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-19]获取单元格区域的单元格数及行列数(Rows属性、Columns属性和Count属性)
Sub GetRowColumnNum()
MsgBox '显示所选取单元格区域的单元格数、行数和列数'
MsgBox '单元格区域中的单元格数为:' & Selection.Count
MsgBox '单元格区域中的行数为:' & Selection.Rows.Count
MsgBox '单元格区域中的列数为:' & Selection.Columns.Count
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-20]设置单元格中的文本格式
[示例05-20-01] 对齐文本
Sub HorizontalAlign()
MsgBox '将所选单元格区域中的文本左右对齐方式设为居中'
Selection.HorizontalAlignment = xlHAlignCenter
End Sub
Sub VerticalAlign()
MsgBox '将所选单元格区域中的文本上下对齐方式设为居中'
Selection.RowHeight = 36
Selection.VerticalAlignment = xlVAlignCenter
End Sub
[示例05-20-02] 缩排文本(InsertIndent方法)
Sub Indent()
MsgBox '将所选单元格区域中的文本缩排值加1'
Selection.InsertIndent 1
MsgBox '将缩排值恢复'
Selection.InsertIndent -1
End Sub
[示例05-20-03] 设置文本方向(Orientation属性)
Sub ChangeOrientation()
MsgBox '将所选单元格中的文本顺时针旋转45度'
Selection.Orientation = 45
MsgBox '将文本由横向改为纵向'
Selection.Orientation = xlVertical
MsgBox '将文本方向恢复原值'
Selection.Orientation = xlHorizontal
End Sub
[示例05-20-04]自动换行(WrapText属性)
Sub ChangeRow()
Dim i
MsgBox '将所选单元格设置为自动换行'
i = Selection.WrapText
Selection.WrapText = True
MsgBox '恢复原状'
Selection.WrapText = i
End Sub
[示例05-20-05]将比单元格列宽长的文本缩小到能容纳列宽大小(ShrinkToFit属性)
Sub AutoFit()
Dim i
MsgBox '将长于列宽的文本缩到与列宽相同'
i = Selection.ShrinkToFit
Selection.ShrinkToFit = True
MsgBox '恢复原状'
Selection.ShrinkToFit = i
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-21]设置条件格式(FormatConditions属性)
Sub FormatConditions()
MsgBox '在所选单元格区域中将单元格值小于10的单元格中的文本变为红色'
Selection.FormatConditions.Add Type:=xlCellValue, _
Operator:=xlLessEqual, Formula1:='10'
Selection.FormatConditions(1).Font.ColorIndex = 3
MsgBox '恢复原状'
Selection.FormatConditions(1).Font.ColorIndex = xlAutomatic
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-22]插入批注(AddComment方法)
Sub EnterComment()
MsgBox '在当前单元格中输入批注'
ActiveCell.AddComment ('Hello')
ActiveCell.Comment.Visible = True
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-23]隐藏/显示单元格批注
Sub CellComment()
MsgBox '切换当前单元格批注的显示和隐藏状态'
ActiveCell.Comment.Visible = Not (ActiveCell.Comment.Visible)
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-24]改变所选单元格的颜色
Sub ChangeColor()
Dim iro As Integer
MsgBox '将所选单元格的颜色改为红色'
iro = Selection.Interior.ColorIndex
Selection.Interior.ColorIndex = 3
MsgBox '将所选单元格的颜色改为蓝色'
Selection.Interior.Color = RGB(0, 0, 255)
MsgBox '恢复原状'
Selection.Interior.ColorIndex = iro
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-25]改变单元格的图案
Sub ChangePattern()
Dim p, pc, i
MsgBox '依Pattern常数值的顺序改变所选单元格的图案'
p = Selection.Interior.Pattern
pc = Selection.Interior.PatternColorIndex
For i = 9 To 16
With Selection.Interior
.Pattern = i
.PatternColor = RGB(255, 0, 0)
End With
MsgBox '常数值 ' & i
Next i
MsgBox '恢复原状'
Selection.Interior.Pattern = p
Selection.Interior.PatternColorIndex = pc
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-26]合并单元格
Sub MergeCells()
MsgBox '合并单元格A2:C2,并将文本设为居中对齐'
Range('A2:C2').Select
With Selection
.MergeCells = True
.HorizontalAlignment = xlCenter
End With
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-27]限制单元格移动的范围
Sub ScrollArea1()
MsgBox '将单元格的移动范围限制在单元格区域B2:D6中'
ActiveSheet.ScrollArea = 'B2:D6'
End Sub
Sub ScrollArea2()
MsgBox '解除移动范围限制'
ActiveSheet.ScrollArea = ''
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-28]获取单元格的位置(Address属性)
Sub GetAddress()
MsgBox '显示所选单元格区域的地址'
MsgBox '绝对地址:' & Selection.Address
MsgBox '行的绝对地址:' & Selection.Address(RowAbsolute:=False)
MsgBox '列的绝对地址:' & Selection.Address(ColumnAbsolute:=False)
MsgBox '以R1C1形式显示:' & Selection.Address(ReferenceStyle:=xlR1C1)
MsgBox '相对地址:' & Selection.Address(False, False)
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[示例05-29]删除单元格区域(Delete方法)
Sub DeleteRange()
MsgBox '删除单元格区域C2:D6后,右侧的单元格向左移动'
ActiveSheet.Range('C2:D6').Delete (xlShiftToLeft)
End Sub

小结
下面对Range对象的一些常用属性和方法进行简单的小结。
1、Activate与Select
试验下面的过程:
Sub SelectAndActivate()
Range('B3:E10').Select
Range('C5').Activate
End Sub
其结果如下图所示:
图05-01:Select与Activate
Selection指单元格区域B3:E10,而ActiveCell则是单元格C5;ActiveCell代表单个的单元格,而Selection则可以代表单个单元格,也可以代表单元格区域。
2、Range属性
可以使用Application对象的Range属性引用Range对象,如
Application.Range(“B2”) ‘代表当前工作表中的单元格B2
若引用当前工作表中的单元格,也可以忽略前面的Application对象。
Range(“A1:D10”) ‘代表当前工作表中的单元格区域A1:D10
Range(“A1:A10,C1:C10,E1:E10”) ‘代表当前工作表中非连续的三个区域组成的单元格区域
Range属性也接受指向单元格区域对角的两个参数,如:
Range(“A1”,”D10”) ‘代表单元格区域A1:D10
当然,Range属性也接受单元格区域名称,如:
Range(“Data”) ‘代表名为Data的数据区域
Range属性的参数可以是对象也可以是字符串,如:
Range(“A1”,Range(“LastCell”))
3、单元格引用的快捷方式
可以在引用区域两侧加上方括号来快速引用单元格区域,如:
[B2]
[A1:D10]
[A1:A10,C1:C10,E1:E10]
[Data]
但其引用的是绝对区域。
4、Cells属性
可以使用Cells属性来引用Range对象。如:
ActiveSheet.Cells
Application.Cells ‘引用当前工作表中的所有单元格
Cell(2,2)
Cell(2,”B”) ‘引用单元格B2
Range(Cells(1,1),Cells(10,5)) ‘引用单元格区域A1:E10
若想在一个单元格区域中循环时,使用Cells属性是很方便的。
也可以使用Cells属性进行相对引用,如:
Range(“D10:G20”).Cells(2,3) ‘表示引用单元格区域D10:G20中第2行第3列的单元格,即单元格F11
也可使用语句:Range(“D10”).Cells(2,3)达到同样的引用效果。
5、Offset属性
Offset属性基于当前单元格按所给参数进行偏移,与Cells属性不同的是,它基于0即基准单元格为0,如:
Range(“A10”).Cells(1,1)和Range(“A10”).Offset(0,0)都表示单元格A10
当想引用于基准单元格区域同样大小的单元格区域时,则Offset属性是有用的。
6、Resize属性
可使用Resize属性获取相对于原单元格区域左上角单元格指定大小的区域。
7、SpecialCells方法
SpecialCells方法对应于“定位条件”对话框,如图05-02所示:
图05-02:“定位条件”对话框
8、CurrentRegion属性
使用CurrentRegion属性可以选取当前单元格所在区域,即周围是空行和空列所围成的矩形区域,等价于“Ctrl+Shift+*”快捷键。
9、End属性
End属性所代表的操作等价于“Ctrl+方向箭”的操作,使用常量xlUp、xlDown、xlToLeft和xlToRight分别代表上、下、左、右箭。
10、Columns属性和Rows属性
Columns属性和Rows属性分别返回单元格区域中的所有列和所有行。
11、Areas集合
在多个非连续的单元格区域中使用Columns属性和Rows属性时,只是返回第一个区域的行或列,如:
Range(“A1:B5,C6:D10,E11:F15”).Rows.Count
将返回5。
此时应使用Areas集合来返回区域中每个块的地址,如:
For Each Rng In Range(“A1:B5,C6:D10,E11:F15”).Areas
MsgBox Rng.Address
Next Rng
12、Union方法和Intersect方法
当想从两个或多个单元格区域中生成一个单元格区域时,使用Union方法;当找到两个或多个单元格区域共同拥有的单元格区域时,使用Intersect方法。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cnjack/archive/2009/10/26/4729917.aspx
posted @ 2010-03-07 23:16 醉意人间 阅读(262) 评论(0) 编辑
C#中创建、打开、读取、写入、保存Excel的一般性代码

1 Excel对象
微软的Excel对象模型包括了128个不同的对象,从矩形,文本框等简单的对象到透视表,图表等复杂的对象.下面我们简单介绍一下其中最重要,也是用得最多的四个对象。
(1) Application对象。Application对象处于Excel对象层次结构的顶层,表示Excel应用程序。 (2) Workbook对象。Workbook对象直接地处于Application对象的下层,表示一个Excel工作薄文件。
(3) Worksheet对象。Worksheet对象包含于Workbook对象,表示一个Excel工作表。
(4) Range对象。Range对象包含于Worksheet对象,表示Excel工作表中的一个或多个单元格。
2 C#中的受管代码和非受管代码
在.NET公用语言框架内运行的程序为受管代码。受管代码在程序中所有类型都受到严格检查,没有指针,对内存的管理完全由运行系统控制。受控状态下,编写 程序更为容易,且更少出错,我们可以花更多的时间在解决实际问题上而不是在计算机语言问题上。相对而言,那些在.NET框架外运行的程序为非受管代码。比 如:COM组件、ActiveX组件、Win32 API函数、指针运算等。C#编程中在某些特定情况下,需要运用非受管代码,例如,要利用一个成熟的COM组件,或者调用一个API函数,或者用指针去编 写实时/高效程序等。
3 Visual C#中调用Excel的COM组件
一个.NET组件事实上是一个.NET下的DLL,它包含的不仅是运行程序本身,更重要的是包含这个DLL的描述信息(Meta Data,即元数据),而一个COM组件是用其类库(TLB)储存其描述信息。这些COM组件都是非受管代码,要在Visual C#中使用这些非受管代码的COM组件,就必须把他们转换成受管代码的.NET组件。所以在用Visual C#调用Excel表格之前,必须完成从COM组件的非受管代码到受管代码的类库的转换。
3.1 将Excel的COM组件转换为.NET组件
在项目中打开Add Reference对话框,选择COM栏,之后在COM列表中找到“Microsoft Excel 9.0 Object Library”(Office 2000),然后将其加入到项目的References中即可。Visual C#.NET会自动产生相应的.NET组件文件,以后即可正常使用。
http://hi.baidu.com/zhaochenbo/blog/item/f6d70ff7bf32fa2a730eec39.html
这个转换形成.NET组件不能单独使用,它不过是以前的COM组件的一个外层包装,在.NET中可以通过这个外层包装去发现原来的COM组件并调用其相应的界面函数。所以它必须与原来的COM组件一起起作用。
3.2 Visual C#打开Excel表格
事实上,在C#中使用一个经转换的COM组件和使用任何一个其它.NET组件完全一样。可以用new关键字创建一个经转换的COM组件,然后再像使用任何一个其它C#对象一样使用这个组件对象。
在转换后的.NET组件中定义了一个命名空间Excel,在此命名空间中封装了一个类Application,这个类和启动Excel表格有非常重要的关 系,在Visual C#中,只需要下列三行代码就可以完成打开Excel表格的工作,具体如下:
Excel.Application excel = new Excel.Application ();//引用Excel对象
excel.Application.Workbooks.Add ( true );//引用Excel工作簿
excel.Visible = true ;//使Excel可视
  但此时的Excel表格是一个空的表格,没有任何内容,下面就来介绍如何往Excel表格中输入数据。
3.3 往Excel表格中输入数据
在命名空间'Excel'中,还定义了一个类'Cell',这个类所代表的就是Excel表格中的一个单元格。通过给'Cell'赋值,从而实现往Excel表格中输入相应的数据,下列代码功能是打开Excel表格,并且往表格输入一些数据。
Excel.Application excel = new Excel.Application () ;
excel.Application.Workbooks.Add ( true ) ;
excel.Cells[ 1 , 1 ] = 'First Row First Column' ;
excel.Cells[ 1 , 2 ] = 'First Row Second Column' ;
excel.Cells[ 2 , 1 ] = 'Second Row First Column' ;
excel.Cells[ 2 , 2 ] = 'Second Row Second Column' ;
excel.Visible = true ;
3.4 实例
下面实例在C#中连接Oracle数据库(Name),从表(TableName)中读取数据,并写入Excel.
string cnString='Provider=msdaora.1;Data source=Name; ';
cnString=cnString+'user id=UserName;password=Password';
try
{
OleDbConnection cn=new OleDbConnection (cnString);
cn.Open ();
try
{
string s='select * from Name.TableName';
OleDbCommand cmd=new OleDbCommand (s,cn);
OleDbDataReader dr=cmd.ExecuteReader ();
Excel.Application xlApp = new Excel.Application();
if(xlApp==null){MessageBox.Show ('Can’t open Excel!');return;}
xlApp.Application .Workbooks .Add (true);
int row=2,fieldcount;
fieldcount=dr.FieldCount ;
for(int col=0;col<fieldcount;col++) xlApp.Cells [1,col+1]=dr.GetName(col);
while (dr.Read ())
{
for(int col=0;col<fieldcount;col++)
xlApp.Cells [row,col+1]=dr.GetValue(col).ToString();
row++;
}
xlApp.Visible =true;
xlApp=null;
}
catch(Exception ex ){MessageBox.Show (ex.Message );}
finally {cn.Close();}
}
catch(Exception ex){MessageBox.Show (ex.Message );}
}
}
3.5安装一个使用COM组件的.NET程序
如果要将这样的程序安装运行在另一台机器上,那么除了安装运行程序外,还做三件事。
首先,是安装.NET运行系统。因为任何一个.NET程序都不能离开.NET运行系统去独立运行。
其次,所调用的COM组件必须要安装在目标机器上。本例中大多数目标机器上都装有Microsoft Office的Excel,一般不会有这个问题。但如果是另一个用户自定义的COM组件,那么这个COM组件在运行.NET程序之前必须先安装好。
最后,转换后的.NET组件DLL文件要安装在目标机器上。因为.NET组件不需要在Windows Registry中注册,所以最简单的方法是将.NET组件DLL文件拷贝到运行程序目录下。如果此.NET组件被多个.NET程序共享,可以将其安装 在.NET公用组件区中,从而可被任何一个.NET组件使用。只有当一个.NET组件参与了事务处理时,才需要将它注册为一个COM+组件。因为.NET 仍然用传统的COM+机制来处理事务的提交、回滚等。
4 小结
通过以上讨论,我们知道了在C#中,如何使用Excel的COM组件。需要注意的是,Excel对象包含的许多内容我们没有介绍,在使用过程中需要我们不断学习。也使我们了解了在C#中如何使用COM组件。
参考文献:
[1] 刘洪成 C#高级编程 清华大学出版社 2003.7工作 187~200

C#中创建、打开、读取、写入、保存Excel的一般性代码
首先,在引用的COM中找到Microsoft Excel 11.0 Object Library,添加。
using System;
using System.Reflection; // 引用这个才能使用Missing字段
using Excel;
namespace CExcel1
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
//创建Application对象
Excel.Application xApp=new Excel.ApplicationClass();
xApp.Visible=true;
//得到WorkBook对象, 可以用两种方式之一: 下面的是打开已有的文件
Excel.Workbook xBook=xApp.Workbooks._Open(@'D:\Sample.xls',
Missing.Value,Missing.Value,Missing.Value,Missing.Value
,Missing.Value,Missing.Value,Missing.Value,Missing.Value
,Missing.Value,Missing.Value,Missing.Value,Missing.Value);         
      //xBook=xApp.Workbooks.Add(Missing.Value);//新建文件的代码
//指定要操作的Sheet,两种方式:
Excel.Worksheet xSheet=(Excel.Worksheet)xBook.Sheets[1];
//Excel.Worksheet xSheet=(Excel.Worksheet)xApp.ActiveSheet;
//读取数据,通过Range对象
Excel.Range rng1=xSheet.get_Range('A1',Type.Missing);
Console.WriteLine(rng1.Value2);
//读取,通过Range对象,但使用不同的接口得到Range
Excel.Range rng2=(Excel.Range)xSheet.Cells[3,1];
Console.WriteLine(rng2.Value2);
//写入数据
Excel.Range rng3=xSheet.get_Range('C6',Missing.Value);
rng3.Value2='Hello';
rng3.Interior.ColorIndex=6; //设置Range的背景色
//保存方式一:保存WorkBook
xBook.SaveAs(@'D:\CData.xls',
Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,
Excel.XlSaveAsAccessMode.xlNoChange,Missing.Value,Missing.Value,Missing.Value,
Missing.Value,Missing.Value);
//保存方式二:保存WorkSheet
xSheet.SaveAs(@'D:\CData2.xls',
Missing.Value,Missing.Value,Missing.Value,Missing.Value,
Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
//保存方式三
xBook.Save();
xSheet=null;
xBook=null;
xApp.Quit(); //这一句是非常重要的,否则Excel对象不能从内存中退出
xApp=null;
}
}
}

我的更多文章

下载客户端阅读体验更佳

APP专享