Qt Word 文件生成,根据带有定位书签的 Word 模板文件,通过对书签值进行可视化编辑,自动生成需要的 Word 文件。自动保存书签,方便多次使用,可用于固定格式报告生成。

Word Visual Basic for Applications (VBA) 参考 | Microsoft Docs
https://docs.microsoft.com/zh-cn/office/vba/api/overview/word

Qt 框架下的WORD 文档生成方法 - 道客巴巴
http://www.doc88.com/p-5075274889485.html

Qt 使用QAxObject操作Word - 繁华落尽的博客 - CSDN博客
https://blog.csdn.net/u010304326/article/details/82292195

Qt5生成Word格式报告 - milletluo的博客 - CSDN博客
https://blog.csdn.net/lm409/article/details/77965130

template.docx

生成.docx

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QAxWidget>
#include <QAxObject>
#include <QFileDialog>
#include <QMessageBox>
#include <QTableWidgetItem>
#include <QFile>
#include <QTextStream>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);QFont font;font.setPixelSize(16);setFont(font);setWindowTitle(QStringLiteral("Word文件生成"));QStringList headersLst;headersLst << QStringLiteral("书签名") << QStringLiteral("值");ui->tableWidget->setColumnCount(headersLst.size());ui->tableWidget->setHorizontalHeaderLabels(headersLst);ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);ui->tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents);ui->tableWidget->setEditTriggers(QAbstractItemView::DoubleClicked);ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);ui->label_desc->setText(QStringLiteral("使用说明:\n1) 本机需安装Microsoft Office Word,版本不限\n2) Word模板文件需带有定位书签,文件格式可为\ndocx、doc、dotx、dot\n3) 可对书签设置文字或图片,图片需是完整路径\n4) 双击右侧表格单元可进行编辑"));readSavedBookmarks();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{QString wordFile = QFileDialog::getOpenFileName(this, QStringLiteral("选择Word模板文件"), QDir::currentPath(), QStringLiteral("Word 文档 (*.docx);;Word 97 - 2003 文档 (*.doc);;Word 模板 (*.dotx);;Word 97 - 2003 模板 (*.dot)"));if (wordFile.isEmpty()){return;}ui->lineEdit->setText(QDir::toNativeSeparators(wordFile));
}void MainWindow::on_pushButton_2_clicked()
{ui->pushButton_2->setEnabled(false);QString wordFile = ui->lineEdit->text();if (wordFile.isEmpty()){informationMessageBox(QStringLiteral("提示"), QStringLiteral("Word模板文件为空"));ui->pushButton_2->setEnabled(true);return;}QString fileName = ui->lineEdit_2->text();if (fileName.isEmpty()){informationMessageBox(QStringLiteral("提示"), QStringLiteral("生成文件名为空"));ui->pushButton_2->setEnabled(true);return;}int cols = ui->tableWidget->columnCount();int rows = ui->tableWidget->rowCount();if (rows == 0){ui->pushButton_2->setEnabled(true);return;}QStringList bookmarkLst;for (int row = 0; row < rows; ++row){QString bookmark;for (int col = 0; col < cols; ++col){QTableWidgetItem *item = ui->tableWidget->item(row, col);bookmark.append(item->text());if (col != cols - 1){bookmark.append(",");}}bookmarkLst.append(bookmark);}QStringList emptyLst;foreach (QString bookmark, bookmarkLst){QStringList lst = bookmark.split(",");if (!lst[0].isEmpty() && lst[1].isEmpty()){emptyLst.append(lst[0]);}}if (!emptyLst.isEmpty()){informationMessageBox(QStringLiteral("提示"), QStringLiteral("以下书签的值为空:\n%1").arg(emptyLst.join("\n")));ui->pushButton_2->setEnabled(true);return;}QAxWidget *word = new QAxWidget("Word.Application", 0, Qt::MSWindowsOwnDC);word->setProperty("Visible", false);if (word->isNull()){informationMessageBox(QStringLiteral("提示"), QStringLiteral("未安装Word"));ui->pushButton_2->setEnabled(true);return;}QAxObject *documents = word->querySubObject("Documents");documents->dynamicCall("Add(QString)", wordFile);QAxObject *document = word->querySubObject("ActiveDocument");foreach (QString bookmark, bookmarkLst){QStringList lst = bookmark.split(",");if (!lst[0].isEmpty()){QAxObject *bookmarkObj = document->querySubObject("Bookmarks(QString)", lst[0]);if (bookmarkObj){bookmarkObj->dynamicCall("Select(void)");QString str = lst[1].toUpper();if (str.endsWith("JPG") || str.endsWith("JPEG") || str.endsWith("JPE") || str.endsWith("PNG") || str.endsWith("GIF")){QAxObject *range = bookmarkObj->querySubObject("Range");QAxObject *inlineShapes = range->querySubObject("InlineShapes");inlineShapes->dynamicCall("AddPicture(const QString&)", lst[1]);}else{bookmarkObj->querySubObject("Range")->setProperty("Text", lst[1]);}}else{informationMessageBox(QStringLiteral("提示"), QStringLiteral("书签 \"%1\" 不存在").arg(lst[0]));}}}QString fileNameStr;if (wordFile.endsWith("docx")){fileNameStr = QStringLiteral("%1%2%3.docx").arg(QDir::currentPath()).arg(QDir::separator()).arg(fileName);}else if (wordFile.endsWith("doc")){fileNameStr = QStringLiteral("%1%2%3.doc").arg(QDir::currentPath()).arg(QDir::separator()).arg(fileName);}else if (wordFile.endsWith("dotx")){fileNameStr = QStringLiteral("%1%2%3.dotx").arg(QDir::currentPath()).arg(QDir::separator()).arg(fileName);}else if (wordFile.endsWith("dot")){fileNameStr = QStringLiteral("%1%2%3.dot").arg(QDir::currentPath()).arg(QDir::separator()).arg(fileName);}document->dynamicCall("SaveAs(const QString&)", fileNameStr);document->dynamicCall("Close()");word->dynamicCall("Quit()");informationMessageBox(QStringLiteral("提示"), QStringLiteral("文件已生成,位于当前程序所在目录:\n%1").arg(QDir::toNativeSeparators(fileNameStr)));ui->pushButton_2->setEnabled(true);
}void MainWindow::on_pushButton_delete_clicked()
{QTableWidgetItem *item = ui->tableWidget->currentItem();if (item != nullptr){ui->tableWidget->removeRow(item->row());}
}void MainWindow::on_pushButton_add_clicked()
{int cols = ui->tableWidget->columnCount();int rows = ui->tableWidget->rowCount();ui->tableWidget->insertRow(rows);for (int i = 0; i < cols; ++i){ui->tableWidget->setItem(rows, i, new QTableWidgetItem(""));}ui->tableWidget->selectRow(rows);
}void MainWindow::informationMessageBox(const QString &title, const QString &text)
{QMessageBox msgBox(this);msgBox.setFont(this->font());msgBox.setIcon(QMessageBox::Information);msgBox.setWindowTitle(title);msgBox.setText(text);msgBox.setStandardButtons(QMessageBox::Ok);msgBox.setButtonText(QMessageBox::Ok, QStringLiteral("确定"));msgBox.exec();
}void MainWindow::closeEvent(QCloseEvent *event)
{Q_UNUSED(event);QFile file("saved_bookmarks.txt");file.open(QIODevice::WriteOnly | QIODevice::Text);QTextStream out(&file);out.setCodec("utf-8");int rows = ui->tableWidget->rowCount();for (int row = 0; row < rows; ++row){QString str = ui->tableWidget->item(row, 0)->text();if (!str.isEmpty()){out << str << endl;}}file.close();
}void MainWindow::readSavedBookmarks()
{QFile file("saved_bookmarks.txt");if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){return;}QTextStream in(&file);in.setCodec("utf-8");while (!in.atEnd()){QString str = in.readLine();if (!str.isEmpty()){int rows = ui->tableWidget->rowCount();ui->tableWidget->insertRow(rows);ui->tableWidget->setItem(rows, 0, new QTableWidgetItem(str));ui->tableWidget->setItem(rows, 1, new QTableWidgetItem(""));}}file.close();
}

