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文档并且填入了一些内容
可以看到,主要的使用原则就是从文档实例获取不同的接口,然后调用接口里的方法完成所需的功能。
(待续)
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文档并且填入了一些内容
可以看到,主要的使用原则就是从文档实例获取不同的接口,然后调用接口里的方法完成所需的功能。
(待续)
相关文章推荐
- OpenOffice Calc开发(C++) 5 第一个工程SpreadSheetTest
- OpenOffice Calc开发(C++) 6 如何创建自己的工程
- OpenOffice Calc开发(C++) 3 sdk的设置
- OpenOffice Calc开发(C++) 4 sdk的设置续
- 一个在线五笔的例子的代码,很不错,转载过来共享
- 用装饰模式优化代码的一个简单例子
- 利用Eclipse开发struts项目的一个例子
- LotusScript 操作 OpenOffice calc
- 微信公众平台java开发详解(工程代码+解析)
- Java代码构建一个线程池 Java,线程池 [程序开发Java] IT.com.cn IT世界网
- iOS开发UI基础—24使用纯代码自定义UItableviewcell实现一个简单的微博界面布局
- ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局
- 用装饰模式优化代码的一个简单例子
- 一个listView的例子代码
- 用一个例子详解主题敏感(topic-sensitive)pagerank算法流程
- Openoffice.org calc常用操作函数集锦
- 信息系统开发平台OpenExpressApp -代码目录说明
- IOS一个滚动视图的小例子(代码)
- blockchain 区块链200行代码:在JavaScript实现的一个简单的例子
- 用装饰模式优化代码的一个简单例子