OOo on ready—C#篇

随着经济的不景气,越来越多的公司将办公软件从较昂贵的MS Office转换为便宜甚至免费的Open Office.org(简称OOo),毕竟OOo几乎可以满足所有的日常办公需求,并且兼容MS Office,那么作为开发人员的我们必须对OOo的开发进行了解。
本序列包括OOo on ready---VB篇和OOo on ready---C#篇
本文开篇使用C#做开发语言对scalc来做一个Demo,演示OOo的一些常用开发。

Open Office.org好像格外对.net用户眷顾,在其发布的SDK下已经为用户准备好了几个dll文件,路径在<sdkpath>\cli\下,如图:

image

这样的话,.net对OOo的编程就简单多了。

首先,引用这么几个dll文件

image

引用完毕后,就可以使用对象浏览器查看OOo所提供的相关方法了。下面具体讲一下如何启动OOo并且建立一个工作薄。

首先要引用几个命名空间:

using unoidl.com.sun.star.lang;

using unoidl.com.sun.star.uno;

using unoidl.com.sun.star.bridge;

using unoidl.com.sun.star.frame;

然后使用bootstrap获得一个OOo组件,如果OOo没有打开就会新建一个:

unoidl.com.sun.star.uno.XComponentContext m_xContext = uno.util.Bootstrap.bootstrap();
然后使用该组件获得一个服务管理器:
unoidl.com.sun.star.lang.XMultiServiceFactory mxMSFactory=(XMultiServiceFactory)m_xContext.getServiceManager()
这样就实现了OOo的连接,使用该服务管理器,我们可以创建一个桌面实例,我们将该桌面实例强制转换为XComponent loader以便打开一个文档:
XComponentLoader aLoader = (XComponentLoader)

mxMSFactory.createInstance("com.sun.star.frame.Desktop");
然后我们使用该loader创建一个新文件或者打开一个已经存在的文件:
XComponent xComponent =
 aLoader.loadComponentFromURL(

"private:factory/scalc", "_blank", 0,

myArgs);

或者

XComponent xComponent =
 aLoader.loadComponentFromURL(

filepath, "_blank", 0,

myArgs);
unoidl.com.sun.star.sheet.XSpreadsheetDocument mxDocument=
(unoidl.com.sun.star.sheet.XSpreadsheetDocument)xComponent

注意:

1、此处的filepath不是我们一般的文件路径,因为OOo的路径格式比较特殊,必须是:file:\\\样式的,我们使用以下的一个函数进行转换:

/// <summary>

/// OOo路径转换

/// </summary>

/// <param name="file">windows 原始路径</param>

/// <returns>OOo的路径格式</returns>

public string PathConverter(string file)