Qt Word 文件生成相关推荐

  1. Java多word文件生成后进行压缩并导出下载后,压缩文件损坏并提示“不可预料的压缩文件末端”和“CRC校验失败”

    Java多word文件生成后进行压缩并导出下载后,压缩文件损坏并提示"不可预料的压缩文件末端"和"CRC校验失败" WinRAR 打开情况: 提示不可预料的压缩 ...

  2. qt 大文件生成md5校验码

    共有类型 枚举QCryptographicHash::Algorithm: QCryptographicHash::Md4 0 生成一个MD4散列 QCryptographicHash::Md5 1 ...

  3. 模板引擎:ftl文件生成word

    wshanshi:总结记录-便于回顾- 一.什么是FreeMarker FreeMarker 是一个用 Java 语言编写的模板引擎,基于模板来生成文本输出. FreeMarker的原理:模板+数据模 ...

  4. Java根据word 模板,生成自定义内容的word 文件

    处理思路: 将word模板以xml格式另存一份,得到xml格式模板 在xml 文件中,使用freemark标签,替换一些自定义值 使用freemark 解析xml ,输出到.doc 文件 在处理的时候 ...

  5. Excel信息批量替换Word模板生成新文件

    Python批量处理Excel文件信息替换Word模板 原由和思路 工具准备 1. 前期处理 1.1 数据处理 1.2 模板处理 2. 编写代码 2.1 使用Pycharm新建项目ExcelToWor ...

  6. Qt之预览WPS的word文件

    本来的需求是在qt的UI界面中预览word文件,但找了半天也没有好的方法,操作和生成word文档的方法还挺多,但想要预览word文件,实在找不到.现在成功预览了WPS下的word文件,虽然我的项目用不 ...

  7. Qt使用html生成word文档

    Qt使用html生成word文档 零.前言 一.效果图 二.核心代码 零.前言 项目中要用到把一些图片和一些报告保存为word文件,今天研究了一下,主要是使用html方法保存为word文档,这对htm ...

  8. JSP生成word文件

    1.jsp生成word文件,直接改动jsp格式: <%@ page contentType="application/vnd.ms-word;charset=GB2312"% ...

  9. java批量导出word_java 批量生成word 文件

    最近在工作中遇到一个需求,我有一个拥有3000行数据的excel文件和一个word模板. 我需要将excel文件中的每一行数据填充到word模板文件中生成一个Word文件. 考虑到数据量较大且需求有可 ...

