参考https://blog.csdn.net/qq_35192280/article/details/83021975
1、首先在Pro文件下增加下面语句
QT += widgets gui axcontainer
2、接着创建一个".h"跟cpp文件
在“.h”文件中继承自QObject
#ifndef WORDENGINE_H
#define WORDENGINE_H
#include <QObject>
#include <ActiveQt/QAxObject>
#include <ActiveQt/QAxWidget>
class WordEngine : public QObject
{
Q_OBJECT
public:
explicit WordEngine(QObject *parent = nullptr);
bool open(bool bVisable = false);
bool open(const QString& strFile, bool bVisable = false, bool onlyRead=false);
bool open(bool bVisable, bool onlyRead);
bool close();
bool isOpen();
void save();
bool saveAs(const QString& strSaveFile);
// 设置标签内容
bool setMarks(const QString& strMark, const QString& strContent);
// 批量设置标签
bool setAllMarks(QMap<QString,QString> map);
//插入图片
void insertPic(QString sLabel, const QString& picPath);
private:
bool m_bOpened;
QString m_strFilePath;
QAxObject *m_wordDocuments;
QAxObject *m_wordWidget;
signals:
public slots:
void slot_thread();
};
#endif // WORDENGINE_H
3、在cpp中将h文件中的类书写,我住要写了用map个批量插入,其余方法是参考的文章的
#include "wordengine.h"
#include "qt_windows.h"
#include <QDebug>
WordEngine::WordEngine(QObject *parent) : QObject(parent)
{
}
/******************************************************************************
* 函数:open
* 功能:打开文件
* 参数:bVisable 是否显示弹窗
* 返回值: bool
*****************************************************************************/
bool WordEngine::open(bool bVisable)
{
//新建一个word应用程序,并设置为可见
m_wordWidget = new QAxObject();
bool bFlag = m_wordWidget->setControl("word.Application");
if (!bFlag)
{
// 用wps打开
bFlag = m_wordWidget->setControl("kwps.Application");
if (!bFlag)
{
return false;
}
}
m_wordWidget->setProperty("Visible", bVisable);
//获取所有的工作文档
QAxObject *document = m_wordWidget->querySubObject("Documents");
if (!document)
{
return false;
}
//以文件template.dot为模版新建一个文档
document->dynamicCall("Add(QString)", m_strFilePath);
//获取当前激活的文档
m_wordDocuments = m_wordWidget->querySubObject("ActiveDocument");
m_bOpened = true;
return m_bOpened;
}
bool WordEngine::open(bool bVisable,bool onlyRead)
{
try {
//新建一个word应用程序,并设置为可见
m_wordWidget = new QAxObject();
bool bFlag = m_wordWidget->setControl("word.Application");
if (!bFlag)
{
// 用wps打开
bFlag = m_wordWidget->setControl("kwps.Application");
if (!bFlag)
{
return false;
}
}
m_wordWidget->setProperty("Visible", bVisable);
//获取所有的工作文档
QAxObject *document = m_wordWidget->querySubObject("Documents");
if (!document)
{
return false;
}
//以文件template.dot为模版新建一个文档
document->dynamicCall("Open(const QString&)", m_strFilePath);
//获取当前激活的文档
m_wordDocuments = m_wordWidget->querySubObject("ActiveDocument");
m_bOpened = true;
return m_bOpened;
} catch (std::exception& e) {
qDebug()<<e.what();
return false;
}
}
/******************************************************************************
* 函数:open
* 功能:打开文件
* 参数:strFilePath 文件路径;bVisable 是否显示弹窗
* 返回值:bool
*****************************************************************************/
bool WordEngine::open(const QString& strFilePath, bool bVisable,bool onlyRead)
{
try {
m_strFilePath = strFilePath;
//close();//这里关闭的话有时候直接就异常了,可以在操作完成之后再关闭
if (onlyRead)
return open(bVisable, onlyRead);
else
return open(bVisable);
} catch (std::exception& e) {
qDebug()<<e.what();
return false;
}
}
/******************************************************************************
* 函数:close
* 功能:关闭文件
* 参数:无
* 返回值:bool
*****************************************************************************/
bool WordEngine::close()
{
// qDebug()<<m_bOpened;
if (m_bOpened)
{
if (m_wordDocuments)
m_wordDocuments->dynamicCall("Close (bool)", true);//关闭文本窗口
if (m_wordWidget)
m_wordWidget->dynamicCall("Quit()");//退出word
if (m_wordDocuments)
{
m_wordDocuments = NULL;
delete m_wordDocuments;//在这里出现异常
}
if (m_wordWidget)
{
m_wordWidget = NULL;
delete m_wordWidget;
}
m_bOpened = false;
}
return m_bOpened;
}
/******************************************************************************
* 函数:isOpen
* 功能:获得当前的打开状态
* 参数:无
* 返回值:bool
*****************************************************************************/
bool WordEngine::isOpen()
{
return m_bOpened;
}
/******************************************************************************
* 函数:save
* 功能:保存文件
* 参数:无
* 返回值:void
*****************************************************************************/
void WordEngine::save()
{
m_wordDocuments->dynamicCall("Save()");
}
/******************************************************************************
* 函数:saveAs
* 功能:另存文件
* 参数:strSaveFile 文件路径
* 返回值:void
*****************************************************************************/
bool WordEngine::saveAs(const QString& strSaveFile)
{
return m_wordDocuments->dynamicCall("SaveAs (const QString&)",
strSaveFile).toBool();
}
/******************************************************************************
* 函数:setMarks
* 功能:设置标签内容
* 参数:strMark 标签名;strContent 文本
* 返回值:bool
*****************************************************************************/
bool WordEngine::setMarks(const QString& strMark, const QString& strContent)
{
// QAxObject* select=m_wordWidget->querySubObject("Selection");
// if(!select){
// return false;
// }
// select->dynamicCall("TypeText(const QString&)", "text");
QAxObject* bookmarkCode = NULL;
bookmarkCode = m_wordDocuments->querySubObject("Bookmarks(QVariant)", strMark);
//选中标签,将字符textg插入到标签位置
if (bookmarkCode)
{
bookmarkCode->dynamicCall("Select(void)");
bookmarkCode->querySubObject("Range")->setProperty("Text", strContent);
return true;
}
return false;
}
/******************************************************************************
* setAllMarks
* 功能:批量插入数据
* 参数:map 插入的数据
* 返回值: bool
*****************************************************************************/
bool WordEngine::setAllMarks(QMap<QString, QString> map)
{
//QAxObject* bookmarkCode = NULL;
foreach(QString key ,map.keys()){
if(key.contains("img_")){
insertPic(key,map[key]);
}else{
setMarks(key,map[key]);
}
}
saveAs("D:\\123.doc");
//close();
return true;
}
/******************************************************************************
* 函数:insertPic
* 功能:插入图片
* 参数:sLable 标签名;picPath 图片路径
* 返回值:void
*****************************************************************************/
void WordEngine::insertPic(QString sLabel, const QString& picPath)
{
try {
QAxObject *bookmark = m_wordDocuments->querySubObject("Bookmarks(QVariant)", sLabel);
// 选中标签,将图片插入到标签位置
if (bookmark) {
bookmark->dynamicCall("Select(void)");
QAxObject *selection = m_wordWidget->querySubObject("Selection");
selection->querySubObject("ParagraphFormat")->dynamicCall("Alignment", "wdAlignParagraphCenter");
QAxObject *range = bookmark->querySubObject("Range");
QVariant tmp = range->asVariant();
QList<QVariant>qList;
qList << QVariant(picPath);
qList << QVariant(false);
qList << QVariant(true);
qList << tmp;
QAxObject *Inlineshapes = m_wordDocuments->querySubObject("InlineShapes");
Inlineshapes->dynamicCall("AddPicture(const QString&, QVariant, QVariant ,QVariant)", qList);
}
} catch (std::exception& e) {
qDebug()<<e.what();
}
}
void WordEngine::slot_thread()
{
QMap<QString,QString> map;
map["xm"]="姓名";
map["csrq"]="19970203";
map["img_zp"]="D:\\beforeback.jpg";
bool isopen = open("D:\\QT\\work\\ErrotTexts\\机动车驾驶证申请表.doc",true,false);
if(isopen){
bool marks= setAllMarks(map);
//word.insertPic("img_zp",map["img_zp"]);
}
}
4、因为我在word中是建立的表格模板往里面插入数据,标签名实际就是插入的书签名。map批量插入时候图片我是带"img_"
5、因为我想开线程进行,所以我在另一个类里面有建立了一个槽,在槽中开了线程,接着绑定给qml中的click,但是好像开了效果不大理想还是卡了不知道为啥,线程还是不大会用
QThread th;
WordEngine word;
word.moveToThread(&th);
connect(&th,SIGNAL(started()),&word,SLOT(slot_thread()));
th.start();
th.quit();
th.wait();
auto root = engine.rootObjects();
auto pushbutton=root.first()->findChild<QObject*>("smoreButton");
QObject::connect(pushbutton,SIGNAL(clicked()),&person1,SLOT(soltInfo()));