OOo on ready---VB篇

随着经济的不景气,越来越多的公司将办公软件从较昂贵的MS Office转换为便宜甚至免费的Open Office.org(简称OOo),毕竟OOo几乎可以满足所有的日常办公需求,并且兼容MS Office,那么作为开发人员的我们必须对OOo的开发进行了解。

本序列包括OOo on ready---VB篇和OOo on ready---C#篇

本文开篇使用VB做开发语言对scalc来做一个Demo,演示OOo的一些常用开发。

一、OOo的基本操作

该处需要做以下四个动作:

1、打开OpenOffice服务:

Set mySM = CreateObject("com.sun.star.ServiceManager")

2、打开OpenOffice程序:

Set myDesk = mySM.createInstance("com.sun.star.frame.Desktop")

3、创建OpenOffice文件:

Set myFile = myDesk.loadComponentFromURL("private:factory/scalc", "_blank", 0, myArgs())

4、获取OpenOffice工作薄:

Set mySheet = mySheets.getByIndex(0)

5、获得当前文档:

Set document = myDesk.CurrentComponent.CurrentController.Frame

6、创建一个dispatcher(调度器?):

Set dispatcher = mySM.createInstance("com.sun.star.frame.DispatchHelper")

有了这些,就可以对对单元格进行操作了:比如写入字符串

Set myCell = mySheet.getCellByPosition(0, 0) 
Call myCell.setString("Normal Material Application")
二、将MSFlexGrid内的数据导出为scalc文件
做一中的前4步以获得一个工作薄,之后就可以使用那个如下方法将数据导入到scale中:
    With gData
        For i = 0 To .Rows - 1
           If i = 0 Then
                For j = 0 To .Cols - 1
                Set myCell = mySheet.getCellByPosition(j, i)
                Call myCell.setString(.TextMatrix(i, j))
                Next j
           Else
            For j = 0 To .Cols - 1
                If j = 0 Then
                    Set myCell = mySheet.getCellByPosition(j, i)
                    Call myCell.setString(.TextMatrix(i, j))
                Else
                    Set myCell = mySheet.getCellByPosition(j, i)
                    
                    Call myCell.setValue(Val(.TextMatrix(i, j)))
                End If
            Next j
           End If
        Next i
    End With

表格的相关属性我们将在下面的文字中描述。

三、在scalc文件内绘制chart图

同样的,要做一中的前4步以获得一个工作薄,然后

1、获得一个矩形序列:

Set Rect = mySM.Bridge_GetStruct("com.sun.star.awt.Rectangle")
2、获得一个cell地址:
Set RangeAddress(0) = mySM.Bridge_GetStruct("com.sun.star.table.CellRangeAddress")
3、在当前工作薄内插入一个chart图:
Call Charts.addNewByName("LineChart", Rect, RangeAddress(), True, True)
4、获得该chart图:
Set Chart = Charts.getByName("LineChart").embeddedObject
5、对该chart图的相关属性进行赋值或者修改,比如,修改该图的形状:
Chart.Diagram = Chart.createInstance("com.sun.star.chart.LineDiagram")
这里有各种chart图的形状如下
//Diagram Service Names
            //com.sun.star.chart.BarDiagram
            //com.sun.star.chart.AreaDiagram
            //com.sun.star.chart.LineDiagram
            //com.sun.star.chart.PieDiagram
            //com.sun.star.chart.DonutDiagram
            //com.sun.star.chart.NetDiagram
            //com.sun.star.chart.XYDiagram
            //com.sun.star.chart.StockDiagram
四、在scalc文件内插入一张图片
同样运行一中的6个步骤获得一个dispatcher,然后使用该dispatcher来运行OOo中的UNO命令
Call dispatcher.executeDispatch(document, ".uno:InsertGraphic", "", 0, args2())
其中args2()是一个相关属性值的数组,需要使用如下方法进行定义:
Set args2(0) = mySM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
赋值方法很简单,使用.Name及.Value进行赋值,如:
args2(0).Name = "FilterName"
args2(0).Value = "GIF - Graphics Interchange Format"
上面的属性是定义插入的该图片的后缀名必须为GIF.

