您的位置:首页 > 编程语言 > C语言/C++

OpenOffice Calc开发(C++) 7 一个例子的代码详解

2009-05-05 21:34 543 查看
前面我们看到了一个生成电子表格的例子,下面我们就来详细查看其中代码的含义

int main()

{

if(FindInstallAndSetPath() != ERROR_SUCCESS)

{

return -1;

}

这个函数FindInstallAndSetPath()必须在一开始的时候执行,它的作用我在前面也说过,就是设置OpenOffice的环境以及实现能够延迟加载一些必须的.dll文件。它的实现你不用关心,你只需要把它的定义从前面我们下载的atlOOo.h文件里拷过来就好了,注意作者的版权声明。

Reference<XComponentContext> xContext;
Reference<XMultiComponentFactory> xMSFactory;
Reference<XComponent> xDocument;

// 启动OpenOffice组件对象
xContext = bootstrap();

// 获取OpenOffice的服务manager
xMSFactory = xContext->getServiceManager();

// 获取一个OpenOffice的桌面服务对象实例并且获取XComponentLoader接口
Reference<XInterface> desktop = xMSFactory->createInstanceWithContext(
OUString::createFromAscii("com.sun.star.frame.Desktop"),
xContext );

Reference<XComponentLoader> rComponentLoader( desktop, UNO_QUERY_THROW );

// 设置启动属性,这里将属性“Hidden”设为了true表示采用隐藏模式打开,也就是说新建文件的时候不让用户看到窗口

//在这里我们的属性序列loadPorps只有一个元素loadProps[0],你也可以设置多个元素的属性序列
Sequence<PropertyValue> loadProps(1);
loadProps[0].Name = OUString::createFromAscii("Hidden");
loadProps[0].Value = Any(true);//new Boolean(true);

//得到一个新建SpreadSheet文档的实例,注意这里的参数“private:factory/scalc”表示新建一个calc文档,

//参数“_blank”表示是一个空白文档
xDocument = rComponentLoader->loadComponentFromURL(
OUString::createFromAscii("private:factory/scalc"),
OUString::createFromAscii("_blank"),
0,
loadProps);

上面的这一部分代码就是启动OpenOffice相关组件,新建文档并获得文档实例。相对来说比较麻烦,很难记得住,但是他们基本上都是固定的,不需要改变,因此你可以把这部分封装起来,以简化使用。

接下来:

//获取一个XSpreadsheetDocument接口
Reference< XSpreadsheetDocument > rSheetDoc (xDocument, UNO_QUERY);

//获取XSpreadsheets接口来操作文档
Reference< XSpreadsheets > rSheets = rSheetDoc->getSheets();

//获取XIndexAccess接口,这样我们能采用下标index的方式来操作文档中的某个sheet

//还可以采用名称的方式来访问某个sheet,需要XNameAccess接口,在这里为了简单我们没有采用
Reference< XIndexAccess > xSheetsIA (rSheets, UNO_QUERY);
Any sheet = xSheetsIA->getByIndex( 0 ); //获取0号sheet的接口
Reference< XSpreadsheet > rSpSheet (sheet, UNO_QUERY);

double num = 1.0;
for(int i=0; i<10; i++,num+=2.0)
{
Reference<XCell> cell = rSpSheet->getCellByPosition(i, 0); //获取第i列,第0行的cell接口
cell->setValue(num); //给这个cell设置值
}

// 下面我们要计算第0行从0到9列这10个数的总和,并把它用红色字符输出在第0行第10列的位置
Reference<XCell> cell = rSpSheet->getCellByPosition(10, 0);

// 给第0行第10列这个cell插入公式"=SUM(A1:J1)",也可以用setFormula这个函数插入普通的字符串
cell->setFormula(OUString::createFromAscii("=SUM(A1:J1)"));

// 从第0行第10列这个cell获取它的XPropertySet接口,用于给它设置各种属性

Reference< XPropertySet > rCellProps (cell, UNO_QUERY);

Any PropVal;

PropVal <<= (Color)(0xff0000); //声明一个属性PropVal并给他塞入一个颜色0xff0000(红色)

// 用setPropertyValue函数设置属性,第一个参数表示将要设置字符的颜色,第二个参数是已经塞入颜色的PropVal

rCellProps->setPropertyValue(OUString::createFromAscii("CharColor"), PropVal);

接下来我们准备保存这个文档

// 从文档获取XStorable接口,准备保存

Reference<XStorable> rStore (xDocument, UNO_QUERY);

Sequence<PropertyValue> storeProps(1);

// 和前面类似,这里也是填入属性,属性的名字是"FilterName",表示要设置的是保存文件的格式

// 属性的值是"MS Excel 97",表示保存格式为Excel电子表格
storeProps[0].Name = OUString::createFromAscii("FilterName");
storeProps[0].Value = Any( OUString::createFromAscii("MS Excel 97") );

// 用XStorable接口的storeAsURL方法保存文档,第一个参数是保存路径,第二个参数是我们刚填好的保存格式属性
rStore->storeAsURL( OUString::createFromAscii("file:///c:/MyTest.xls"), storeProps );

// 释放文档,也就是关闭文档,这个必须执行,不然文档会处于打开状态不能被别的程序访问。
xDocument->dispose();
return 0;
}

代码就是这些,如果编译成功,运行后应该会在你的c盘根目录下生成一个MyTest.xls的电子表格文档,里面的内容以该如下图:



成功了!到此为止,我们已经完整地新建了一个xls文档并且填入了一些内容

可以看到,主要的使用原则就是从文档实例获取不同的接口,然后调用接口里的方法完成所需的功能。
(待续)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: