QT操作Word,插入表格

最近在做QT导出word报表,发现网上的资源不是很多,也浪费了很多时间,我自己做了一份demo,将会详细讲述如何做出需要样式的报表。在网上很容易查到java或者其他语言操作word的接口函数,但是QT能操作word的,不是很多,而且还不太好用。我把自己已经调试出来的代码,贡献出来,免得以后浪费时间。
写了一部分接口函数,可以满足大部分的word报表。在QT工程中,QWorddemo.pro中,需要加入如下:
QT默认安装在C盘中。
下载地址:http://download.csdn.net/download/blackbattery/10001438
分数有点高了,分享一个百度云盘网址:链接: https://pan.baidu.com/s/1qWv4tTY-VGPNONJUvyhLlw 提取码: esqk
链接:https://share.weiyun.com/59gwQjX 密码:v74rng

LIBS    +=C:\Qt\Qt5.5.1\5.5\msvc2010\lib\qtmaind.lib
LIBS    +=C:\Qt\Qt5.5.1\5.5\msvc2010\lib\Qt5Cored.lib
LIBS    +=C:\Qt\Qt5.5.1\5.5\msvc2010\lib\Qt5Guid.lib
LIBS    +=C:\Qt\Qt5.5.1\5.5\msvc2010\lib\Qt5Widgetsd.lib
LIBS    +=C:\Qt\Qt5.5.1\5.5\msvc2010\lib\Qt5AxContainerd.lib
LIBS    +=C:\Qt\Qt5.5.1\5.5\msvc2010\lib\Qt5AxBased.lib

在word中插入表格:

void QWord::intsertTableint row,int column)
{	QAxObject* tables = m_document->querySubObject"Tables");	QAxObject* selection = m_word->querySubObject"Selection");	QAxObject* range = selection->querySubObject"Range");QVariantList params;params.appendrange->asVariant));		params.appendrow);params.appendcolumn);	tables->querySubObject"AddQAxObject*, int, int, QVariant&, QVariant&)", params);QAxObject* table = selection->querySubObject"Tablesint)",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.openQIODevice::WriteOnly|QIODevice::Append);QTextStream ts&outFile);ts<<doc<<endl;/*QString doc = tables->generateDocumentation);QFile outFile"D:\\360Downloads\\Picutres\\tables.html");outFile.openQIODevice::WriteOnly|QIODevice::Append);QTextStream ts&outFile);ts<<doc<<endl;*/	
}

这是插入表格的函数,其中border使用画出表格边线。其中
QString doc = Borders->generateDocumentation);这部分代码是将其中的关于border属性导出来的。
合并单元格的函数有两种实现方法,我选择的是第一种,其中tableindex表示的是第几个table。
合并单元格的函数:

void QWord::MergeCellsint tableIndex, int nStartRow,int nStartCol,int nEndRow,int nEndCol)//合并单元格
{QAxObject* tables = m_document->querySubObject"Tables");QAxObject* table = tables->querySubObject"Itemint)",tableIndex);QAxObject* StartCell =table->querySubObject"Cellint, int)",nStartRow,nStartCol);QAxObject* EndCell = table->querySubObject"Cellint, int)",nEndRow,nEndCol);StartCell->querySubObject"MergeQAxObject *)",EndCell->asVariant));
}
//第二种方法调用
// void QWord::MergeCellsint tableIndex, int nStartRow,int nStartCol,int nEndRow,int nEndCol)//合并单元格
// {
// 	QAxObject* tables = m_document->querySubObject"Tables");	
// 	QAxObject* table = tables->querySubObject"Itemint)",tableIndex);
// 	QAxObject* StartCell =table->querySubObject"Cellint, int)",nStartRow,nStartCol);
// 	QAxObject* EndCell = table->querySubObject"Cellint, int)",nEndRow,nEndCol);
// 	StartCell->dynamicCall"MergeLPDISPATCH)",EndCell->asVariant));
// }插入图片的函数,需要考虑到图片的大小,固定单元格的大小,可以使图片自适应单元格的。
void QWord::insertCellPicint row,int column,const QString& picPath)
{QAxObject* selection = m_word->querySubObject"Selection");	QAxObject* table = selection->querySubObject"Tables1)");QAxObject* range = table->querySubObject"Cellint, int)",row,column)->querySubObject"Range");range->querySubObject"InlineShapes")->dynamicCall"AddPictureconst QString&)",picPath);
}

还有增加行的需求,我又写了增加行的接口函数,提供给别人调用。

void QWord::addTableRowint tableIndex ,int nRow,int rowCount)
{QAxObject* tables=m_document->querySubObject"Tables");QAxObject* table = tables->querySubObject"Itemint)",tableIndex);QAxObject* rows =table->querySubObject"Rows");int Count =rows->dynamicCall"Count").toInt);if0< nRow && nRow < Count ){   forint i =0; i< rowCount; ++i){QString sPos = QString"Item%1)").argnRow+i);QAxObject* row= rows->querySubObjectsPos.toStdString).c_str));QVariant param =row ->asVariant);rows->dynamicCall"AddVariant)",param);}			}	
}

这个函数很重要,再插入表格的时候,当你插入第二个表格的时候,必须要使用此函数,要不然的话,
其他表格的数据将会覆盖第一个表格的内容。这个函数将光标移到末尾,跳出单元格。

void QWord::moveForEnd)//光标移到末尾,才能真正的跳出单元格
{QAxObject* selection = m_word->querySubObject"Selection");	QVariantList params;params.append6);		params.append0);		selection->dynamicCall"EndOfQVariant&, QVariant&)", params).toInt);
}

关于部分接口函数的dynamicCall和querySubObject,需要注意,
querySubObject调用的是属性或者返回值,dynamicCall调用的是方法。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注