打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Qt编程进阶(29):向Word文档输出表格

1.程序界面

创建Qt桌面应用程序项目,项目名称为“WordWriteTable”。设计程序界面,向Word输出表格及显示程序界面如下图所示。

2.全局变量及方法

“mainwindow.h”头文件的代码如下:

#include <QMainWindow>
#include <QMessageBox>
#include <QAxObject>
#include <QAxWidget>
  
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

typedef struct record
{
  QString year; //年份
  QString total; //高考人数
  QString admit; //录取人数
  QString rate; //录取率
} Record;

class MainWindow : public QMainWindow
{
	Q_OBJECT
public:
  MainWindow(QWidget *parent = nullptr);
  ~MainWindow();
private slots:
  void on_btnWrite_clicked(); // “写入”按钮单击事件槽
  void view_Word(QString& filename); //在Qt界面预览Word表格
private:
  Ui::MainWindow *ui;
  QAxObject *myword; //Word应用程序指针
  QAxObject *mydocs; //文档集指针
  QAxObject *document; //文档指针
  QAxObject *mytable; //Word中表格指针
  QList<Record> myrecord; //表格记录列表
  QAxWidget *mywidget; //Qt界面上的Word可视化部件
};

3. 数据准备

在构造函数中读取已有文件的数据,为输出做准备:

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow)
{
  ui->setupUi(this);
  myword = new QAxObject("Word.Application"); //创建 Word 应用程序对象
  mydocs = myword->querySubObject("Documents"); //获取文档集
  mydocs->dynamicCall("Open(const QString&)", "D:\\Temp\\1977-2019历年全国高考人数和录取率统计.docx"); //打开源文档
  document = myword->querySubObject("ActiveDocument");
  mytable = document->querySubObject("Tables(int)", 1);
  int rows = mytable->querySubObject("Rows")->dynamicCall("Count").toInt();
  //获取表格总行数
  for(int i = rows-4; i < rows + 1; i++)
  {
    Record oneRec; //表格记录结构
    QAxObject *infocol = mytable->querySubObject("Cell(int,int)", i, 1);
    QString year = infocol->querySubObject("Range")->property("Text").toString();
    oneRec.year = year; //获取年份
    infocol = mytable->querySubObject("Cell(int,int)", i, 2);
    QString total = infocol->querySubObject("Range")->property("Text").toString();
    oneRec.total = total; //获取高考人数
    infocol = mytable->querySubObject("Cell(int,int)", i, 3);
    QString admit = infocol->querySubObject("Range")->property("Text").toString();
    oneRec.admit = admit; //获取录取人数
    infocol = mytable->querySubObject("Cell(int,int)", i, 4);
    QString rate = infocol->querySubObject("Range")->property("Text").toString();
    oneRec.rate = rate; //获取录取率
    myrecord.append(oneRec); //添加进记录列表
  }
  delete mytable;
  mytable = nullptr;
  document->dynamicCall("Close()");
  myword->dynamicCall("Quit()");
}

4. 填写表格

将数据写入到Word表格中,并在界面上预览:

void MainWindow::on_btnWrite_clicked()
{
  myword = new QAxObject("Word.Application"); //创建 Word 应用程序对象
  mydocs = myword->querySubObject("Documents"); //获取文档集
  mydocs->dynamicCall("Add(void)"); //新建一个文档
  document = myword->querySubObject("ActiveDocument");
  QAxObject *tables = document->querySubObject("Tables"); //表格集指针
  QAxObject *paragraph = myword->querySubObject("Selection"); //文本段指针
  paragraph->dynamicCall("TypeText(const QString&)","2015-2019年高考人数和录取率"); //先输出表格标题
  QAxObject *range = paragraph->querySubObject("Range");
  QVariantList paras;
  paras.append(range->asVariant());
  paras.append(6); //创建表格为 6 行
  paras.append(4); //创建表格为 4 列
  tables->querySubObject("Add(QAxObject*, int, int, QVariant&, QVariant&)",paras);
  mytable = paragraph->querySubObject("Tables(int)", 1);
  mytable->setProperty("Style","网格型"); //设置表格为带网格边框
  QAxObject *Borders = mytable->querySubObject("Borders");
  Borders->setProperty("InsideLineStyle", 1);
  Borders->setProperty("OutsideLineStyle", 1);
  QAxObject *cell; //单元格对象指针
  /**循环控制输出表格内容*/
  for(int i = 0; i < 6; i++){
    if (i == 0){
      for(int j=0; j<4; j++)
      {
        cell= mytable->querySubObject("Cell(int,int)",(i+1),(j+1))->querySubObject("Range");
        switch (j){
          case 0: cell->setProperty("Text","年份"); break;
          case 1: cell->setProperty("Text","高考人数(万)"); break;
          case 2: cell->setProperty("Text","录取人数(万)"); break;
          case 3: cell->setProperty("Text","录取率"); break;
          default: break;
      	}
    	}
    }else{
      for(int j = 0; j < 4; j++){
        cell = mytable->querySubObject("Cell(int,int)",(i+1),(j+1))->querySubObject("Range");
        switch (j) {
          case 0: cell->setProperty("Text", myrecord[i-1].year); break;
          case 1: cell->setProperty("Text", myrecord[i-1].total); break;
          case 2: cell->setProperty("Text", myrecord[i-1].admit); break;
          case 3: cell->setProperty("Text", myrecord[i-1].rate); break;
          default: break;
        }
      }
    }
  }
  document->dynamicCall("SaveAs(const QString&)", "D:\\Temp\\2015-2019年全国高考录取人数统计.doc"); //保存表格
  QMessageBox::information(this, tr("完毕"),tr("表格已输出至 Word 文档。"));
  delete mytable;
  mytable = nullptr;
  delete paragraph;
  paragraph = nullptr;
  document->dynamicCall("Close()");
  myword->dynamicCall("Quit()");
  QString fname = "D:\\Temp\\2015-2019年全国高考录取人数统计.doc";
  view_Word(fname); //在 Qt 界面上预览
}

void MainWindow::view_Word(QString& filename)
{
  mywidget = new QAxWidget("Word.Application", ui->labView);
  mywidget->dynamicCall("SetVisible(bool Visible)", "false");
  mywidget->setProperty("DisplayAlerts", false);
  mywidget->setGeometry(ui->labView->geometry().x(), ui->labView->geometry().y(),
  ui->labView->width(), ui->labView->height());
  mywidget->setControl(filename);
  mywidget->show();
}

5.运行效果

运行程序,单击“输入”按钮,弹出消息框提示自己输出至Word文档的表格,单击“确定”按钮,界面上会显示出Word文档中的表格,如下图所示。

程序运行后在“D:\Temp\”路径下生成Word文档“2015-2019年全国高考录取人数统计.doc”,打开后可以看到Qt在其中写入的表格,如下图所示。

以上系列文章系统地介绍了Qt对Excel和Word的操作,在工作中高效地可以灵活运用这些方法来操作Office,实地完成文档的制作。

—————————————————

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
如何使用Qt操作word,实现插入图片和表格的功能?
Qt 生成word、pdf文档 | 生成
Qt之操作Excel
利用VBA将Excel表格粘贴到Word中
使用VBA代码选中word文档的所有表格
QT知识点总结(强)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服