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调用的是方法。

0 0
原创粉丝点击