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