#include <QMessageBox>
#include <QAxObject>
#include <QDebug>
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(onbtnclick()));
connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(onbtn2click()));
}
MainWindow::~MainWindow()
{
delete ui;
}
bool MainWindow::replaceMultiple(const QString &templatePath, const QString &outputPath, const QMap<QString, QString> &placeholders)
{
QAxObject *wordApp;
wordApp = new QAxObject("Word.Application");
if (wordApp->isNull()) {
delete wordApp;
return false;
}
// 隐藏 Word 窗口
wordApp->setProperty("Visible", true);
// 打开模板文件
QAxObject *documents = wordApp->querySubObject("Documents");
QAxObject *document = documents->querySubObject("Open(const QString&)", templatePath);
// 查找占位符并替换
//使用 Find.Execute 查找占位符,使用 TypeText 方法替换为新内容
QAxObject *selection = wordApp->querySubObject("Selection");
// 获取 Find 对象
QAxObject *find = selection->querySubObject("Find");
// 遍历占位符键值对, 替换未成功,则有问题
for (auto it = placeholders.begin(); it != placeholders.end(); ++it) {
QString placeholder = it.key();
QString newContent = it.value();
bool isFound = true;
//可替换多个,且重复的
while (isFound) {
// 查找目标文本并替换
// isFound = find->dynamicCall("Execute(const QString&)", placeholder).toBool();
isFound = find->dynamicCall("Execute(QString, bool, bool, bool, bool, bool, bool, int)",
placeholder, // 要查找的字符串
true, // 区分大小写
true, // 完整单词
false, // 使用通配符
false, // 忽略标点符号
false, // 忽略空格
true, // 向前查找
1).toBool(); // 查找范围:整个文档
if (isFound) {
// 替换文本
selection->dynamicCall("TypeText(const QString&)", newContent);
}
}
}
document->dynamicCall("SaveAs(const QString&)", outputPath);
// 关闭文档
document->dynamicCall("Close()");
wordApp->dynamicCall("Quit()");
delete wordApp;
QMessageBox::information(this, tr(""), "OK");
return true;
}
void MainWindow::onbtnclick()
{
QMap<QString, QString> placeholders;
placeholders.insert("oldText", "newText");
placeholders.insert("aaa", "AAA");
replaceMultiple("d:\\1.docx", "d:\\2.docx", placeholders);
}
/*****标签处添加图片
******input:(QString)标签名字,(QString)图片地址
******output: (bool)
*/
bool MainWindow::replacePic(const QString &templatePath, const QString &outputPath, QString sFile)
{
QAxObject *wordApp;
wordApp = new QAxObject("Word.Application");
if (wordApp->isNull()) {
delete wordApp;
return false;
}
// 隐藏 Word 窗口
wordApp->setProperty("Visible", false);
// 打开模板文件
QAxObject *documents = wordApp->querySubObject("Documents");
QAxObject *document = documents->querySubObject("Open(const QString&)", templatePath);
QObject::connect(document, SIGNAL(exception(int, QString, QString, QString)),
this, SLOT(documentError(int, QString, QString, QString)));
QString sLabel = "bookmark1";
QAxObject *bookmark_pic = document->querySubObject("Bookmarks(QString)", sLabel);
if (bookmark_pic)
{
bookmark_pic->dynamicCall("Select(void)");
QAxObject *range = bookmark_pic->querySubObject("Range");
QVariant tmp = range->asVariant();
QList<QVariant> qList;
qList << QVariant(sFile);
qList << QVariant(false);
qList << QVariant(true);
qList << tmp;
QAxObject *Inlineshapes = document->querySubObject("InlineShapes");
QObject::connect(Inlineshapes, SIGNAL(exception(int, QString, QString, QString)),
this, SLOT(InlineshapesError(int, QString, QString, QString)));
Inlineshapes->dynamicCall("AddPicture(const QString&,QVariant,QVariant,QVariant)", qList);
delete Inlineshapes;
}
else
{
QMessageBox::critical(this, tr("QMessageBox::critical()"),
"没有找到书签!",
QMessageBox::Ok);
// 关闭文档
document->dynamicCall("Close()");
wordApp->dynamicCall("Quit()");
delete wordApp;
return false;
}
document->dynamicCall("SaveAs(const QString&)", outputPath);
// 关闭文档
document->dynamicCall("Close()");
wordApp->dynamicCall("Quit()");
delete wordApp;
QMessageBox::information(this, tr(""), "OK");
return true;
}
void MainWindow::onbtn2click()
{
replacePic("d:\\1.docx", "d:\\3.docx", "d:\\1.png");
}
void MainWindow::documentError(int arg1, QString arg2, QString arg3, QString arg4)
{
QMessageBox::critical(this, "document Error", QString::number(arg1) + arg2 + arg3 + arg4, QMessageBox::Ok);
}
void MainWindow::InlineshapesError(int arg1, QString arg2, QString arg3, QString arg4)
{
QMessageBox::critical(this, "InlineshapesError Error", QString::number(arg1) + arg2 + arg3 + arg4, QMessageBox::Ok);
}
xgbing
- 粉丝: 1288
- 资源: 57
最新资源
- 风光储VSG并网,储能为锂电池 0.6s引入预同步算法,实现稳定并网 工况多,波形好
- 同步磁阻电机SynRM无传感器高频注入HFI+mras驱动matlab离散模型,包含文献,用于学习研究
- 基于粒子群算法的光伏MPPT(可重启PSO) 光伏最大功率追踪算法模型simulink MPPT是基于粒子群算法实现的,同时具备动态追踪能力,当光照改变后会重启粒子群算法进行最大功率追踪
- Comsol等离子体仿真,Ar棒板流注放电 电子密度,电子温度,三维视图,电场强度等
- 储能参与调峰调频联合调度模型(matlab代码) 主要内容为考虑储能同时参与调峰以及调频的联合调度模型,现有文章往往仅关注储能在调峰方面的能力,而实际上同时参与调峰调频将超线性的提高储能的收益,在建模
- Matlab simulink仿真模型搭建(电池相关) 本店可接锂电池或电池包建模搭建 单体电池方面: 1、电池等效电路模型搭建(RC模型) 2、电池特征参数辨识(离线、在线、自适应) 3、电池SOC
- 三相并网逆变器双闭环控制,电网电流外环电容电流内环控制算法,matlab Simulink仿真模型,有源阻尼,单位功率因数,电网电压和电流同相位
- 脉振高频电压注入的永磁同步电机无速度传感器 PMSM
- 三相电压型PWM pwm整流器仿真,双闭环pi PI控制(电压外环电流内环),输出电压600V,单位1运行,变负载实验
- 基于下垂控制的三相全桥PWM逆变器并网仿真模型 基于Matlab Simulink仿真平台 主电路采用三相全桥PWM逆变器 1.仿真均能正常运行,能够准确跟踪对应参考值 2.直流母线电压设置为700V
- 基于扩展反电动势法的PMSM中高速无感控制仿真,对凸极和非凸极电机都适用,模型全部采用离散化的仿真方式,仿照数字控制器真实的特性,有PI+PLL和PI+Luenberger两个版本,龙伯格观测器角度估
- 两极式单相光伏并网仿真 前极:Boost电路+电导增量法 后极:桥式逆变+L型滤波+电压外环电流内环控制 并网电流和电网电压同频同相,单位功率因数并网,谐波失真率0.39%,并网效率高
- 国标GBT34658-2017直流快充27930一致性测试详细报告 对测试用例进行了详细测试,含有通过的BMS快充报文内容 注:同时增加了对测试用例分析和软件兼容性做法
- Comsol等离子体仿真,空气棒板电晕放电 电场强度等
- STM32三相电压型SVPWM整流器仿真,以电压外环和电流内环控制,双闭环PID控制,输出电压600V 三相电压型SVPWM整流器仿真,以电压外环和电流内环控制,双闭环PID控制,输出电压600V
- 电机maxwell Simplorer耦合模型,Maxwell 中建立BLDC电机本体有限元模型,Simplorer中搭建的SVPWM策略下Id=0双闭环控制外电路模型 可成功实现场路耦合联合仿真
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