最近在做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调用的是方法。