Qt Word 文件生成
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 文件生成相关推荐
- Java多word文件生成后进行压缩并导出下载后,压缩文件损坏并提示“不可预料的压缩文件末端”和“CRC校验失败”
Java多word文件生成后进行压缩并导出下载后,压缩文件损坏并提示"不可预料的压缩文件末端"和"CRC校验失败" WinRAR 打开情况: 提示不可预料的压缩 ...
- qt 大文件生成md5校验码
共有类型 枚举QCryptographicHash::Algorithm: QCryptographicHash::Md4 0 生成一个MD4散列 QCryptographicHash::Md5 1 ...
- 模板引擎:ftl文件生成word
wshanshi:总结记录-便于回顾- 一.什么是FreeMarker FreeMarker 是一个用 Java 语言编写的模板引擎,基于模板来生成文本输出. FreeMarker的原理:模板+数据模 ...
- Java根据word 模板,生成自定义内容的word 文件
处理思路: 将word模板以xml格式另存一份,得到xml格式模板 在xml 文件中,使用freemark标签,替换一些自定义值 使用freemark 解析xml ,输出到.doc 文件 在处理的时候 ...
- Excel信息批量替换Word模板生成新文件
Python批量处理Excel文件信息替换Word模板 原由和思路 工具准备 1. 前期处理 1.1 数据处理 1.2 模板处理 2. 编写代码 2.1 使用Pycharm新建项目ExcelToWor ...
- Qt之预览WPS的word文件
本来的需求是在qt的UI界面中预览word文件,但找了半天也没有好的方法,操作和生成word文档的方法还挺多,但想要预览word文件,实在找不到.现在成功预览了WPS下的word文件,虽然我的项目用不 ...
- Qt使用html生成word文档
Qt使用html生成word文档 零.前言 一.效果图 二.核心代码 零.前言 项目中要用到把一些图片和一些报告保存为word文件,今天研究了一下,主要是使用html方法保存为word文档,这对htm ...
- JSP生成word文件
1.jsp生成word文件,直接改动jsp格式: <%@ page contentType="application/vnd.ms-word;charset=GB2312"% ...
- java批量导出word_java 批量生成word 文件
最近在工作中遇到一个需求,我有一个拥有3000行数据的excel文件和一个word模板. 我需要将excel文件中的每一行数据填充到word模板文件中生成一个Word文件. 考虑到数据量较大且需求有可 ...
最新文章
- 【Java 虚拟机原理】Class 字节码二进制文件分析 七 ( 局部变量表分析 )
- GPIO几种配置的作用
- Python中的一些特殊函数
- python 模板注入_SSTI模板注入
- Kibana 6.2.3修改本地时区
- 使用Flash,HTML5和Unity开发网页游戏的对比
- angular框架的SmartAdmin模板 如何请求后台数据
- 人脸识别python face_recognize_python人脸识别库-face_recognition详解
- 日历问题 —— C++
- 计算机网卡接口,5.8.1 计算机网卡(1)
- python链家二手房_python采集链家二手房信息
- 2020大疆秋招笔试题B卷
- java 根据经纬度获取区域面积
- python 对图片进行颜色转换
- “海大与我“ Scrum Meeting(第十周会议记录)
- 互联网思维笔记(一)
- ORA-04091: table xxxx is mutating, trigger/function may not see it
- java对称加密与非对称加密
- 记录小知识:Arouter 组件间通讯实体类数据
- 数值分析--matlab秦九韶算法