QT操作Word,插入表格
阿新 • • 發佈:2019-02-15
最近在做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
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呼叫的是方法。