五、在scalc文件内表格的属性进行设置

在OOo的文件中,相关属性是先定义一个PropertyValue,再对该属性设置Name、Value,然后使用dispatcher让OOo去执行该属性。

例如我们对表格的单元格的宽度进行设置,就可以使用如下的函数进行:

Public Function setColWidth(mySM As Object, mySheet As Object, document 
As Object, dispatcher As Object, cellValue As String, lngWidth As Long)
    'Select Cells
    Dim args1(0) As Object

    Set args1(0) = mySM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    args1(0).Name = "ToPoint"
    args1(0).Value = cellValue

    Call dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

    Dim args2(0) As Object
    Set args2(0) = mySM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    args2(0).Name = "ColumnWidth"
    args2(0).Value = lngWidth
    
    Call dispatcher.executeDispatch(document, ".uno:ColumnWidth", "", 0, args2())
End Function

对表格的表框进行设置我们就可以使用如下函数进行:

Public Function addBorder(mySM As Object, mySheet As Object, document As Object, dispatcher As Object, cellValue As String)
    
    'Select Cells
    Dim args1(0) As Object

    Set args1(0) = mySM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    args1(0).Name = "ToPoint"
    args1(0).Value = cellValue

    Call dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
    
    Dim args5(12) As Object
    Set args5(0) = mySM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    Set args5(1) = mySM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    Set args5(2) = mySM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    Set args5(3) = mySM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    Set args5(4) = mySM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    Set args5(5) = mySM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    Set args5(6) = mySM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    Set args5(7) = mySM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    Set args5(8) = mySM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    Set args5(9) = mySM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    Set args5(10) = mySM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    Set args5(11) = mySM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    Set args5(12) = mySM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    args5(0).Name = "OuterBorder.LeftBorder"
    args5(0).Value = Array(0, 0, 2, 0)
    args5(1).Name = "OuterBorder.LeftDistance"
    args5(1).Value = 0
    args5(2).Name = "OuterBorder.RightBorder"
    args5(2).Value = Array(0, 0, 2, 0)
    args5(3).Name = "OuterBorder.RightDistance"
    args5(3).Value = 0
    args5(4).Name = "OuterBorder.TopBorder"
    args5(4).Value = Array(0, 0, 2, 0)
    args5(5).Name = "OuterBorder.TopDistance"
    args5(5).Value = 0
    args5(6).Name = "OuterBorder.BottomBorder"
    args5(6).Value = Array(0, 0, 2, 0)
    args5(7).Name = "OuterBorder.BottomDistance"
    args5(7).Value = 0
    args5(8).Name = "InnerBorder.Horizontal"
    args5(8).Value = Array(0, 0, 2, 0)
    args5(9).Name = "InnerBorder.Vertical"
    args5(9).Value = Array(0, 0, 2, 0)
    args5(10).Name = "InnerBorder.Flags"
    args5(10).Value = 0
    args5(11).Name = "InnerBorder.ValidFlags"
    args5(11).Value = 127
    args5(12).Name = "InnerBorder.DefaultDistance"
    args5(12).Value = 0

    Call dispatcher.executeDispatch(document, ".uno:SetBorderStyle", "", 0, args5())
    
End Function

六、总结一下

本文讲解了VB对OOo开发的相关操作,其实对OOo的操作很简单,一般都是通过执行OOo提供的UNO相关命令进行的,执行方式和OOo中的marco基本上一个样,如果想做到什么想过,就可以先在OOo中录制一个marco,然后查看该marco的代码,在VB中转换就可以了。最后,将本文的demo代码附上,以供参考!

更多技术文章,敬请登陆http://www.qx-net.cn/