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