QT操作Word,插入表格
来源:互联网 发布:久远银海软件 编辑:程序博客网 时间:2024/04/29 14:46
最近在做QT导出word报表,发现网上的资源不是很多,也浪费了很多时间,我自己做了一份demo,将会详细讲述如何做出需要样式的报表。在网上很容易查到java或者其他语言操作word的接口函数,但是QT能操作word的,不是很多,而且还不太好用。我把自己已经调试出来的代码,贡献出来,免得以后浪费时间。如果有错误的话,可以联系我。我的邮箱地址:leiluo1894@126.com.
写了一部分接口函数,可以满足大部分的word报表。在QT工程中,QWorddemo.pro中,需要加入如下:
QT默认安装在C盘中。
完成工程连接: 360云盘 https://yunpan.cn/c6sMvvp6RIYZB (提取码:e737)
百度云盘 链接: http://pan.baidu.com/s/1geCM3jd 密码: ktmz
LIBS +=C:\Qt\Qt5.5.1\5.5\msvc2010\lib\qtmaind.libLIBS +=C:\Qt\Qt5.5.1\5.5\msvc2010\lib\Qt5Cored.libLIBS +=C:\Qt\Qt5.5.1\5.5\msvc2010\lib\Qt5Guid.libLIBS +=C:\Qt\Qt5.5.1\5.5\msvc2010\lib\Qt5Widgetsd.libLIBS +=C:\Qt\Qt5.5.1\5.5\msvc2010\lib\Qt5AxContainerd.libLIBS +=C:\Qt\Qt5.5.1\5.5\msvc2010\lib\Qt5AxBased.lib
在word中插入表格:
void QWord::intsertTable(int row,int column){ QAxObject* tables = m_document->querySubObject("Tables"); QAxObject* selection = m_word->querySubObject("Selection"); QAxObject* range = selection->querySubObject("Range"); QVariantList params; params.append(range->asVariant()); params.append(row); params.append(column); tables->querySubObject("Add(QAxObject*, int, int, QVariant&, QVariant&)", params); QAxObject* table = selection->querySubObject("Tables(int)",1); table->setProperty("Style","网格型"); QAxObject* Borders = table->querySubObject("Borders"); Borders->setProperty("InsideLineStyle",1); Borders->setProperty("OutsideLineStyle",1); QString doc = Borders->generateDocumentation(); QFile outFile("D:\\360Downloads\\Picutres\\Borders.html"); outFile.open(QIODevice::WriteOnly|QIODevice::Append); QTextStream ts(&outFile); ts<<doc<<endl; /*QString doc = tables->generateDocumentation(); QFile outFile("D:\\360Downloads\\Picutres\\tables.html"); outFile.open(QIODevice::WriteOnly|QIODevice::Append); QTextStream ts(&outFile); ts<<doc<<endl;*/ }
这是插入表格的函数,其中border使用画出表格边线。其中
QString doc = Borders->generateDocumentation();这部分代码是将其中的关于border属性导出来的。
合并单元格的函数有两种实现方法,我选择的是第一种,其中tableindex表示的是第几个table。
合并单元格的函数:
void QWord::MergeCells(int tableIndex, int nStartRow,int nStartCol,int nEndRow,int nEndCol)//合并单元格{ QAxObject* tables = m_document->querySubObject("Tables"); QAxObject* table = tables->querySubObject("Item(int)",tableIndex); QAxObject* StartCell =table->querySubObject("Cell(int, int)",nStartRow,nStartCol); QAxObject* EndCell = table->querySubObject("Cell(int, int)",nEndRow,nEndCol); StartCell->querySubObject("Merge(QAxObject *)",EndCell->asVariant());}//第二种方法调用// void QWord::MergeCells(int tableIndex, int nStartRow,int nStartCol,int nEndRow,int nEndCol)//合并单元格// {// QAxObject* tables = m_document->querySubObject("Tables"); // QAxObject* table = tables->querySubObject("Item(int)",tableIndex);// QAxObject* StartCell =table->querySubObject("Cell(int, int)",nStartRow,nStartCol);// QAxObject* EndCell = table->querySubObject("Cell(int, int)",nEndRow,nEndCol);// StartCell->dynamicCall("Merge(LPDISPATCH)",EndCell->asVariant());// }插入图片的函数,需要考虑到图片的大小,固定单元格的大小,可以使图片自适应单元格的。void QWord::insertCellPic(int row,int column,const QString& picPath){ QAxObject* selection = m_word->querySubObject("Selection"); QAxObject* table = selection->querySubObject("Tables(1)"); QAxObject* range = table->querySubObject("Cell(int, int)",row,column)->querySubObject("Range"); range->querySubObject("InlineShapes")->dynamicCall("AddPicture(const QString&)",picPath);}
还有增加行的需求,我又写了增加行的接口函数,提供给别人调用。
void QWord::addTableRow(int tableIndex ,int nRow,int rowCount){ QAxObject* tables=m_document->querySubObject("Tables"); QAxObject* table = tables->querySubObject("Item(int)",tableIndex); QAxObject* rows =table->querySubObject("Rows"); int Count =rows->dynamicCall("Count").toInt(); if(0< nRow && nRow < Count ) { for(int i =0; i< rowCount; ++i) { QString sPos = QString("Item(%1)").arg(nRow+i); QAxObject* row= rows->querySubObject(sPos.toStdString().c_str()); QVariant param =row ->asVariant(); rows->dynamicCall("Add(Variant)",param); } } }
这个函数很重要,再插入表格的时候,当你插入第二个表格的时候,必须要使用此函数,要不然的话,
其他表格的数据将会覆盖第一个表格的内容。这个函数将光标移到末尾,跳出单元格。
void QWord::moveForEnd()//光标移到末尾,才能真正的跳出单元格{ QAxObject* selection = m_word->querySubObject("Selection"); QVariantList params; params.append(6); params.append(0); selection->dynamicCall("EndOf(QVariant&, QVariant&)", params).toInt();}
关于部分接口函数的dynamicCall和querySubObject,需要注意,
querySubObject调用的是属性或者返回值,dynamicCall调用的是方法。
- QT操作Word,插入表格
- c#/.net操作word插入表格实例
- win form 操作word模板插入文字、图片及表格
- C# VS2012操作word文档 (二).插入表格图片
- C++操作word:插入文字、图片、表格,设置样式字体
- C# 操作在Word表格中插入新行(表格含合并行)
- c#调用Aspose.Word组件操作word 插入文字/图片/表格 书签替换套打
- C#中操作Word(7)—— 如何向Word中插入表格
- c#操作word表格
- c#操作word表格
- c#操作word表格
- c#操作word表格
- c#操作word表格
- c#操作word表格
- c#操作word表格
- c#操作word表格
- c#操作word表格
- c#操作word表格
- Java替换字符串中的空格
- PHP学习之路之Smarty变量调节器
- 【杭电 1722】Cake
- 辗转相除求gcd
- jsp监听器listener
- QT操作Word,插入表格
- 对于优先队列的一些思考
- 团体程序设计天梯赛-练习集 L1-009. N个数求和 重载+运算符 解题报告
- (模板题)sdut 3373 数据结构实验之查找一:二叉排序树(二叉排序树的建立)
- 线段树模板
- Android之Activity生命周期
- python安装lxml类库(windows环境下 )
- An introduction to Linear Regression
- java 线程安全和不安全