1. 程式人生 > >QT操作Word,插入表格

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/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\msvc
2010\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呼叫的是方法。