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

来源:互联网 发布:mathematica 人工智能 编辑:程序博客网 时间:2024/04/30 00:01

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

 

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的电子表格文档,里面的内容以该如下图:

 

MyTest.xls

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

 

可以看到,主要的使用原则就是从文档实例获取不同的接口,然后调用接口里的方法完成所需的功能。
(待续)

原创粉丝点击