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();
}

 

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt生成Word文档,你可以使用QtQTextDocument类和QTextCursor类来完成。下面是一个简单的示例代码,演示如何创建一个带有文本和表格的Word文档: ```cpp #include <QApplication> #include <QTextDocument> #include <QTextCursor> #include <QTextTable> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建一个QTextDocument对象 QTextDocument document; // 创建一个QTextCursor对象,并将其绑定到文档上 QTextCursor cursor(&document); // 在文档中插入文本 cursor.insertText("这是一个示例文档\n\n"); // 在文档中插入表格 QTextTableFormat tableFormat; tableFormat.setBorder(1); tableFormat.setCellPadding(10); tableFormat.setAlignment(Qt::AlignHCenter); QTextTable *table = cursor.insertTable(3, 2, tableFormat); table->cellAt(0, 0).firstCursorPosition().insertText("表头1"); table->cellAt(0, 1).firstCursorPosition().insertText("表头2"); table->cellAt(1, 0).firstCursorPosition().insertText("内容1"); table->cellAt(1, 1).firstCursorPosition().insertText("内容2"); table->cellAt(2, 0).firstCursorPosition().insertText("内容3"); table->cellAt(2, 1).firstCursorPosition().insertText("内容4"); // 保存文档为Word格式 QString fileName = "example.docx"; QFile file(fileName); if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextDocumentWriter writer(&file, "plaintext"); writer.setFormat("odf"); writer.write(&document); } file.close(); return 0; } ``` 这段代码会创建一个带有文本和表格的Word文档,并将其保存为"example.docx"文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值