zoukankan      html  css  js  c++  java
  • OOo on readyVB篇

    随着经济的不景气,越来越多的公司将办公软件从较昂贵的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/

  • 相关阅读:
    LeetCode 40. 组合总和 II(Combination Sum II)
    LeetCode 129. 求根到叶子节点数字之和(Sum Root to Leaf Numbers)
    LeetCode 60. 第k个排列(Permutation Sequence)
    LeetCode 47. 全排列 II(Permutations II)
    LeetCode 46. 全排列(Permutations)
    LeetCode 93. 复原IP地址(Restore IP Addresses)
    LeetCode 98. 验证二叉搜索树(Validate Binary Search Tree)
    LeetCode 59. 螺旋矩阵 II(Spiral Matrix II)
    一重指针和二重指针
    指针的意义
  • 原文地址:https://www.cnblogs.com/frankie/p/1547566.html
Copyright © 2011-2022 走看看