最新文章

  1. 【Java 虚拟机原理】Class 字节码二进制文件分析 七 ( 局部变量表分析 )
  2. GPIO几种配置的作用
  3. Python中的一些特殊函数
  4. python 模板注入_SSTI模板注入
  5. Kibana 6.2.3修改本地时区
  6. 使用Flash,HTML5和Unity开发网页游戏的对比
  7. angular框架的SmartAdmin模板 如何请求后台数据
  8. 人脸识别python face_recognize_python人脸识别库-face_recognition详解
  9. 日历问题 —— C++
  10. 计算机网卡接口,5.8.1 计算机网卡(1)
  11. python链家二手房_python采集链家二手房信息
  12. 2020大疆秋招笔试题B卷
  13. java 根据经纬度获取区域面积
  14. python 对图片进行颜色转换
  15. “海大与我“ Scrum Meeting(第十周会议记录)
  16. 互联网思维笔记(一)
  17. ORA-04091: table xxxx is mutating, trigger/function may not see it
  18. java对称加密与非对称加密
  19. 记录小知识:Arouter 组件间通讯实体类数据
  20. 数值分析--matlab秦九韶算法

热门文章

  1. 【C语言入门】将十元钱兑换成一元,五角,一角的硬币,共计40枚,计算有多少中兑换方法
  2. 贾求真、李思成、程伟做客《筱静观察》,区块链技术是否会颠覆性改变医疗行业?
  3. HDMI传输设备上的ARC和EARC代表哪些功能?
  4. apk 反编译工具和方法
  5. Camtasia喀秋莎2022经典版能编辑4K视频
  6. XUL是否将成为AJAX之后最热门的网络技术?
  7. NVisual数据中心运维管理之线路可视化管理
  8. js 根据出生年月计算年龄 精确到天
  9. SpringBoot与Restful风格
  10. windows远程linux方法