QT操作Word,插入表格

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/blackbattery/article/details/52013159

最近在做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/1MLqW9ECOM6qZvAfuugfP0A 密码: t8i3

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

猜你喜欢

转载自blog.csdn.net/blackbattery/article/details/52013159