随着经济的不景气,越来越多的公司将办公软件从较昂贵的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代码附上,以供参考!