• QT界面开发-QAxObject 读写excel(COM组件)


    QtCreator

    VS2013

    QAxObject在线帮助

    Qt Documentation

    使用中遇到的问题

    QT界面开发-在VS2017环境下Qt读写Excel遇到"无法打开 源 文件 'QAxObject'"的错误解决办法【转载】
    QT界面开发-QtCreator error: C1083: 无法打开包括文件:“QDomDocument”“QAxObject”【转载】

    QT界面开发-QAxObject 解析 excel 时报错error LNK2019: 无法解析的外部符号

    使用步骤,参考资料

    由于这部分资料网上百度一大堆,我就不自己去写详细步骤了。

    收集了几个写的比较好的博客文章。

    转载自https://blog.csdn.net/weixin_37204973/article/details/80059096

    初学Qt 时,发现Qt 并没有自带操作excel 的API, 所以很长时间内都是用的CSV 文件来储存数据报表。这段时间,因为需要,所以参考了一下网上资料,捣鼓了一番。

     1 //mainwindow.h
     2  
     3 #ifndef MAINWINDOW_H
     4 #define MAINWINDOW_H
     5  
     6 #include <QMainWindow>
     7 #include <QAxObject>
     8 #include <QAxWidget>
     9 #include <QDebug>
    10 #include <QList>
    11 #include <QVariant>
    12 #include <QDir>
    13  
    14 namespace Ui {
    15 class MainWindow;
    16 }
    17  
    18 class MainWindow : public QMainWindow
    19 {
    20     Q_OBJECT
    21  
    22 public:
    23     explicit MainWindow(QWidget *parent = 0);
    24     ~MainWindow();
    25  
    26 private slots:
    27     void on_Write_clicked();
    28  
    29     void on_Quit_clicked();
    30  
    31     void on_read_clicked();
    32  
    33 private:
    34     Ui::MainWindow *ui;
    35  
    36     QAxObject *excel;
    37     QAxObject *workbooks;
    38     QAxObject *workbook;
    39     QAxObject *worksheets;
    40     QAxObject *worksheet;
    41     QAxObject *range;
    42     QAxObject *cell;
    43     QList<QVariant> allRowData;
    44 };
    45  
    46 #endif // MAINWINDOW_H
      1 //mainwindow.cpp
      2  
      3 #include "mainwindow.h"
      4 #include "ui_mainwindow.h"
      5  
      6 QString path = "E:/test.xlsx";
      7  
      8 MainWindow::MainWindow(QWidget *parent) :
      9     QMainWindow(parent),
     10     ui(new Ui::MainWindow)
     11 {
     12     ui->setupUi(this);
     13  
     14     //连接excel
     15     excel = new QAxObject("Excel.Application");
     16     //是否可视化excel
     17     excel->dynamicCall("SetVisible(bool Visible)", true);
     18     //是否弹出警告窗口
     19     excel->setProperty("DisplayAlerts", false);
     20  
     21     //获取工作簿集合
     22     workbooks = excel->querySubObject("WorkBooks");
     23     //新建一个工作簿
     24     workbooks->dynamicCall("Add");
     25     //获取当前工作簿
     26     workbook = excel->querySubObject("ActiveWorkBook");
     27     //获取工作表格集合
     28     worksheets = workbook->querySubObject("Sheets");
     29     //获取当前工作表格1,即sheet1
     30     worksheet  = worksheets->querySubObject("Item(int)", 1);
     31 }
     32  
     33 MainWindow::~MainWindow()
     34 {
     35     delete ui;
     36 }
     37  
     38 void MainWindow::on_Write_clicked()
     39 {
     40     //产生数据
     41     for(int row = 1; row <=1000; row++) {
     42         QList<QVariant> aRowData;
     43         for(int column = 1; column <= 2; column++) {
     44             aRowData.append(QVariant(row*column));
     45         }
     46         allRowData.append(QVariant(aRowData));
     47     }
     48  
     49     //选取范围
     50     range = worksheet->querySubObject("Range(const QString)", "A1:B1000");
     51     //批量写入
     52     range->dynamicCall("SetValue(const QVariant&", QVariant(allRowData));
     53     //设置字体大小
     54     range->querySubObject("Font")->setProperty("Size", 30);
     55     //获取单元格
     56     cell = worksheet->querySubObject("Cells(int, int", 1, 1);
     57     //储存一个字符串数据至表格
     58     cell->dynamicCall("setValue(const QVariant&", QVariant("abc"));
     59     //读取单元格数据
     60     QString str = cell->dynamicCall("Value2()").toString();
     61     qDebug()<<"The value of cell is "<< str <<endl;
     62     //调整行高
     63     worksheet->querySubObject("Range(const QString&", "1:1")->setProperty("RowHeight", 60);
     64     //保存至文件注意一定要用QDir::toNativeSeparators将路径中的"/"转换为"",不然一定保存不了。
     65     workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(path));
     66     workbook->dynamicCall("Close()");
     67 }
     68  
     69 void MainWindow::on_Quit_clicked()
     70 {
     71  
     72     excel->dynamicCall("Quit()");
     73 }
     74  
     75 void MainWindow::on_read_clicked()
     76 {
     77     //获取工作簿集合
     78     workbooks = excel->querySubObject("WorkBooks");
     79     //打开一个工作簿
     80     workbooks->dynamicCall("Open(const QString&)", QDir::toNativeSeparators(path));
     81     //获取当前工作簿
     82     workbook = excel->querySubObject("ActiveWorkBook");
     83     //获取工作表格集合
     84     worksheets = workbook->querySubObject("Sheets");
     85     //获取当前工作表格1,即sheet1
     86     worksheet  = worksheets->querySubObject("Item(int)", 1);
     87  
     88     QVariant var;
     89     //读取当前工作表所有数据
     90     QAxObject *usedRange = worksheet->querySubObject("UsedRange");
     91     var = usedRange->dynamicCall("Value");
     92  
     93     QVariantList varRows = var.toList();
     94     const int rowCount = varRows.size();
     95     QVariantList rowData;
     96     for(int i = 0; i<rowCount; ++i) {
     97         rowData = varRows[i].toList();
     98         qDebug()<< rowData.at(1);
     99     }
    100     workbook->dynamicCall("Close()");
    101 }
    QAxObject* querySubObject(const char *name, QList<QVariant> &vars);

    使用上面这个函数时,要注意,虽然获取的子对象是由父对象统一管理,但他们是在父对象被析构时进行销毁的,所以如果操作单元格时,频繁获取单元格对象,需要手动del 一下。

    相关资料

    QtXlsx 的配置

    QtXlsx 使用例程

    参考资料:

    1.Qt 下快速读写Excel指南https://blog.csdn.net/czyt1988/article/details/52121360

    2.qt之读写excelhttps://blog.csdn.net/qq_35057840/article/details/54318443

    3.QT 操作 excel 教程https://www.cnblogs.com/woxinfeixiang2015/p/7677295.html

    4.QT在子线程中使用QAxWidget需要初始化COM的问题https://blog.csdn.net/a1069962325/article/details/48975179

    感谢网上提供参考资料的大神们!

  • 相关阅读:
    @PostConstruct和 @PreDestroy注解
    【JQuery】,ajax请求中,url出现[Object Object]
    筛法求素数
    母牛的故事
    将一个数拆分
    计算两个日期差
    用二分查找——查找比目标元素略大的索引
    反向输出字符串
    bootstrap table合并单元格(该版本是简单的应用)
    获取访问者IP
  • 原文地址:https://www.cnblogs.com/nxopen2018/p/12195775.html
Copyright © 2020-2023  润新知