QT进行Word文档读写

  • Post author:
  • Post category:其他


界面如下:

在这里插入图片描述

.pro文件中要加入以下代码


CONFIG += qaxcontainer

.h文件如下

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

#include <QAxWidget>
#include <QAxObject>

#define FilePath "C:/temp/" //存放路径

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
	//读取按钮点击槽函数
    void on_btn_read_clicked();

	//写入按钮点击槽函数
    void on_btn_write_clicked();

	//退出按钮点击槽函数
    void on_btn_exit_clicked();

private:
    Ui::Widget *ui;

    QAxObject *myword;      //Word应用程序指针
    QAxObject *mydocs;      //文档集指针
    QAxObject *mydoc;       //文档指针
    QAxObject *selection;   //Selection指针
};

#endif // WIDGET_H

.cpp文件

#include "widget.h"
#include "ui_widget.h"

#include <QMessageBox>


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

//读取按钮点击槽函数
void Widget::on_btn_read_clicked()
{
   myword = new QAxObject("Word.Application");
   mydocs = myword->querySubObject("Documents");

   if (mydocs == nullptr)
   {
	   QMessageBox::information(this, QString("标题"), QString("获取所有工作文档失败"));
	   return;
   }

   QString fileName="test.docx";
   QString path=QString(FilePath)+fileName;

   //打开一个Word文档,这里调用的是Documents对象的open方法
   mydocs->dynamicCall("Open(const QVariant&)",QVariant(path));

   //获取当前word文档对象
   mydoc = myword->querySubObject("ActiveDocument");

   if (mydoc == nullptr)
   {
	   QMessageBox::information(this, QString( "标题"), QString("获取当前文档失败"));
	   return;
   }

   //这里是把word文档的内容全部选中。
   //通过不带参数的range方法选中整个文档内容
   selection = mydoc->querySubObject("Range()");

   //然后获取选中的word文档内容
   QString str = selection->property("Text").toString();

   //显示到文本框
   ui->textEdit->setText(str);

   //关闭文档
   mydoc->dynamicCall("Close()");
   delete mydoc;
   mydoc = NULL;

   //退出程序
   myword->dynamicCall("Quit()");

   delete myword;
   myword = NULL;
}

//写入按钮点击槽函数
void Widget::on_btn_write_clicked()
{
	//获取文本框内容
    QString str=ui->textEdit->toPlainText();

    QString fileName="test.docx";
    QString path=QString(FilePath)+fileName;

    //隐式的打开一个word应用程序
    myword = new QAxObject("Word.Application");
    myword->setProperty("Visible", false);

    //获取所有工作文档
    mydocs = myword->querySubObject("Documents");
	if (mydocs == nullptr)
	{
		QMessageBox::information(this, QString("标题"), QString("获取所有工作文档失败"));
		return;
	}

    //创建一个word文档
    mydocs->dynamicCall("Add (void)");
    //获取当前激活的文档
    mydoc = myword->querySubObject("ActiveDocument");
	if (mydoc == nullptr)
	{
		QMessageBox::information(this, QString("标题"), QString("获取当前激活文档失败"));
		return;
	};

    //写入文件内容
    selection = myword->querySubObject("Selection");
    selection->dynamicCall("TypeText(const QString&)",str);

    //设置保存
    QVariant newFileName(path); //存放位置和名称
    QVariant fileFormat(16); //文件格式  1——doc;16——docx
    QVariant LockComments(false);//如果为True,则锁定文档以获取注释。默认值为False。
    QVariant Password("");     //设置打开密码
    QVariant recent(true);//如果为True,则将文档添加到“文件”菜单上最近使用的文件列表中。默认值为True。
    QVariant writePassword("");//用于保存文档更改的密码字符串
    QVariant ReadOnlyRecommended(false);//如果为True,则无论何时打开文档,Word都将处于只读状态。默认值为False。

    mydoc->querySubObject("SaveAs(const QVariant&, const QVariant&,const QVariant&, const QVariant&, const QVariant&, const QVariant&,const QVariant&)",newFileName, fileFormat, LockComments, Password, recent, writePassword, ReadOnlyRecommended);

     //关闭文档
     mydoc->dynamicCall("Close(boolean)", true);
	 delete mydoc;
	 mydoc = NULL;

     //退出程序
     myword->dynamicCall("Quit(void)");
	 delete myword;
	 myword = NULL;
}

//退出按钮点击槽函数
void Widget::on_btn_exit_clicked()
{
    close();
}

更多word文件格式参照以下网址


https://docs.microsoft.com/en-us/office/vba/api/word.wdsaveformat


saveas方法介绍参照以下网址


https://docs.microsoft.com/en-us/office/vba/api/word.saveas2



版权声明:本文为WMT1520原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。