saptechnique

Better late than never. - 郭富

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
一、在VB中使用OWC组件
    引用Office Web Component组件到项目中(ProjectàComponents
    选择Microsoft Office Web Components 11.0,点击应用将会在工具栏中出现五个组件,
分别为ChartSpaceSpreadSheetDataSourceControlRecordNevigationControlPivotTable。本文档仅就SpreadSheet的相关操作进行说明,其余请参考《Microsoft Office Web组件Visual Basic参考》。
二、通过可视化配置设定OWC的呈现效果及相关属性
    可以通过设定命令和选项来更改OWC呈现的相关设置(在SpreadSheet上点击右键调出)
通过设定格式工作表工作簿等选项,将OWCSpreadSheet显示格式设定为如下图所示样式,其中列表头是不显示的,采用第一列充当表头,并且锁定第一行的区域,使得表头可以始终呈现给用户(实现该步骤,只需要将鼠标选中第二行,并设定格式中的单元格à锁定,如上图所示小锁头符号)。
    还需要在属性设定中设定其是否显示TitleBarToolBarOfficeLogo等。
    1
要实现类Grid效果,则应不允许插入列、删除列等。可以设定保护得到效果。
不过,不建议在设计时就做保护的设定。因为程序运行过程中会对SpreadSheet做数据填充或呈现样式修改等动作,就必须先要取消SpreadSheet的保护效果,在代码上有些冗余。所以建议在运行中动态调整保护的选项,可以通过SpreadSheet.ActiveSheet.Protect()方法设定。
2
如何设定单元格的值类型?
方法一、可以通过设定格式中的数字格式设定一列或某单元格的值类型
方法二、代码实现,可以在Excel中录制宏得到VBS代码
''@ means Text ; '0.00000_ ' means numeric ; '0_ ' means integer
Me.xlSpreadsheet.ActiveSheet.Range("A:B").NumberFormat = "@"
Me.xlSpreadsheet.ActiveSheet.Range("C:C").NumberFormat = "0.00000_ "
Me.xlSpreadsheet.ActiveSheet.Range("D:K").NumberFormat = "@"
Me.xlSpreadsheet.ActiveSheet.Range("L:N").NumberFormat = "0_ "
注意:0_后面还有一个空格,这个是不可少的。
3
第一行作为Title,则Title不允许在运行时被User修改,所以需要Lock该行,可以通过设计时设定,也可以在运行时动态控制
''''Lock the Title, can not be modified
xlSpreadsheet.ActiveSheet.Range("A1:B1").Locked = True
三、呈现数据、读取数据、更改呈现样式等操作方式
    1:呈现数据
SpreadSheet的数据来源可以有三种,分别为CSV DataXMLHtml,分别对应方法为CSVData/CSVURLXMLData/XMLURLHTMLData/HTMLURL。不过这仅限于比较规则的二维表结构的数据。
一般的还是采用逐行设定值的方式。
xlSpreadsheet.ActiveSheet.Cells(intRowCounter, intColCounter).Value
        注意:不管采用哪种方式,都需要先将SpreadSheet锁定区域解锁,才能将值设定上去。
    2:读取数据
       SpreadSheet上读取数据的方式与呈现数据方式类似,直接采用逐行逐列方式读取。
    3:更改呈现样式
SpreadSheet的样式设定非常灵活,可以设定一行、一列、多行、多列、选定单元格等的样式。其动态设定方式分别为如下所示:
''''设定一列的背景颜色,可以通过下面几种方式
xlSpreadsheet.ActiveSheet.Columns(1).Interior.Color = vbRed
xlSpreadsheet.ActiveSheet.Columns(1).Interior.ColorIndex = 10
xlSpreadsheet.ActiveSheet.Range("A:A").Interior.Color = vbRed
''''设定一列的字体颜色,可以通过下面几种方式
xlSpreadsheet.ActiveSheet.Columns(1).Font.Color = vbRed
xlSpreadsheet.ActiveSheet.Columns(1).Font.ColorIndex = 10
xlSpreadsheet.ActiveSheet.Range("A:A").Font.Color = vbRed
''''设定一行的背景、字体颜色,可以通过下面几种方式
xlSpreadsheet.ActiveSheet.Rows(1).Interior.Color = vbRed
xlSpreadsheet.ActiveSheet.Rows(1).Interior.ColorIndex = 10
xlSpreadsheet.ActiveSheet.Rows(1).Font.Color = vbRed
xlSpreadsheet.ActiveSheet.Rows(1).Font.ColorIndex = 10
''''设定多行或多列的背景、字体颜色,类似
''''设定选定单元格的背景、字体颜色,如下
xlSpreadsheet.ActiveCell.Interior.Color = vbRed
xlSpreadsheet.ActiveCell.Interior.ColorIndex = 10
xlSpreadsheet.ActiveSheet.Cells(1,1).Interior.Color = vbRed
''''设定一列隐藏
xlSpreadsheet.ActiveSheet.Columns(1).Hidden = True
四、事件的组合使用、数据有效性Check
要使用OWC中的Events,首先必须开启Events功能。可以在属性窗口中将EnableEvents更改为True即可(默认也是True)。
1CommandBeforeExecute
在执行一个Command之前发生。如在执行删除行之前需要判断是否选中了多行,则可以在该事件中判断Selection.Rows.Count并做相应的处理。
此事件中可以拦截SpreadSheetCommandID中所有的Command事件。
    2CommandExecute
在执行一个Command时发生。如粘贴时做相应的查询动作,则可以捕获CommandIDssCommandCopyCommand,并根据数据做相应的处理。
        此事件中可以拦截SpreadSheetCommandID中所有的Command事件。
    3StartEdit
       在单元格开始进入编辑状态时发生
    4EndEdit
在单元格编辑完成之后发生,不管单元格内的数据有没有做更新,都会发生。其中FinalValue代表编辑之后的值,之前的值可以通过Cell读取。
       可以在此事件中做相应的查询处理,类似粘贴时的动作。
    5DblClick
       在双击SpreadSheet时发生。可以将SpreadSheet的选定单元格置于Edit状态。
    6BeforeKeyPress
       在单元格的KeyPress事件之前发生。可在此事件中针对不同Column进行数据的Check
如第1列只允许输入Double型数据,则可以通过xlSpreadsheet.ActiveCell.Column获取当前编辑的列。然后判断KeyAscii的范围进行相应处理。

If (KeyAscii < Asc("0") Or KeyAscii > Asc("9")) And _
    KeyAscii <> vbKeyBack And KeyAscii <> Asc(".") Then
    Cancel.Value = 1
End If

    7BeforeContextMenu
在显示上下文菜单之前发生。可以在此事件中屏蔽SpreadSheet原有的菜单,也可以设定自定义的上下文呢菜单。
五、与Excel的互操作
VB中提供Excel下载、上传功能,可以采用OWCExcel的一些相似操作提高性能和简化操作的复杂性。
1Export To Excel
    OWC SpreadSheet中的有效数据ExportExcel中,可以采用如下两种方式:
    a)SpreadSheet.Exports方法的使用
SpreadSheet带有的方法Exports可以将SpreadSheet中的数据和格式统统导出成Excel。不过此时生成的Excel不是二进制编码的文件,而是XML编码的文件。一定程度上带有局限性。
       b)Copy And Paste
           可以将SpreadSheet的有效区域选中,
SpreadSheet.ActiceSheet.UsedRange.Rows.Count将返回有效行数;
SpreadSheet.ActiceSheet.UsedRange.Columns.Count将返回有效列数(一般列数固定)。
Spreadsheet.Range("A1:S" & 有效行).Copy
Excel.WorkBooks(1).WorkSheets(1).Paste
附录:
    附一、OWC SpreadSheet useful command list
SpreadSheetCommandId
Command ID
Command Name
Description
1000
ssCommandUndo
撤销
1001
ssCommandCut
剪切
1002
ssCommandCopy
复制
1003
ssCommandPaste
粘贴
 
 
 
10006
ssCommandDeleteRows
删除行(一行或多行)
10007
ssCommandDeleteCols
删除列(一列或多列)
10008
ssCommandInsertRows
插入行(一行或多行)
10009
ssCommandInsertCols
插入列(一列或多列)
 
 
 
10011
ssCommandSelectRow
选择一行
10012
ssCommandSelectCol
选择一列
10013
ssCommandSelectAll
选中Sheet中的全部内容
 
这里仅枚举出常用的Command,对于其他的参数,请参考《Microsoft Office Web组件Visual Basic参考》中的枚举SpreadSheetCommandID
   
    附二、OWC SpreadSheet Objects
转自:
posted on 2011-03-21 01:17  guofu  阅读(539)  评论(0编辑  收藏  举报