QT Word 操作
QT提供QAxObject 类操作相对比较晦涩难懂 学习Office操作可借鉴VBA编程,通过VBA编程了解Office相关属性参数等,同时也可以通过微软Office官网进行学习:https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.office.interop.word.paragraphformat?view=word-pia
1、pro 文件增加
QT += axcontainer。
2、增加 OfficeWordEngine 引擎类。
此处为 抽象基类用于 Excel/Word的提供纯虚函数。
#ifndef OFFICEWORDENGINE_H
#define OFFICEWORDENGINE_H#include
#include
#include
#include
class OfficeWordEngine
{
public:virtual ~OfficeWordEngine(){}virtual bool saveToFile(const QString &savePath)=0;virtual bool saveAs(const QString &savePath)=0;virtual bool mergeCells(QPairbeginPoint,QPairendPoint)=0;virtual bool setCellsValue(QList>cells,QListvalues)=0;virtual bool open(const QString &sFile,bool bVisible)=0;virtual bool replaceText(const QString &sLabel,const QString &sText)=0;virtual bool setMarks(const QString &sMark,const QString &sText)=0;virtual bool setMultMarks(const QList>&sText) =0;virtual bool findAndReplace(const QString &oldStr,const QString &newStr,bool replaceAll=true)=0;virtual bool setTableContext(QAxObject *table,int row,int cloumn,QVariant sText)=0;virtual bool close1()=0;
};
#endif // OFFICEWORDENGINE_H
3、实例化 WordEngine类,该类继承于 OfficeWordEngine基类。并实现具体的纯虚函数。
私有成员变量中WordEnginePrivate *d_ptr 为具体的内部实例化类,此处主要用到二进制兼容以及源码兼容,在 QT源码中体现 dq指针。
#ifndef WORDENGINE_H
#define WORDENGINE_H#include "officewordengine.h"
class WordEnginePrivate;
class WordEngine : public OfficeWordEngine
{
public:WordEngine();~WordEngine();bool saveToFile(const QString &savePath);bool saveAs(const QString &savePath);bool mergeCells(QPairbeginPoint,QPairendPoint);bool setCellsValue(QList>cells,QListvalues);bool open(const QString &sFile,bool bVisible=false);bool replaceText(const QString &sLabel,const QString &sText);bool setMarks(const QString &sMark,const QString &sText);bool setMultMarks(const QList>&sText);bool findAndReplace(const QString &oldStr,const QString &newStr,bool replaceAll=true);bool setTableContext(QAxObject *table,int row,int cloumn,QVariant sText);bool close1();QAxObject *getRange(int row,int cloumn);QAxObject *getRange(QPair point);bool setLeftHorizontalAlignment(QAxObject *pRange);bool setRigthHorizontalAlignment(QAxObject *pRange);bool setCenterAlignment(QAxObject *pRange);//插入一个几行几列表格QAxObject *insertTable(QString sLabel,int row,int column);//插入一个几行几列表格 并设置表头QAxObject *insertTable(QString sLabel,int row,int column,QStringList headList);//设置列宽void setColumnWidth(QAxObject *table,int column, int width);//设置行高void setRowHeight(int row, float height);void SetTableCellString(QAxObject *table, int row,int column,QString text);bool setTableContext(QAxObject *table,int row,int cloumn,const QVariant &value);bool addTableRow(QAxObject *table, int nRow, int rowCount);bool addTableRow( int nRow, int rowCount);//Selection.Rows.Deletebool deleteRow(int nRow);int getRowCount();int getCloumnCount();private:WordEnginePrivate *d_ptr = NULL;
};#endif // WORDENGINE_H
4、WordEngine.cpp 文件
#include "wordengine.h"
#include "wordengineprivate.h"WordEngine::WordEngine()
{d_ptr = new WordEnginePrivate;
}WordEngine::~WordEngine(){if (d_ptr)delete d_ptr;}bool WordEngine::saveToFile(const QString &savePath)
{return d_ptr->saveToFile(savePath);
}bool WordEngine::saveAs(const QString &savePath){return d_ptr->saveAs(savePath);}bool WordEngine::mergeCells(QPairbeginPoint,QPairendPoint){return d_ptr->mergeCells(beginPoint,endPoint);}bool WordEngine::setCellsValue(QList>cells,QListvalues){return d_ptr->setCellsValue(cells,values);}bool WordEngine::open(const QString &sFile,bool bVisible)
{return d_ptr->open(sFile,bVisible);
}
bool WordEngine::replaceText(const QString &sLabel,const QString &sText)
{return d_ptr->replaceText(sLabel,sText);
}
bool WordEngine::setMarks(const QString &sMark,const QString &sText)
{return d_ptr->setMarks(sMark,sText);
}bool WordEngine::setMultMarks(const QList< QPair >& sText)
{return d_ptr->setMultMarks(sText);
}bool WordEngine::findAndReplace(const QString &oldStr,const QString &newStr,bool replaceAll)
{return d_ptr->findAndReplace(oldStr,newStr,replaceAll);
}
bool WordEngine::setTableContext(QAxObject *table,int row,int cloumn,QVariant sText)
{return d_ptr->setTableContext(table,row,cloumn,sText);
}
bool WordEngine::close1()
{return d_ptr->close1();
}QAxObject *WordEngine::getRange(int row,int cloumn)
{return d_ptr->getRange(row,cloumn);
}
QAxObject *WordEngine::getRange(QPair point)
{return getRange(point.first,point.second);
}bool WordEngine::setLeftHorizontalAlignment(QAxObject *p)
{return d_ptr->setLeftHorizontalAlignment(p);
}
bool WordEngine::setRigthHorizontalAlignment(QAxObject *p)
{return d_ptr->setRigthHorizontalAlignment(p);
}bool WordEngine::setCenterAlignment(QAxObject *pRange){return d_ptr->setCenterAlignment(pRange);}//插入一个几行几列表格
QAxObject * WordEngine::WordEngine::insertTable(QString sLabel,int row,int column)
{return d_ptr->insertTable(sLabel,row,column);
}
//插入一个几行几列表格 并设置表头
QAxObject * WordEngine::WordEngine::insertTable(QString sLabel,int row,int column,QStringList headList)
{return d_ptr->insertTable(sLabel,row,column,headList);
}
//设置列宽
void WordEngine::setColumnWidth(QAxObject *table,int column, int width)
{d_ptr->setColumnWidth(table,column,width);
}void WordEngine::setRowHeight( int row, float height)
{d_ptr->setRowHeight(row,height);
}
void WordEngine::SetTableCellString(QAxObject *table, int row,int column,QString text)
{d_ptr->SetTableCellString(table,row,column,text);
}bool WordEngine::setTableContext(QAxObject *table,int row,int cloumn,const QVariant &value)
{return d_ptr->setTableContext(table,row,cloumn,value);
}bool WordEngine::addTableRow(QAxObject *table, int nRow, int rowCount)
{return d_ptr->addTableRow(table,nRow,rowCount);
}bool WordEngine::addTableRow( int nRow, int rowCount)
{return d_ptr->addTableRow(nRow,rowCount);
}//Selection.Rows.Delete
bool WordEngine::deleteRow(int nRow)
{return d_ptr->deleteRow(nRow);
}
int WordEngine::getRowCount()
{return d_ptr->getRowCount();
}
int WordEngine::getCloumnCount()
{return d_ptr->getCloumnCount();
}
5、WordEnginePrivate 头文件
#ifndef WORDENGINEPRIVATE_H
#define WORDENGINEPRIVATE_H#include "officewordengine.h"
#include
#include
#include
#include class WordEnginePrivate : public OfficeWordEngine
{
public:WordEnginePrivate();virtual ~WordEnginePrivate();bool saveToFile(const QString &savePath);bool saveAs(const QString &savePath);bool mergeCells(QPairbeginPoint,QPairendPoint);bool setCellsValue(QList>cells,QListvalues);bool open(const QString &sFile,bool bVisible);bool replaceText(const QString &sLabel,const QString &sText);bool setMarks(const QString &sMark,const QString &sText);bool setMultMarks(const QList>&sText);bool findAndReplace(const QString &oldStr,const QString &newStr,bool replaceAll=true);bool setTableContext(QAxObject *table,int row,int cloumn,QVariant sText);bool close1();QAxObject *getRange(int row,int cloumn);//QAxObject *getRange(QPair point);bool setLeftHorizontalAlignment(QAxObject *pRange);bool setRigthHorizontalAlignment(QAxObject *pRange);bool setCenterAlignment(QAxObject *pRange);//插入一个几行几列表格QAxObject *insertTable(QString sLabel,int row,int column);//插入一个几行几列表格 并设置表头QAxObject *insertTable(QString sLabel,int row,int column,QStringList headList);//设置列宽void setColumnWidth(QAxObject *table,int column, int width);void setRowHeight( int row, float height);void SetTableCellString(QAxObject *table, int row,int column,QString text);// bool setTableContext(QAxObject *table,int row,int cloumn,const QVariant &value);bool addTableRow(QAxObject *table, int nRow, int rowCount);bool addTableRow( int nRow, int rowCount);bool setTableContext(QAxObject *table,std::pairrowCloumn,const QVariant &value);bool setTableContext(const QString& wordFileName,std::pairrowCloumn,const QVariant &value);bool deleteRow(int nRow);int getRowCount();int getCloumnCount();private:inline bool isNull(QAxObject *);inline bool existTable();
private:QAxObject *m_pWord = NULL; //指向整个Word应用程序QAxObject *m_pWorkDocuments = NULL; //指向文档集,Word有很多文档QAxObject *m_pWorkDocument = NULL; //指向m_sFile对应的文档,就是要操作的文档QString m_sFile;bool m_bIsOpen =false;bool m_bNewFile =false;
};#endif // WORDENGINEPRIVATE_H
6、WordEnginePrivate.cpp 文件
#include "wordengineprivate.h"
#include "qt_windows.h"
#include
#include
#include
#include
#include
#include
WordEnginePrivate::WordEnginePrivate()
{HRESULT result = OleInitialize(0);if (result != S_OK && result != S_FALSE){qDebug()<dynamicCall("Save()");}else{//m_pWorkDocument->dynamicCall("SaveAs (const QString&,int,const QString&,const QString&,bool,bool)",// m_sFile,56,QString(""),QString(""),false,false);//qDebug()<dynamicCall("SaveAs (const QString&)", sSavePath);//m_pWorkDocument->dynamicCall("SaveAs (const QString&)","");}}qDebug()<<"save Done.";return true;
}
/**** 保存文件另存为操作
*/
bool WordEnginePrivate::saveAs(const QString &savePath)
{return m_pWorkDocument->dynamicCall("SaveAs (const QString&)",savePath).toBool();
}bool WordEnginePrivate::mergeCells(QPairbeginPoint,QPairendPoint)
{if (!existTable())return false;QAxObject* pTable = m_pWorkDocument->querySubObject( "Tables" );QAxObject* onTable = pTable->querySubObject("Item(int)",1);QAxObject* cell11 = onTable->querySubObject("Cell(int,int)",beginPoint.first,beginPoint.second);QAxObject* cell19 = onTable->querySubObject("Cell(int,int)",endPoint.first,endPoint.second);cell11->querySubObject("Range")->querySubObject("ParagraphFormat")->dynamicCall("Alignment", "wdAlignParagraphLeft");cell19->querySubObject("Range")->querySubObject("ParagraphFormat")->dynamicCall("Alignment", "wdAlignParagraphLeft");bool isOk = cell11->dynamicCall("Merge(QAxObject*)", cell19->asVariant()).toBool();return isOk;
}bool WordEnginePrivate::setCellsValue(QList>cells,QListvalues)
{
#if 0if(!isNull(m_pWorkDocument))return false;QAxObject* pTable = m_pWorkDocument->querySubObject( "Tables" );if(!isNull(pTable))return false;QAxObject* onTable = pTable->querySubObject("Item(int)",/*tableIndex*/1);if(!onTable->isNull())return false;
#elseif (!existTable())return false;QAxObject* pTable = m_pWorkDocument->querySubObject( "Tables" );QAxObject* onTable = pTable->querySubObject("Item(int)",1);
#endifint index =0;QList>::const_iterator it;for (it = cells.begin(); it != cells.end(); it ++) {QPair oneMarkPair = *it;int row = oneMarkPair.first;int column = oneMarkPair.second;QAxObject *range = onTable->querySubObject("Cell(int,int)", row, column);//qDebug() << Q_FUNC_INFO << __LINE__ << range->setProperty("HorizontalAlignment", -4131);range->dynamicCall("Select(void)");range->querySubObject("Range")->setProperty("Text", values.at(index));//range->dynamicCall("SetValue(const QString&)", values.at(index));index ++;}return true;
}bool WordEnginePrivate::open(const QString &sFile,bool bVisible)
{//新建一个word应用程序m_pWord = new QAxObject();bool bFlag = m_pWord->setControl( "word.application" );// m_pWord=new QAxWidget("Word.Application", 0, Qt::MSWindowsOwnDC);// bool bFlag = m_pWord->setControl( "Word.Application" );qDebug()<<"sFile"<setProperty("Visible", bVisible);//获取所有的工作文档m_pWorkDocuments = m_pWord->querySubObject("Documents");if(!m_pWorkDocuments){qDebug()<<"!m_pWorkDocuments";return false;}//以文件template.dot为模版新建一个文档// m_pWorkDocuments->dynamicCall("Add(QString)",sFile);m_pWorkDocuments->querySubObject("Open(const QString&)",sFile);this->m_sFile = sFile;//获取当前激活的文档m_pWorkDocument = m_pWord->querySubObject("ActiveDocument");if(m_pWorkDocument)m_bIsOpen = true;elsem_bIsOpen = false;qDebug()<<"m_bIsOpen"<querySubObject("Bookmarks(QString)",sLabel);if(!pBookmark->isNull ()){pBookmark->dynamicCall("Select(void)");pBookmark->querySubObject("Range")->setProperty("Text",sText);delete pBookmark;}return true;
}
bool WordEnginePrivate::setMarks(const QString &strMark,const QString &sText)
{if (!isNull(m_pWorkDocument))return false;QAxObject* bookmarkCode = NULL;bookmarkCode = m_pWorkDocument->querySubObject("Bookmarks(QVariant)", strMark);//选中标签,将字符textg插入到标签位置if(bookmarkCode) {bookmarkCode->dynamicCall("Select(void)");bookmarkCode->querySubObject("Range")->setProperty("Text", sText);return true;}return false;
}bool WordEnginePrivate::setMultMarks(const QList>&sText)
{if (!isNull(m_pWorkDocument))return false;QAxObject* bookmarkCode = NULL;QList>::const_iterator it;for (it = sText.begin(); it != sText.end(); it++) {QPair oneMarkPair = *it;QString strMark = oneMarkPair.first;QString strText = oneMarkPair.second;bookmarkCode = m_pWorkDocument->querySubObject("Bookmarks(QVariant)", strMark);//选中标签,将字符textg插入到标签位置if(bookmarkCode) {bookmarkCode->dynamicCall("Select(void)");bookmarkCode->querySubObject("Range")->setProperty("Text", strText);}elsereturn false;}return true;
}bool WordEnginePrivate::findAndReplace(const QString &oldStr,const QString &newStr,bool replaceAll)
{if(!isNull(m_pWorkDocument))return false;auto content = m_pWorkDocument->querySubObject("Content()");if (!isNull(content))return false;auto find = content->querySubObject("Find");if (!isNull(find))return false;qDebug() <dynamicCall("Execute(QString,bool,bool,bool,bool,bool,bool,int,bool,QString,int)",vl).toBool();}
//bool WordEnginePrivate::setTableContext(QAxObject *table,int row,
// int cloumn,QVariant sText)
//{
// if (table->isNull() || row <=0 || cloumn <=0)
// return false;// QAxObject *cell = table->querySubObject("Cell(int, int)",row,cloumn);
// QAxObject *cellRange = cell->querySubObject("Range");// return cellRange->dynamicCall("Text", value).toBool();
//}
bool WordEnginePrivate::close1()
{if(m_pWorkDocument)m_pWorkDocument->dynamicCall("Close(boolean)", true);if(m_pWord)m_pWord->dynamicCall("Quit(void)");if(m_pWorkDocuments)delete m_pWorkDocuments;if(m_pWord)delete m_pWord;m_pWorkDocument = NULL;m_pWorkDocuments = NULL;m_pWord = NULL;m_bIsOpen = false;m_bNewFile = false;return true;
}
QAxObject *WordEnginePrivate::getRange(int row,int cloumn)
{if (!existTable())return false;QAxObject* pTable = m_pWorkDocument->querySubObject( "Tables" );QAxObject* onTable = pTable->querySubObject("Item(int)",1);QAxObject *cell = onTable->querySubObject("Cell(int, int)",row,cloumn);return cell->querySubObject("Range");}bool WordEnginePrivate::setLeftHorizontalAlignment(QAxObject *pRange)
{if ( pRange == nullptr|| !existTable())return false;pRange->querySubObject("ParagraphFormat")->dynamicCall("Alignment", "wdAlignParagraphLeft");return true;}
bool WordEnginePrivate::setRigthHorizontalAlignment(QAxObject *pRange)
{if ( pRange == nullptr||!existTable())return false;pRange->querySubObject("ParagraphFormat")->dynamicCall("Alignment", "wdAlignParagraphRight");return true;
}
bool WordEnginePrivate::setCenterAlignment(QAxObject *pRange)
{if ( pRange == nullptr||!existTable())return false;pRange->querySubObject("ParagraphFormat")->dynamicCall("Alignment", "wdAlignParagraphCenter");return true;
}//插入一个几行几列表格
QAxObject *WordEnginePrivate::insertTable(QString sLabel,int row,int column)
{QAxObject *bookmark = m_pWorkDocument->querySubObject("Bookmarks(QVariant)", sLabel);if(!bookmark->isNull ()){bookmark->dynamicCall("Select(void)");QAxObject *selection = m_pWord->querySubObject("Selection");selection->dynamicCall("InsertAfter(QString&)", "\n");//selection->dynamicCall("MoveLeft(int)", 1);//selection->querySubObject("ParagraphFormat")->dynamicCall("Alignment", "wdAlignParagraphCenter");selection->querySubObject("ParagraphFormat")->dynamicCall("Alignment", "wdAlignParagraphLeft");selection->dynamicCall("TypeText(QString&)", "Table Test");//设置标题QAxObject *range = selection->querySubObject("Range");QAxObject *tables = m_pWorkDocument->querySubObject("Tables");QAxObject *table = tables->querySubObject("Add(QVariant,int,int)",range->asVariant(),row,column);for(int i=1;i<=6;i++){QString str = QString("Borders(-%1)").arg(i);QAxObject *borders = table->querySubObject(str.toLatin1().constData());borders->dynamicCall("SetLineStyle(int)",1);}return table;}return nullptr;
}//插入一个几行几列表格 并设置表头
QAxObject *WordEnginePrivate::insertTable(QString sLabel,int row,int column,QStringList headList)
{QAxObject *bookmark = m_pWorkDocument->querySubObject("Bookmarks(QVariant)", sLabel);if(headList.size() != column){return NULL;}if(bookmark){bookmark->dynamicCall("Select(void)");QAxObject *selection = m_pWord->querySubObject("Selection");selection->dynamicCall("InsertAfter(QString&)", "\r\n");//selection->dynamicCall("MoveLeft(int)", 1);selection->querySubObject("ParagraphFormat")->dynamicCall("Alignment", "wdAlignParagraphCenter");//设置标题//selection->dynamicCall("TypeText(QString&)", "Table Test");QAxObject *range = selection->querySubObject("Range");QAxObject *tables = m_pWorkDocument->querySubObject("Tables");QAxObject *table = tables->querySubObject("Add(QVariant,int,int)",range->asVariant(),row,column);//表格自动拉伸列 0固定 1根据内容调整 2 根据窗口调整table->dynamicCall("AutoFitBehavior(WdAutoFitBehavior)", 2);//设置表头for(int i=0;iquerySubObject("Cell(int,int)",1,i+1)->querySubObject("Range")->dynamicCall("SetText(QString)", headList.at(i));//加粗table->querySubObject("Cell(int,int)",1,i+1)->querySubObject("Range")->dynamicCall("SetBold(int)", true);}for(int i=1;i<=6;i++){QString str = QString("Borders(-%1)").arg(i);QAxObject *borders = table->querySubObject(str.toLatin1 ().constData());borders->dynamicCall("SetLineStyle(int)",1);}return table;}return nullptr;
}//设置列宽
void WordEnginePrivate::setColumnWidth(QAxObject *table,int column, int width)
{if(!table) return;table->querySubObject("Columns(int)",column)->setProperty("Width",width);}void WordEnginePrivate::setRowHeight( int row, float height)
{qDebug()<querySubObject("Tables");if(!pTables) return;QAxObject* pTable = pTables->querySubObject("Item(int)",1);if(!pTable)return;QAxObject* pRows = pTable->querySubObject("Rows");if(!pRows)return;QAxObject* pRow = pRows->querySubObject("Item(int)",row);if(!pRow)return;pRow->setProperty("Height",int(height));qDebug()<querySubObject("Cell(int,int)",row,column);if(!cell) return;cell->dynamicCall("Select(void)");cell->querySubObject("Range")->setProperty("Text", text);
}bool WordEnginePrivate::setTableContext(QAxObject *table,int row,int cloumn,const QVariant value)
{if (table->isNull() || row <=0 || cloumn <=0)return false;QAxObject *cell = table->querySubObject("Cell(int, int)",row,cloumn);QAxObject *cellRange = cell->querySubObject("Range");return cellRange->dynamicCall("Text", value).toBool();
}bool WordEnginePrivate::addTableRow(QAxObject *table, int nRow, int rowCount)
{if (table->isNull() || nRow <=0 || rowCount <= 0)return false;QAxObject* rows = table->querySubObject("Rows");int Count = rows->dynamicCall("Count").toInt();qDebug() << Q_FUNC_INFO << Count <querySubObject(sPos.toStdString().c_str());QVariant param = row->asVariant();QVariant rdata = rows->dynamicCall("Add(Variant)", param);if (!rdata.toBool())return false;}}return true;
}
/*** @brief WordEnginePrivate::addTableRow* @param wordFileName* @param nRow 起始行* @param rowCount : 插入函数* @return*/
bool WordEnginePrivate::addTableRow( int nRow, int rowCount)
{QAxObject* document = m_pWorkDocument;QAxObject* pTable = document->querySubObject( "Tables" );QAxObject* onTable = pTable->querySubObject("Item(int)",/*tableIndex*/1);#if 0 // 方式一qDebug() << Q_FUNC_INFO << __LINE__ <isNull() || nRow <=0 || rowCount <=0)return false;QAxObject* rows = onTable->querySubObject("Rows");int Count = rows->dynamicCall("Count").toInt();qDebug() << Q_FUNC_INFO <<__LINE__<< Count <querySubObject(sPos.toStdString().c_str());QVariant param = row->asVariant();rows->dynamicCall("Add(Variant)", param);}}return true;
#else // 方式二QAxObject *cell =onTable->querySubObject("Cell(int, int)",nRow,1);cell->dynamicCall("Select(void)");QAxObject *selection = m_pWord->querySubObject("Selection");//selection->querySubObject("ParagraphFormat")->dynamicCall("Alignment", "wdAlignParagraphLeft");//Selection.InsertRowsBelow 1qDebug() << Q_FUNC_INFO << "rowCount: "<< rowCount;for (int i=0;idynamicCall("InsertRowsBelow(Variant)",1);}return true;#endif
}bool WordEnginePrivate::setTableContext(QAxObject *table,std::pairrowCloumn,const QVariant &value)
{int row = rowCloumn.first;int cloumn = rowCloumn.second;if (table->isNull() || row <=0 || cloumn <=0)return false;QAxObject *cell = table->querySubObject("Cell(int, int)",row,cloumn);QAxObject *cellRange = cell->querySubObject("Range");return cellRange->dynamicCall("Text", value).toBool();
}bool WordEnginePrivate::setTableContext(const QString& wordFileName,std::pairrowCloumn,const QVariant &value)
{Q_UNUSED(wordFileName);
#if 0int row = rowCloumn.first;int cloumn = rowCloumn.second;// 对象以及初始化if (wPrivate->bIsOpen()){qDebug() << Q_FUNC_INFO << ": " << wPrivate->pWorkDocument() ;QAxObject* pTable = wPrivate->pWorkDocument()->querySubObject( "Tables");qDebug() << Q_FUNC_INFO <isNull())return false;QAxObject* onTable = pTable->querySubObject("Item(int)",/*tableIndex*/1);qDebug() << Q_FUNC_INFO << onTable <setTableContext(onTable,row,cloumn,value);}//隐式的打开一个word应用程序
#if defined(Q_OS_WIN)HRESULT r = OleInitialize(0);if (r != S_OK && r != S_FALSE) {qWarning("Qt: Could not initialize OLE (error %x)", (unsigned int)r);}
#endifQAxWidget word("Word.Application");word.setProperty("Visible", false);//获取所有工作文档QAxObject * documents = word.querySubObject("Documents");//创建一个word文档documents->querySubObject("Open(QString)",wordFileName);;//获取当前激活的文档QAxObject * document = word.querySubObject("ActiveDocument");QAxObject* pTable = document->querySubObject( "Tables" );QAxObject* onTable = pTable->querySubObject("Item(int)",1);if (onTable->isNull() || row <=0 || cloumn <=0)return false;QAxObject *cell = onTable->querySubObject("Cell(int, int)",row,cloumn);QAxObject *cellRange = cell->querySubObject("Range");cellRange->dynamicCall("Text", value).toBool();//关闭退出document->dynamicCall("Close (boolean)", true);word.dynamicCall("Quit (void)");OleUninitialize();return true;
#elseif (!existTable())return false;QAxObject* pTable = m_pWorkDocument->querySubObject( "Tables" );QAxObject* onTable = pTable->querySubObject("Item(int)",1);return setTableContext(onTable,rowCloumn,value);
#endif
}bool WordEnginePrivate::deleteRow(int nRow)
{//Selection.Rows.Delete#if 0QAxObject* document = m_pWorkDocument;QAxObject* pTable = document->querySubObject( "Tables" );QAxObject* onTable = pTable->querySubObject("Item(int)",/*tableIndex*/1);QAxObject *cell =onTable->querySubObject("Cell(int, int)",nRow,1);cell->dynamicCall("Select(void)");QAxObject *selection = m_pWord->querySubObject("Selection");//Selection.InsertRowsBelow 1QAxObject *rows=selection->querySubObject("Rows(void)");return rows->dynamicCall("Delete(void)").toBool();//return true;
#else// 添加修改的时候 表格全部内容判断 单元格为空时,删除选中行QAxObject* document = m_pWorkDocument;QAxObject* pTable = document->querySubObject( "Tables" );QAxObject* onTable = pTable->querySubObject("Item(int)",/*tableIndex*/1);int size = this->getRowCount();for (int i=0;iquerySubObject("Cell(int, int)",nRow,1);QString text = cell->querySubObject("Range")->property("Text").toString();if (text.isEmpty() || text == "\r\u0007") {cell->dynamicCall("Select(void)");QAxObject *selection = m_pWord->querySubObject("Selection");//Selection.InsertRowsBelow 1QAxObject *rows=selection->querySubObject("Rows(void)");rows->dynamicCall("Delete(void)").toBool();}}#endifreturn true;
}int WordEnginePrivate::getRowCount()
{if (!existTable())return false;QAxObject* pTable = m_pWorkDocument->querySubObject( "Tables" );QAxObject* onTable = pTable->querySubObject("Item(int)",1);QAxObject* Columns = onTable->querySubObject("Rows");return Columns->dynamicCall("Count").toInt();
}
int WordEnginePrivate::getCloumnCount()
{if (!existTable())return false;QAxObject* pTable = m_pWorkDocument->querySubObject( "Tables" );QAxObject* onTable = pTable->querySubObject("Item(int)",1);QAxObject* rows = onTable->querySubObject("Columns");return rows->dynamicCall("Count").toInt();
}bool WordEnginePrivate::isNull(QAxObject *p)
{return !(p->isNull());
}bool WordEnginePrivate::existTable()
{if(!isNull(m_pWorkDocument))return false;QAxObject* pTable = m_pWorkDocument->querySubObject( "Tables" );if(!isNull(pTable))return false;QAxObject* onTable = pTable->querySubObject("Item(int)",/*tableIndex*/1);if(onTable->isNull())return false;return true;
}
7、源码下载链接:https://download.csdn.net/download/m1223853767/13985742
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