{

file = file.Replace(@"\", "/");

return "file:///" + file;

}
2、此处的myArgs是打开时的参数,不使用任何参数就可以直接用一个默认值
new unoidl.com.sun.star.beans.PropertyValue[0]
如果有参数,比如不显式打开文档,就可以定义一个这样的属性参数数组:
unoidl.com.sun.star.beans.PropertyValue[] myArgs=new unoidl.com.sun.star.beans.PropertyValue[1];

myArgs[0] = new unoidl.com.sun.star.beans.PropertyValue();

myArgs[0].Name = "Hidden";

myArgs[0].Value =new uno.Any(IsHidden) 
有了XSpreadsheetDocument这个接口,就可以获得一张工作薄了:
/// <summary>

/// Returns the spreadsheet with the specified index (0-based).

/// </summary>

/// <param name="nIndex">The index of the sheet</param>

/// <returns>XSpreadsheet interface of the sheet.</returns>

public unoidl.com.sun.star.sheet.XSpreadsheet getSpreadsheet(int nIndex)

{

// Collection of sheets

unoidl.com.sun.star.sheet.XSpreadsheets xSheets =

mxDocument.getSheets();

unoidl.com.sun.star.container.XIndexAccess xSheetsIA =

(unoidl.com.sun.star.container.XIndexAccess)xSheets;

unoidl.com.sun.star.sheet.XSpreadsheet xSheet =

(unoidl.com.sun.star.sheet.XSpreadsheet)

xSheetsIA.getByIndex(nIndex).Value;

return xSheet;

}
有了这张工作薄,就可以“为所欲为”了,比如获得单元格,我们可以用:
unoidl.com.sun.star.table.XCell xCell = xSheet.getCellByPosition(col, row);
对单元格赋值我们使用:xCell.setValue(fValue);对单元格设置格式我们用xCell.setFormula(aFormula)等。
最后,我们看一下如何存储:
unoidl.com.sun.star.frame.XStorable xStorable = mxDocument as XStorable;

xStorable.storeAsURL(PathConverter(storeUrl), new unoidl.com.sun.star.beans.PropertyValue[] { });
存储之后需要关闭文档:
unoidl.com.sun.star.util.XCloseable xCloseable = 
mxDocument as unoidl.com.sun.star.util.XCloseable;
xCloseable.close(true);
本人将OOo的.net操作结合OOo的SDK内的实例封装成一个helper类,见附件,下面以生成一个chart图的实例说明如何使用该类:
private void doChartFunction(string filename)

{

SpreadSheetHelper helper = new SpreadSheetHelper(true);

// for common usage

unoidl.com.sun.star.sheet.XSpreadsheet xSheet =helper.getSpreadsheet(0);

unoidl.com.sun.star.beans.XPropertySet xPropSet = null;

unoidl.com.sun.star.table.XCell xCell = null;

unoidl.com.sun.star.table.XCellRange xCellRange = null;
// Create a cell series with the values 1 ... 7.

for (int nRow = 8; nRow < 15; ++nRow)

xSheet.getCellByPosition(0, nRow).setValue(nRow - 7);
// *** Inserting CHARTS ***

unoidl.com.sun.star.table.XTableChartsSupplier xChartsSupp =

(unoidl.com.sun.star.table.XTableChartsSupplier)xSheet;

unoidl.com.sun.star.table.XTableCharts xCharts =

xChartsSupp.getCharts();

// The chart will base on the last cell series, initializing all values.

String aName = "newChart";

unoidl.com.sun.star.awt.Rectangle aRect =

new unoidl.com.sun.star.awt.Rectangle();

aRect.X = 10000;

aRect.Y = 3000;

aRect.Width = aRect.Height = 5000;

unoidl.com.sun.star.table.CellRangeAddress[] aRanges =

new unoidl.com.sun.star.table.CellRangeAddress[1];

aRanges[0] = helper.createCellRangeAddress(xSheet, "A9:A14");

// Create the chart.

xCharts.addNewByName(aName, aRect, aRanges, false, false);

// Get the chart by name.

uno.Any aChartObj = xCharts.getByName(aName);

unoidl.com.sun.star.table.XTableChart xChart =

(unoidl.com.sun.star.table.XTableChart)aChartObj.Value;

//change the chart style

//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

unoidl.com.sun.star.chart.XChartDocument aChartDocument = 
(xChart as unoidl.com.sun.star.document.XEmbeddedObjectSupplier).getEmbeddedObject() 
as unoidl.com.sun.star.chart.XChartDocument;

unoidl.com.sun.star.lang.XMultiServiceFactory aFact = 
aChartDocument as unoidl.com.sun.star.lang.XMultiServiceFactory;

unoidl.com.sun.star.chart.XDiagram aDiagram = 
aFact.createInstance("com.sun.star.chart.AreaDiagram") as unoidl.com.sun.star.chart.XDiagram;

aChartDocument.setDiagram(aDiagram);

// Query the state of row and column headers.

aText = "Chart has column headers: ";

aText += xChart.getHasColumnHeaders() ? "yes" : "no";

helper.getCellByPosition(xSheet, 2, 8).setFormula(aText);

//xSheet.getCellByPosition(2, 8).setFormula(aText);

aText = "Chart has row headers: ";

aText += xChart.getHasRowHeaders() ? "yes" : "no";

helper.getCellByPosition(xSheet, 2, 9).setFormula(aText);

//xSheet.getCellByPosition(2, 9).setFormula(aText);

helper.storeDocComponent(filename);

helper.closeDocCompant();

}

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

你可能感兴趣的:(ready)